netty框架的使用 websocket
websocket的连接
进入直播间之后,前端发送请求ImConfig 拿到nacos host地址以及token,拼接一个url 例:web://host/token/userId/roomId
传送给后端建立连接,后端会在服务启动类获取im的服务注册ip和暴露端口并存入本地缓存,随后进行握手接入websocket
并对传来的数据(url)进行分割取出数据进行校验传入下一个handler中
在loginhandler中则保存相关的channel对象信息并回写客户端,将当前用户im的服务注册ip进行绑定,发送Rocketmq消息给living provider模块。
living provider模块接受消息之后则会将roomId与appid作为key,userid作为值存入redis中,以此实现当用户进入直播间后,与直播间进行绑定。
退出直播间或掉线则会触发channelInactive方法,与上面也是差不多的流程,最后删除key绑定的userId即可
直播间聊天功能的实现
进入msgHandler中得到前端传来的聊天数据传入doMsgHandler中通过code来判断进入哪一个处理程序中
进入Biz处理程序然后发送消息给msg模块,由于是1个人发送n个人接受的模式那么就得先去redis内拿到所有该直播间内用户的id
然后传入下一个方法进入router层batchSendMsg方法中
批量从redis中取出之前登录时每个用户绑定的ip,并按ip进行分组放入map中,将ip地址放入RpcContext进行保存,将连接同一ip地址的imMsgBody组装到同一个list集合中,然后统一进行发送
但此时会进入ClusterInvoker中,先取出之前RpcContext中存储的ip与rpc服务的ip进行匹配调用指定机器的方法
此时又回到了im服务层对消息进行一条一条的通知,并发送ack消息,先把ack消息存入redis中,然后发送延迟消息进行确认并删除redis中的ack消息