游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

为自己搭建一个分布式IM(即时通讯)系统

  CIM(CROSSIM)一款面向开发者的IM(即时通讯)系统;同时提供了一些组件帮助开发者构建一款属于自己可水平扩展的IM。
  借助CIM你可以实现以下需求:IM即时通讯系统。适用于APP的消息推送中间件。IOT海量连接场景中的消息透传中间件。架构设计
  下面来看看具体的架构设计。
  CIM中的各个组件均采用SpringBoot构建。采用NettyGoogleProtocolBuffer构建底层通信。Redis存放各个客户端的路由信息、账号信息、在线状态等。Zookeeper用于IMserver服务的注册与发现。
  整体主要由以下模块组成:
  cimserver
  IM服务端;用于接收client连接、消息透传、消息推送等功能。
  支持集群部署。
  cimforwardroute
  消息路由服务器;用于处理消息路由、消息转发、用户登录、用户下线以及一些运营工具(获取在线用户数等)。
  cimclient
  IM客户端;给用户使用的消息终端,一个命令即可启动并向其他人发起通讯(群聊、私聊);同时内置了一些常用命令方便使用。流程图
  整体的流程也比较简单,流程图如下:
  客户端向route发起登录。登录成功从Zookeeper中选择可用IMserver返回给客户端,并保存登录、路由信息到Redis。客户端向IMserver发起长连接,成功后保持心跳。客户端下线时通过route清除状态信息。
  所以当我们自己部署时需要以下步骤:搭建基础中间件Redis、Zookeeper。部署cimserver,这是真正的IM服务器,为了满足性能需求所以支持水平扩展,只需要注册到同一个Zookeeper即可。部署cimforwardroute,这是路由服务器,所有的消息都需要经过它。由于它是无状态的,所以也可以利用Nginx代理提高可用性。cimclient真正面向用户的客户端;启动之后会自动连接IM服务器便可以在控制台收发消息了。详细设计
  接下来重点看看具体的实现,比如群聊、私聊消息如何流转;IM服务端负载均衡;服务如何注册发现等等。
  IM服务端
  先来看看服务端;主要是实现客户端上下线、消息下发等功能。
  首先是服务启动:
  由于是在SpringBoot中搭建的,所以在应用启动时需要启动Netty服务。
  从pipline中可以看出使用了Protobuf的编解码(具体报文在客户端中分析)。
  注册发现
  需要满足IM服务端的水平扩展需求,所以cimserver是需要将自身数据发布到注册中心的。
  所以在应用启动成功后需要将自身数据注册到Zookeeper中。
  最主要的目的就是将当前应用的ipcimserverporthttpport注册上去。
  上图是我在演示环境中注册的两个cimserver实例(由于在一台服务器,所以只是端口不同)。
  这样在客户端(监听这个Zookeeper节点)就能实时的知道目前可用的服务信息。
  登录
  当客户端请求cimforwardroute中的登录接口(详见下文)做完业务验证(就相当于日常登录其他网站一样)之后,客户端会向服务端发起一个长连接,如之前的流程所示:
  这时客户端会发送一个特殊报文,表明当前是登录信息。
  服务端收到后就需要将该客户端的userID和当前Channel通道关系保存起来。
  同时也缓存了用户的信息,也就是userID和用户名。
  离线
  当客户端断线后也需要将刚才缓存的信息清除掉。
  同时也需要调用route接口清除相关信息(具体接口看下文)。
  IM路由
  从架构图中可以看出,路由层是非常重要的一环;它提供了一系列的HTTP服务承接了客户端和服务端。
  目前主要是以下几个接口。
  注册接口
  由于每一个客户端都是需要登录才能使用的,所以第一步自然是注册。
  这里就设计的比较简单,直接利用Redis来存储用户信息;用户信息也只有ID和userName而已。
  只是为了方便查询在Redis中的KV又反过来存储了一份VK,这样ID和userName都必须唯一。
  登录接口
  这里的登录和cimserver中的登录不一样,具有业务性质,
  登录成功之后需要判断是否是重复登录(一个用户只能运行一个客户端)。登录成功后需要从Zookeeper中获取服务列表(cimserver)并根据某种算法选择一台服务返回给客户端。登录成功之后还需要保存路由信息,也就是当前用户分配的服务实例保存到Redis中。
  为了实现只能一个用户登录,使用了Redis中的set来保存登录信息;利用userID作为key,重复的登录就会写入失败。
  类似于Java中的HashSet,只能去重保存。
  获取一台可用的路由实例也比较简单:
  先从Zookeeper获取所有的服务实例做一个内部缓存。轮询选择一台服务器(目前只有这一种算法,后续会新增)。
  当然要获取Zookeeper中的服务实例前自然是需要监听cimserver之前注册上去的那个节点。
  具体代码如下:
  也是在应用启动之后监听Zookeeper中的路由节点,一旦发生变化就会更新内部缓存。
  这里使用的是Guava的cache,它基于ConcurrentHashMap,所以可以保证清除、新增缓存的原子性。
  群聊接口
  这是一个真正发消息的接口,实现的效果就是其中一个客户端发消息,其余所有客户端都能收到!
  流程肯定是客户端发送一条消息到服务端,服务端收到后在上文介绍的SessionSocketHolder中遍历所有Channel(通道)然后下发消息即可。
  服务端是单机倒也可以,但现在是集群设计。所以所有的客户端会根据之前的轮询算法分配到不同的cimserver实例中。
  因此就需要路由层来发挥作用了。
  路由接口收到消息后首先遍历出所有的客户端和服务实例的关系。
  路由关系在Redis中的存放如下:
  由于Redis单线程的特质,当数据量大时;一旦使用keys匹配所有cimroute:数据,会导致Redis不能处理其他请求。
  所以这里改为使用scan命令来遍历所有的cimroute:。
  接着会挨个调用每个客户端所在的服务端的HTTP接口用于推送消息。
  在cimserver中的实现如下:
  cimserver收到消息后会在内部缓存中查询该userID的通道,接着只需要发消息即可。
  在线用户接口
  这是一个辅助接口,可以查询出当前在线用户信息。
  实现也很简单,也就是查询之前保存用户登录状态的那个去重set即可。
  私聊接口
  之所以说获取在线用户是一个辅助接口,其实就是用于辅助私聊使用的。
  一般我们使用私聊的前提肯定得知道当前哪些用户在线,接着你才会知道你要和谁进行私聊。
  类似于这样:
  在我们这个场景中,私聊的前提就是需要获得在线用户的userID。
  所以私聊接口在收到消息后需要查询到接收者所在的cimserver实例信息,后续的步骤就和群聊一致了。调用接收者所在实例的HTTP接口下发信息。
  只是群聊是遍历所有的在线用户,私聊只发送一个的区别。
  下线接口
  一旦客户端下线,我们就需要将之前存放在Redis中的一些信息删除掉(路由信息、登录状态)。
  IM客户端
  客户端中的一些逻辑其实在上文已经谈到一些了。
  登录
  第一步也就是登录,需要在启动时调用route的登录接口,获得cimserver信息再创建连接。
  登录过程中route接口会判断是否为重复登录,重复登录则会直接退出程序。
  接下来是利用route接口返回的cimserver实例信息(ipport)创建连接。
  最后一步就是发送一个登录标志的信息到服务端,让它保持客户端和Channel的关系。
  自定义协议
  上文提到的一些登录报文、真正的消息报文这些其实都是在我们自定义协议中可以区别出来的。
  由于是使用GoogleProtocolBuffer编解码,所以先看看原始格式。
  其实这个协议中目前一共就三个字段:requestId可以理解为userId。reqMsg就是真正的消息。type也就是上文提到的消息类别。
  目前主要是三种类型,分别对应不同的业务:
  心跳
  为了保持客户端和服务端的连接,每隔一段时间没有发送消息都需要自动的发送心跳。
  目前的策略是每隔一分钟就是发送一个心跳包到服务端:
  这样服务端每隔一分钟没有收到业务消息时就会收到ping的心跳包:
  内置命令
  客户端也内置了一些基本命令来方便使用。
  比如输入:q就会退出客户端,同时会关闭一些系统资源。
  当输入:olu(onlineUser的简写)就会去调用route的获取所有在线用户接口。
  群聊
  群聊的使用非常简单,只需要在控制台输入消息回车即可。
  这时会去调用route的群聊接口。
  私聊
  私聊也是同理,但前提是需要触发关键字;使用userId;;消息内容这样的格式才会给某个用户发送消息,所以一般都需要先使用:olu命令获取所以在线用户才方便使用。
  消息回调
  为了满足一些定制需求,比如消息需要保存之类的。
  所以在客户端收到消息之后会回调一个接口,在这个接口中可以自定义实现。
  因此先创建了一个caller的bean,这个bean中包含了一个CustomMsgHandleListener接口,需要自行处理只需要实现此接口即可。
  自定义界面
  由于我自己不怎么会写界面,但保不准有其他大牛会写。所以客户端中的群聊、私聊、获取在线用户、消息回调等业务(以及之后的业务)都是以接口形式提供。
  也方便后面做页面集成,只需要调这些接口就行了;具体实现不用怎么关心。总结
  cim目前只是第一版,BUG多,功能少(只拉了几个群友做了测试);不过后续还会接着完善,至少这一版会给那些没有相关经验的朋友带来一些思路。
  欢迎工作一到五年的Java工程师朋友们加入Java程序员开发:721575865
  群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用没有时间来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

