tim-server
tim-server启动类实现CommandLineRunner接口,重写run()方法
run()方法开启一个线程,创建zk持久父节点,创建临时顺序子节点,将netty-server信息写入
1.1 用户登录
1.2 gateway向认证授权中心请求token
1.3 从zookeeper节点里挑选一台netty服务器(策略模式实现,轮询策略通过AtomicLong自增取模,随机策略,)
1.4 将<user_id,netty_ip>路由信息存储在redis
1.5 将token和netty_ip返回给用户
1.6 用户和对应的netty服务器建立连接
1.7 netty服务将客户端的channel保存
2.1 user1给user2发消息,gateway校验token
2.2 从redis查询user2对应的netty_ip
2.3 netty服务根据netty_ip得到netty服务器对象
2.4 通过netty服务器对象和user2得到客户端channel,给user2发消息
空闲检测
客户端15s没有给服务端发消息,会触发写空闲事件,给服务端发送一次心跳
服务端20s没有收到客户端的消息,会触发读空闲事件,如果超过一定时间没有收到心跳包,就删除channel,防止OOM
断线重连
//netty服务器挂了,客户端channel会触发channelInactive事件
@Override
public void channelInactive(ChannelHandlerContext ctx){//用户主动断开,不执行重连逻辑if(shutDownMsg.checkStatus()){return;}//开启一个定时线程,任务是重新通过负载均衡在zk选择一个netty服务器,每10s重连一次scheduledExecutorService.scheduleAtFixedRate(new ReconnectJob(ctx, 0, 10, TimeUnit.SECOND));
}
拆包粘包
自定义包结构 编码器 解码器
可靠性
3.1 客户端返回接收消息成功响应
3.2 发送到消息队列
3.3