基于Netty和Kafka的即时通讯系统设计
发布时间:2023/06/26 阅读数:
基于Netty和Kafka的即时通讯系统设计
方钰敏 ,邬依林, 徐海蛟 ,符水梅, 区德辉
(广东第二师范学院计算机学院 广东 广州 510303)
[摘 要] 随着互联网的普及与网络的发展,即时通讯成为人们生活主流的通讯方式。目前广泛使用的个人即时通信技术在很多方面不适合在学校的教学环境中使用,设计本系统的目的是给校园提供一个即时系统的通用代码样本,校园接入方根据自身业务对系统进行轻微改造,便能轻松接入、升级学校即时通讯系统。本系统采用Netty作为网络通讯框架,并建立在高效的Reacotr模型下,系统还利用了当今流行的微服务架构SpringCloud,同时采用Websocket协议作为通讯协议以加速设计与实现学校即时通讯系统。
关键词 即时通信;Netty;SpringCloud;WebSocket
[基金项目]2020年国家级大学生创新创业训练计划项目“基于区块链及AI技术的中小学生综合素质评价征信系统” (No.202014278009);2020年校级教学质量与教学改革工程项目“大数据处理技术”在线开放课程(No.2020zxkc05);2021年广东省科技创新战略专项资金(攀登计划专项资金No.pdjh2021b0366)资助。
[作者简介]方钰敏,女,(2000-),汉族,广东阳春人,学士,广东第二师范学院计算机学院,主要研究领域为Java技术、软件工程;徐海蛟,男,(1972-),汉族,湖北武汉人,博士,广东第二师范学院计算机学院,高级工程师(通信作者),主要研究领域为深度学习、软件工程。
[中图法分类号] TP399 [文献识别码]J
即时通讯(Instant Messaging,简称IM)指即时发送和接收互联网消息,是目前互联网上最为流行的通讯方式,各种各样的即时通讯软件层出不穷,通讯服务功能也越来越丰富。不容置疑,IM系统正行驶在互联网这条信息高速公路上。 随着信息技术的发展,计算机和网络已经成为学校不可缺少的学校教学辅助工具,但据调查所知,目前很多IM系统由于系统架构老化,以及选择的通讯协议落后等原因,已经无法再适应这个社会的发展,故也不适合在学校的教学环境中应用。因此本文会通过进一步对IM技术研究,并基于目前流行的微服务架构来开发IM系统,使系统能面对当今各种高并发的场景,以提高学校的教学和管理效率。
2即时通讯系统设计与实现
2.1架构设计
由于IM系统相比于其他系统的并发量高,所以对该系统进行微服务化的拆分,实现微服务的架构。将系统进行拆分后,会出现多个服务,在架构层面上,使用了配置中心,实现统一、动态地管理配置,减少开发运维的难度与系统代码的复杂度。 对于微服务的安全性的管理一直业内的一个难题,系统设计了一个认证服务,提供access_token给客户端调取服务接口,并在API网关进行权限验证,提高系统的安全性。
图1系统架构图
综上所述,系统的架构设计如图1所示。
2.2 模块设计
系统设计主要由图2所示的功能模块组成,主要分为5个模块,分别是用户中心,消息中心,认证中心,通用服务,API网关模块。其中最重要的就是消息中心模块。
图2 功能模块图
用户功能是一个系统中最基础的功能。本系统将用户功能独立成一个新的系统,来提供服务。为了实现用户系统的高可用,本系统将用户系统进行集群部署,并且进行注册中心注册。
用户中心主要有4个功能。
1、用户注册:本系统要求用户注册时提供用户名,密码,邮箱这3个关键信息。在系统后台拿到用户的用户名时,会判断用户名和邮箱是否存在,倘若不存在,会对密码进行加密处理,并对一些字段(昵称&头像)进行默认处理,紧接着向数据库插入用户信息,返回注册结果,否则的话返回用户名/邮箱已被注册。
2、用户登录:
用户登录时,可以使用邮箱或者用户名登录,登录时会进行用户是否存在与用户密码是否正确判断,如果通过了一系列的验证,会向认证中心请求获取token,并将结果返回给客户端,否则会扔出密码错误或用户不存在的错误。
3、用户信息查询
用户信息查询在本系统中扮演了一个不可或缺的角色,用户中心实现了可通过用户id或用户名或邮箱作为条件来查询用户信息。
4、用户退出登录
用户退出登录的逻辑非常简单,只需要在Redis上删除对应的token值即可。
2.3.2消息中心的设计与实现
本系统的消息中心架构如图3所示,分为两个核心模块,im-connection与im-server。im-connection是与客户端建立起来的连接的接入服务。它需要完成的功能包括连接保持,协议解析,session维护和消息推送。Im-server是消息中心的业务处理大脑中枢,它需要负责大部分的业务逻辑,比如消息存储,未读数的变更,更新最近联系人等等。Mysql与Redis是本系统的Db存储方案,它会帮我们存储消息内容,联系人等等[1]。
图3 im-系统架构图
2.3.3认证中心的设计与实现
本系统使用到了Oauth2.0协议中的密码模式来生成token。首先用户在登录时,会在用户中心进行一系列的验证通过后,会去认证中心认证用户。如果认证通过,那么认证中心会生成Jwt。Jwt包含多个字段,其中包括:1.access_token 2.jti 3.refresh_token 4.expires_in这个4个关键信息。Jwt会在两个地方存储[2],如图4所示,第一个是在分布式缓存Redis中存储,其中key为jti, value为access_token,过期时间为expires_in。第二是存储在客户端缓存中。用户请求服务接口时,携带jwt里的access_token。
2.3.4配置中心的设计与实现
本系统构建了一个配置中心,通过配置中心,控制多个微服务的配置,并实时的更新到每个微服务中去。为了实现配置中心,此次使用了SpringConfig,Kafka,GitHub作为主要的技术栈。
我们构建一个配置中心,来监听GitHub上配置是否发生了变化,如果发生了变化,那么Config-server会通过一个bus(本系统采用了Kafka作为Bus),将修改的配置信息传递到对应的微服务[3],如图4所示。
图4 配置中心架构图
2.3.5 Api网关的设计与实现
本系统构建了一个api官网,技术选型是SpringCloud的zuul组件。所有用户请求都会首先进入通过api网关,api网关再把请求路由到各个系统中去,在zuul中,我们需要做的就是对请求进行路由和在网关进行统一的token校验工作。如果token出错,则重定向到登录页面。同时系统不会对用户登录和注册的URL进行token安全校验[4]。
2.4具体实现
为了简化网络IO开发流程使用Netty框架。网络IO模型选用Rector模式,即一组boos线程进行连接操作,一组woker线程进行业务处理操作。与此同时,Netty提供责任链模式的处理器,通过添加已有的处理器和自行实现处理器,能够对tcp连接信息进行简单的处理。[5]
根据对消息中心的消息设计,我们可以抽象成几点:1.ack 2.心跳 3.上线消息 4.发送消息 5.消息查询 6.消息未读查询。为了方便针对不同类型的进行处理,将以上的业务抽象成type,根据type不同制定不同的类型处理器,对业务进行处理。通过构建一个Processor处理器接口,采用策略模式,处理不同的业务。如图4所示。
根据架构图,对IM系统进行业务和网关解耦,为了方便通信与负载均衡,使用了Eureka作为注册中心,网关层调用业务接口,实现业务处理。而这里用到SpringCloud的RPC框架Fegin,进行远程调用服务。[6] 在IM-server中,关于消息推送的逻辑,需要存储消息内容,发送方和接受方两者的索引,同时更新两者的最近联系人,最重要的是需要将消息用kafka进行异步地推送到网关层中,最后把处理返回至网关层。网关层接受到来自IM-server的消息的推送,会根据接受者的用户id找到对应的长连接,进行消息的推送[7]。值得一提的是,本系统会对tid进行递增操作,这是为了帮助客户端去重。 每一条推送出去的消息都无法保证是否成功,所以要对进行ack应答操作。将推送出去的消息,放到待ack应答列表,如果收到ack,则把消息移除待ack列表,否则进行消息重推操作,这里使用ConcurrentHashMap来保存待ack的消息,然后未收到ack包,那么使用定时任务线程池里的线程进行重推。[8] 查询消息的业务逻辑需要对内容表和索引表进行内容合并封装,然后对总未读与未读数进行变更操作。对于查询最近联系人的逻辑,需要根据id查询最近联系人表的信息,然后对用户消息与最近联系人信息进行封装返回。
3系统测试
系统采用白盒测试与黑盒测试两种测试模式。
1. 白盒测试,为了充分的测试系统,本系统采用白盒测试中的单元测试与集成测试。 1)单元测试,本系统是MVC模式下的系统,针对每一个service,系统编写了大量的单元测试,测试每一个service方法功能是否可用,如以下代码所示。
public class UserTests {
@Autowired
private UserService userService;
@Test
public void addUser() {
User user = new User();
user.setEmail("654321@qq.com");
user.setUsername("cl");
user.setPassword("******");
int result = userService.insert(user);
assert result == 1;
}
(2)集成测试。为了测试系统整体的功能,本系统使用Postman作为Http接口测试工具。 由于Postman无法支持Webscoket协议,所以本系统也使用了Jmeter作为本系统的测试工具。2. 黑盒测试。本系统为了进行黑盒测试,开发了一套简单的UI作为黑盒测试的样本。由于本系统的初衷是开发服务端代码供给企业使用,而客户端代码由企业自行开发。所以本系统的黑盒测试主要目的是测试系统与浏览器的兼容性,故不再赘述。
回顾本系统的研发过程,从微服务架构与各种中间件的搭建,Outh2.0协议的学习,数据库表的设计,Netty框架的学习使用,IM相关的保证消息实时性,可靠性,一致性,安全性的设计与实现等完成了预期的功能,但仍存在很多问题。比如当用户设备后台运行时间过长,会被后台杀掉,而这将导致没法将消息实时推送给用户。本系统暂时只支持文本传输,没法很好的支持流媒体的传输功能。而良好的支持多端漫游功能,消息同时推送到多端则有待进一步深入研究。
[参考文献]
[1] 夏树立. 基于对象关系映射技术的数据持久层的研究与应用[D]. 华南理工大学,2011.
[2] 杨小娇. 轻量级高并发Web服务器的研究与实现[D]. 南京邮电大学,2014.
[3] 张艺. 基于WebSocket的即时通信系统研究与实现[J]. 软件. 2015(03)
[4] 茆玉庭. 基于Node.js和WebSocket的即时通信系统的设计与实现[D].南京邮电大学,2018.
[5] 张艳军,王剑,叶晓平,李培远. 基于Netty框架的高性能RPC通信系统的设计与实现[J]. 工业控制计算机. 2016(05)
[6] 任汉秋. 基于Netty多租户的企业即时通讯系统的设计与实现[D]. 哈尔滨工业大学,2019.
[7] 傅瑶. Java即时通讯系统程序的设计与实现[D]. 吉林大学 2015.
[8] 王全彬. 基于Java的网络即时通讯系统的设计与实现[D]. 电子科技大学,2007.
Design of instant messaging system based on Netty and Kafka
FANG Yumin, WU Yilin, XU Haijiao, FU Shuimei,OU Dehui
(School of Computer Science, Guangdong University of Education, Guangzhou 510303)
Abstract With the popularity of the Internet and the development of the network, IM communication has become the main way of communication in people's life. At present, the widely used personal instant messaging technology is not suitable for use in the school teaching environment in many aspects. The purpose of designing this system is to provide the campus with a general code sample of IM system. The campus access party can easily access and upgrade the IM system by slightly transforming the system according to its own business.This system uses netty as the network communication framework, and is based on the efficient reacotr model. The system also uses the popular micro service architecture spring cloud, at the same time, the system uses websocket protocol as the communication protocol.
Keywords IM;Netty;SpringCloud;WebSocket