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

实战如何亲手搭建一个分布式即时通

  目录结构:
  本文较长,高能预警;带好瓜子板凳。
  于是在之前的基础上我完善了一些内容,先来看看这个项目的介绍吧:
  CIM(CROSSIM)一款面向开发者的IM(即时通讯)系统;同时提供了一些组件帮助开发者构建一款属于自己可水平扩展的IM。
  借助CIM你可以实现以下需求:
  IM即时通讯系统。
  适用于APP的消息推送中间件。
  IOT海量连接场景中的消息透传中间件。
  完整源码托管在GitHub:https:github。comcrossoverJiecim
  演示
  本次主要涉及到IM即时通讯,所以特地录了两段视频演示(群聊、私聊)。
  点击下方链接可以查看视频版Demo。
  群聊:
  私聊:
  架构设计
  下面来看看具体的架构设计。
  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获取所有在线用户信息
  :all获取所有命令
  :更多命令正在开发中
  比如输入:q就会退出客户端,同时会关闭一些系统资源。
  当输入:olu(onlineUser的简写)就会去调用route的获取所有在线用户接口。
  群聊
  群聊的使用非常简单,只需要在控制台输入消息回车即可。
  这时会去调用route的群聊接口。
  私聊
  私聊也是同理,但前提是需要触发关键字;使用userId;;消息内容这样的格式才会给某个用户发送消息,所以一般都需要先使用:olu命令获取所以在线用户才方便使用。
  消息回调
  为了满足一些定制需求,比如消息需要保存之类的。
  所以在客户端收到消息之后会回调一个接口,在这个接口中可以自定义实现。
  因此先创建了一个caller的bean,这个bean中包含了一个CustomMsgHandleListener接口,需要自行处理只需要实现此接口即可。
  自定义界面
  由于我自己不怎么会写界面,但保不准有其他大牛会写。所以客户端中的群聊、私聊、获取在线用户、消息回调等业务(以及之后的业务)都是以接口形式提供。
  也方便后面做页面集成,只需要调这些接口就行了;具体实现不用怎么关心。
  总结
  cim目前只是第一版,BUG多,功能少(只拉了几个群友做了测试);不过后续还会接着完善,至少这一版会给那些没有相关经验的朋友带来一些思路。
  后续计划:
  完整源码:
  https:github。comcrossoverJiecim

