Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

基于netty的异步非阻塞实时聊天(IM)服务器。

Notifications You must be signed in to change notification settings

weibingo/face2face

Repository files navigation

face2face

##基于netty的异步非阻塞实时聊天(IM)服务器。
项目整体架构如下:
image
auth服务:负责登录认证。
gate服务:负责客户端接入,也是服务器和客户端通信的媒介。
logic服务:负责处理各种业务逻辑。

为以后将服务设计为水平可扩展的服务准备,将整个服务拆分为3个进程。
实现基本功能后的目标是将每个服务设计为可水平扩展的集群,并且重点放在架构上的优化而不是逻辑功能上。

###quicksStart: 启动服务器:
1、使用intellij maven方式导入该工程,执行mvn clean compile
2、在对应模块的resources目录下配置auth、gate服redis数据库地址。
3、启动redis服务:thirdparty中附带了一个windows cmd命令行可以直接启动的redis进程。只需用cmd进入该目录,执行:redis-server.exe redis.windos.conf
4、打开intellij的debug/Run configuration根据工程路径重新配置auth logic gate服务启动项program argument的-cfg选项:(比如工程clone在了E盘code目录,那么就把logic的启动项改为-cfg E:\code\face2face\logic\src\main\resources\logic.xml),auth、gate同理。
5、依次启动logic、auth、gate服务(因服务间断线重连暂时未加入)

启动客户端:测试注册和登录功能,以及单聊功能(建议跟踪断点):
1、按照quickstart流程依次启动服务器后,再启动client模块的下的客户端(Client类),服务便会自动执行注册,登录的流程,并每隔100ms给自己发送聊天信息。

###添加自己定制的业务逻辑
1、协议流动方式介绍:客户端先连接gate,gate服务根据客户端发送的协议类型转发到auth服或者logic,到达auth或者logic之后,IO线程将消息dispatch到后端worker线程处理。
2、定制业务逻辑:
(1)只需在三个地方注册协议:protobuf模块的ParseRegistryMap,gate模块的TransferHandlerMap,最后是根据协议类型在auth模块或者logic模块的HandlerManager注册即可。注意:HandlerManager注册的是协议最终处理的业务逻辑。
(2)在protobuf模块对应.proto文件添加你自己定义的协议,执行proto.bat即可生成对应pb文件
###压力测试
1、client模块的AIOClient提供了进行压力测试的方法,可以修改启动客户端线程的数量AIOClient.aioClientNum,以及每秒向服务器发送的协议的频率AIOClient.frequency进行压力测试。
2、CPU 8核E3-1231v3, 每个服务分配1G的堆内存,启动3000个客户端,不停发送单聊协议,发现auth、logic、gate服务占用的cpu非常低,客户端能够立即收到相应。压力主要集中在创建客户端的机器上,3000个客户端大约1G内存,cpu接近100%
###水平扩展的思路,以及异步非阻塞服务的编写方法
####gate服务的水平扩展思想:(实现中)
我们可以为每一个gate服务指定一个id,同时auth服务记录map<gateid, map<netid, userid>>的二级映射。
这样,我们可以通过任一个用户的netid或者userid轻松的查询到改用户连接所属的gateid,从而将消息转发到正确的网关服务。
同时,为实现客户端接入的负载均衡,可以在最外层接入nginx负载均衡服务器,client首先通过http请求nginx服务,获得分配的gate地址。
####logic服务的水平扩展思想:(实现中)
一种中心化的思想:还需要搭建一个sync服务,用来同步logic节点的信息。当gate接收到消息时,简单的做法是根据userid做一个hash,分配到指定logic上。

About

基于netty的异步非阻塞实时聊天(IM)服务器。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 98.0%
  • Protocol Buffer 1.6%
  • Batchfile 0.4%

AltStyle によって変換されたページ (->オリジナル) /