大陆神话电视剧有哪些近几年的大陆神话电视剧有哪些神话电视剧一直都深受古装剧小伙伴们的喜爱,很多经典的神话电视剧至今还在我们的脑海中回荡。那么,今天我们一起对大陆神话电视剧进行盘点。大陆神话电视剧有哪些?近几年热播的大陆神话电……3900元单8PIN3070显卡缩水性能降低5?山寨电源锅阅读本文之前,可以先阅读下之前的平民3070显卡评测文章:把影驰3070星曜显卡装到500元电脑上,双8P供电真的强?FPS破1000!3070显卡国产神软鲁大师跑……正规靠谱的平安好贷APP,用初心回馈广大用户近年来,市面上的贷款平台层出不穷,人们在选择的时候常常会犹豫不决,那么到底如何选择正规靠谱的借贷平台呢?平安好贷作为领域中的佼佼者,始终倡导消费者树立正确理性的借款理念,让更多……自律不过是自我欺骗,不成功的真相是行动力渡一教育每到周一,你是不是也这样给自己开批斗会,反思过去一周自己的所做所为,并立下flag,声称自己本周一定要好好努力整理了一堆待办事项,却眼睁睁都看着它们在过期里面发呆;……看苏州美景苏州是一个国际大都市,苏州园林就是美。每一个人都爱去苏州去旅游,所以我也不例外。我的家住南通市通州区金沙镇,离苏州汽车站也就108公里。从南通通州区客运站到苏州汽车北站很方便。……欢乐颂关雎尔结局会是怎样及谁演的当代剧《欢乐颂》给带来关雎尔做为家境良好的乖乖女,还是一个外企职员,多年来她按部就班,有着知礼懂事的表现,不过她见到男人开始燃烧青春火苗,最后乔欣出演的关雎尔和谢童开展恋情了。……欢乐颂曲筱绡和赵启平结局,欢乐颂曲筱绡赵医生怎么吵架了都市剧《欢乐颂》给带来同住在欢乐颂小区22楼的五个来自不同家庭和性格迥异的女孩们,她们慢慢发展从陌生到熟悉,之后她们一起成长,不过中间筱绡和赵启平产生一点小矛盾就吵架,最后经历……欢乐颂包奕凡和安迪第几集在一起,欢乐颂包奕凡爸爸谁演的欢乐颂说出来很多人不清楚,可欢乐颂剧中包奕凡和安迪到底是第几集在一起,很多网友就想去了解一下有关的故事,看欢乐颂剧情提前布局包奕凡和安迪相遇的情况,过后他们顺利在一起,但有的网……欢乐颂3官宣新五美成员,欢乐颂3拍完了吗欢乐颂3说出了来是很多网友期待,可欢乐颂3最近说出官宣新五美成员,很多网友就想去了解一下有关的故事,换人出来的效果就会很不一样,新成员有什么特色,但有的网友就不清楚欢乐颂3到底……镜双城大司命是好人吗,镜双城大司命扮演者奇幻剧《镜双城》提前安排好大司命的职责,别看他出演时间不多,却能表现有好人的情况,毕竟他的实力不多么厉害,有时候会产生头脑混乱的情况,由此发现岳跃利把大司命角色上演很不错。……扶摇结局具体怎么样,扶摇结婚到底是哪一集言情剧《扶摇》给带来出生底层的平凡少女扶摇想接触身上封印而踏上五洲历险征途,使得她遇见长孙无极发生相知到相爱,并他们共同经历磨难和对抗命运不公的情况,最后扶摇和长孙无极在一起,……斗罗大陆独孤博结局到底是什么及谁演的热血剧《斗罗大陆》给带来独孤博为亦正亦邪的性格,简直为一个老妖怪,特别他进行杀人不眨眼,不过他对自己自己特别关心,还跟唐三变成好朋友关系,最后刘交心出演的独孤博中毒身亡了。……
赘婿苏仲堪结局是什么苏家二房父子终于如愿以偿电视剧《赘婿》已经可以超前点播大结局了,那么,苏家二房苏仲堪的结局是什么呢?据悉,在大结局当中,苏家二房父子终于如愿以偿,一起来看一下详细的情况。1赘婿苏仲堪结局是什么电……锦心似玉琥珀是好人还是坏人琥珀最后的结局是什么电视剧《锦心似玉》正在热播当中,在这部剧当中,琥珀是罗十一娘身边的丫鬟,但是行为举止有些奇怪,那么,琥珀究竟是好人还是坏人呢?琥珀最后的结局是什么呢?一起来看一下具体的情况。1……围城的结局是啥,围城的作者是谁伦理剧《围城》给带来方鸿渐在欧洲留学回国后发生的人生经历,逐渐道出围在城里的人想逃出来,可城外的人想冲进去,后期故事发展结束有方鸿渐带孙柔嘉回老家,由此能感觉钱钟书把故事描写特……2018韩国最新伦理电影唯美到令人忘却现实2018韩国最新伦理电影:唯美到令人忘却现实韩国伦理情爱电影已经是产业成熟到极致的项目,它们描绘了人类最原始的欲望,是一幅鲜艳至极的画卷,它们被称为高潮的艺术。韩国……呼吸机市场缺口下,众多工业力量正在转型助力!在现代临床医学中,呼吸机作为一项能人工替代自主通气功能的有效手段,已普遍用于各种原因所致的呼吸衰竭、大手术期间的麻醉呼吸管理、呼吸支持治疗和急救复苏中,在现代医学领域内占有十分……棋魂结局怎么样,棋魂结局褚嬴回来了吗青春剧《棋魂》给发有机缘巧合下发现古老的棋盘,所认识存在千年南梁围棋第一人的褚嬴,之后他经过熏陶对围棋产生兴趣,还励志做职业围棋手,不过最后褚嬴消失回归过去,可时光和俞亮参加北……生化危机爱丽丝为什么不会被感染,生化危机爱丽丝的演员生化危机说出很多人清楚,可生化危机之中的爱丽丝到底为什么不会被感染,很多网友就想去了解一下有关的故事,看爱丽丝能产生一定的抗体,实际爱丽丝也在早期被感染过,但有的网友就不清楚生……神秘的COPAGPU,NVIDIA下一代GPU架构昭然若揭GPU发展日新月异,不仅和电脑普通用户密切相关,而且现在俨然已经成为全球驱动计算性能的重要产品,NVIDIA则是这个行业当下的佼佼者,在独立GPU份额方面是处于第二位的AMD的……特写数字江苏见证5G力量江苏移动近1000个5G项目赋能千行今年517国际电信日的主题是在充满挑战的时代加速数字化转型。在江苏,随着5G大网越织越密,越来越多的5G应用落地开花,描绘出千行百业的数字化转型之路。中国移动江苏公司(以下简称……网络红人甘露露甘露露个人资料介绍(图)甘露露照风波引热议,干露露母亲道出原由ldquo;是剧情需要所以拍摄全写真。没想到引来这么多骂声,其实我的本意是在表达放开我挡在女儿胸前的双手,让想娶她的男人用双手来接替。rd……苍天可擎致敬英雄新星仰望苍天苍茫大地,有一个情愁不断的生灵浮华人间,有一颗躁动不已的身心仰望苍穹的瞬间,你总会痴问宇宙为何这样神奇纵览世事的一刻,你总会疑问……女儿国在哪里揭晓西游记里女儿国拍摄地及历史记载女儿国在哪里揭晓:历史记载中的女儿国在这里古典名著《西游记》里有一个女儿国。那里只有女人,却没有一个男人,是无数男人们向往的国度啊!那么,你知道女儿国在哪里吗?女儿国真的……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网