来月经前肚子胀痛是怎么回事几个因素你要了解来月经前肚子胀痛是很多女生都会面临的事情,很多时候这都属于正常的现象,但也有可能是因为一些身体疾病才引起的。所以,我们应该做好症状的分析,及时治疗。一、精神紧张很多……太古神王圣君是谁莫倾城是圣君的女儿吗《太古神王》剧中莫倾城的身世也是非常的扑朔迷离,在最新的剧情和预告中,暗夜族偷到莫家一直珍藏的一幅画,画上的人和莫倾城很像,但这个人到底是莫倾城还是莫倾城的母亲却还不好说,而顾……副乳是什么五大说法让你轻轻松松地了解它相信大家对于副乳这个词语,应该是比较陌生的。副乳,是一种先天性的疾病,一般是采用手术切除来治疗。因此,副乳是什么呢?接下来跟小编一起来了解一下吧!来源:站酷现在随着……社交电商时代产品如何更值钱最近,小罐茶的创始人杜国楹火了。提起杜国楹,很多人不知道,但他做过的产品你肯定知道,背背佳、好记星、E人E本、8848钛金手机、小罐茶。有网友说,你上学用背背佳矫正坐姿,……经期炖什么汤喝比较好为你推荐几种重要配方女生在来月经期间需要多注意身体的调理,很多补汤都可以达到我们想要的目的,多喝补汤对于身体的恢复有很大的帮助。所以,女生们可以多喝一些有营养的补汤。一、生姜红枣汤女生……百年梦幻连载七(七)龙湾新区的建设正热火朝天的进行着。大幅标语悬挂在建设工地:创一流速度保一流质量建一流工程。;创老龙湾新颜给老百姓笑颜。;保工期保质量争创全省样板工程许多……月经期可以喝乌鸡汤吗正确滋补你得这样做每月的月经期对大部分女生来说都是特别难熬的,所以很多女生都会选择在这个时候饮用一些滋补的汤品,来缓解身体的不适感。那么,在月经期间应该喝什么汤才合适呢?对于大部分女生来说……15岁可以喝荷叶茶吗这样做有什么功效不少的年轻人都想拥有健康完美的身材,很多人在青春期就因为吃的太好而有些肥胖,所以都想尝试各种手段去减肥。对于十五岁的孩子是否可以喝荷叶茶,下面就来说一说吧。每个人都想拥有……口腔溃疡吃什么药让你轻松摆脱它的困扰口腔溃疡长在嘴巴里面虽然说不会影响美观,但是是会让人非常难受的,吃饭或者是说话都会受到影响,那么,口腔溃疡吃什么药呢?让你轻松摆脱它的困扰。口腔溃疡是会让人非常苦恼的,相……西瓜和桃子能一起吃吗具体原因你需要知道夏天快到了,很多人都喜欢吃水果,特别是西瓜和桃子,因为它们这两种食物的水分特别的多,那么西瓜和桃子可以一起吃吗?我们一起来了解一下西瓜和桃子能不能一起吃吧。来源:图虫作者……女生脸颊凹陷是肾气不足这些方法还你青春靓丽正值青春的年华却有脸颊凹陷的问题?还是由于是肾气不足而导致的情况并不少见,很多女生的脸颊都有一定程度的凹陷。这并不是脸小的象征,而是由于肾气不足导致的。来源:图虫作者:5……眼角膜损伤会失明吗及时了解避免尴尬眼角膜对于我们每个人来说都是一个非常重要的器官,如果眼角膜损伤之后我们不及时的进行治疗,眼睛就会有可能会面临失明的危险。今天,我们就来一起了解下。来源:图虫作者:9954……
郭沫若龙战与鸡鸣原文欣赏龙战与鸡鸣昨晚的一阵骤雨,使这炼狱般的山城,突然化为了清凉境地。在敌机连续不断地盲目轰炸,尤其是为纪念七七特别流了几天热汗之后,得到了这个境地,加倍地领略着苦尽甘来之感。……红豆适合孕妇补铁吗红豆是营养丰富的食物,对人的身体很有帮助,特别是对孕妇。那么红豆适合孕妇补铁吗?下面本站就来讲讲相关的孕妇饮食小知识。红豆是很好的补铁食物,建议孕妇们经常食用。红豆可以起……冰箱不制冷是插座的原因吗我们都知道,冰箱主要是用来存放食物的,它可以起到很不错的保鲜作用,防止食物变质坏掉,很多人都会经常用冰箱。有些人在用冰箱的时候会出现不制冷的情况,那么冰箱不制冷和插座有关系吗?……约会必备发型精选清纯可爱气质加分这款简单温婉气质的低马尾扎发很显淑女的气质,齐刘海很有修颜的效果,蓬松的卷发勾勒出无比的时尚美感,时尚的棕色染发更显女人的知性成熟美。这款偏分长发端庄优雅,落落大方,侧分……做一个聪明的教师读书笔记利用空余时间,细细研读了《做一个聪明的教师》这本书,读后真有一种相见恨晚之感。这本书从教师的思维方式入手,通过90个案例讨论教师思维方式对教育教学的影响,帮助教师认识自我。这本……走高叠加严监管中小财险生死一线短期内,财险市场难以摆脱寡头竞争的局面,行业CR3的变动趋势有力证明了这一点。财险CR3从2008年的62稳步增长到了2020年的72。76,再加上汽车保有量增量下滑到个位数,……客户购买你的产品时你卖得越多越好越要提高客户的忠客户购买你的产品时,你卖得越多越好越要提高客户的忠诚度。每次购买量的重要性要比购买频率多三倍多。决定客户每年购物总量的是他们的购物次数和每次购物的数量,所以在市场上并存两种策略……谁能做性工具测试师国外因为有人经常问到关于如何购买和选择性工具的问题,于是就有这样一个职业性工具测试师,那么什么样的人应该有能力当一名性工具测试师呢?那就是愿意和能够尝试、体验、总结、提供分析报……座标造句用座标造句大全【座标zubio】:1。即坐标。确定平面上或空间中一点位置的有次序的一组数。1。本文介绍利用座标旋转计算机原理制成的“微程序数控键合机”。2。免费开放的桐城南路公厕……心源性休克的诊断标准心源性休克是指由于心脏功能极度减退,导致心输出量显著减少并引起严重的急性周围循环衰竭的一组综合征。心源性休克是心泵衰竭的极期表现,那么接下来小编为您介绍心源性休克的诊断标准。……让她不忍拒绝的经典爱情短信为了善良高尚的爱,我甘愿让沙漠把生命掩埋,也许你永远不会理解,这是一个真正的男子用青春把枫叶摘来,只为在这个秋天映红你的脸颊!我对你的爱永远荡漾在爱河:我划桨,你把舵,我……解密淘宝童装推广方法一、制定调整策略1)运营思路A主推宝贝测试接手时候的销量很低,几乎都是新品,所以只能早早的预热了毛衣和连衣裙等秋冬款宝贝,前期由于没什么销量所以都是采取压力测……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网