Netty+springboot开发即时通讯系统笔记(二)

这篇具有很好参考价值的文章主要介绍了Netty+springboot开发即时通讯系统笔记(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基础业务模块开发

1.数据库设计,在csdn上搞定了

2.用户单表增删改查。

全局异常处理:RestControllerAdvice在类上,ExceptionHandler在方法上,里面有个value值,可以写java提供的异常以及自定义异常

3.好友:

弱好友关系,关注粉丝

强好友关系:qq,正常数据库中写一条就可以了,但是查询的时候很麻烦,所以需要写两条查询合并到一起。所以这里采用写两份的方法,A加B好友。插入from A,to B和from B ,to A ,这样查询就只需要一条语句了。

校验好友关系:1双方都添加了2from方删除3to方删除4双方删除

Netty+springboot开发即时通讯系统笔记(二),通讯系统,spring boot,笔记,后端

查询语句:先查出自己的好友列表信息,再以toid为自己的id查出对称的好友列表信息,用inner join连接起来,on条件是a.fromid=b.toid and b.fromid=a.toid。用这两份关联数据作为from条件,查出不同的状态。

select a.fromId,a.toId,(

case

 when a.status =1 and b.status =1 then 1

when a.status !=1 and b.status =1 then 2

when a.status =1 and b.status !=1 then 3

when a.status !=1 and b.status !=1 then 4

end

)as status

from(select from_id as fromId,to_id as toId,if(status=1,1,0)as status from im_friendship where from_id="user1" and to_id in('user2',"user3","user4")) as a
inner join
(select from_id as fromId,to_id as toId,if(status=1,1,0)as status from im_friendship where to_id="user1" and from_id in('user2',"user3","user4"))  as b 
on a.fromId=b.toId and a.toId=b.fromId

不是好友的就做特殊处理,在查询之前用stream流给所有校验对象封装成一个map,然后合并这个和另一个map,不是好友的状态就返回0.

 Map<String, Integer> result = req.getToIds().stream().collect(Collectors.toMap(Function.identity(), s -> 0));
//将 req.getToIds() 返回的列表元素转化为 Map 对象,其中列表元素作为键(key),对应的值(value)都设置为0。

tcp网关

1.登录与登出

用户session存在channels的map集合中作为key,channel作为值。

private static final Map<UserClientDto, NioSocketChannel> CHANNELS = new ConcurrentHashMap<>();

登录存入redis里,用map,key存不同的端pc,web,value存用户信息。同时存入channels中。

   RMap<String, String> map = redissonClient.getMap(msg.getMessageHeader().getAppId() + Constants.RedisConstants.UserSessionConstants + loginPack.getUserId());
            map.put(msg.getMessageHeader().getClientType()+":" + msg.getMessageHeader().getImei()
                    ,JSONObject.toJSONString(userSession));

登出就删除session以及redis

2.心跳检测

写一个HeartBeatHandler 继承ChannelInboundHandlerAdapter,重写userEventTriggered用户自定义事件,evt转为CustomEvent,然后可以判断读写的空闲状态以实现心跳检测。

超时给用户状态改为离线。

3.rabbitmq

tcp服务调用逻辑层服务,可以使用http,rpc,mq,选择mq最大的优点是可以进行限流,

  1. 消息(Message):消息是 RabbitMQ 中的基本数据单元,它由消息体和消息属性组成。消息体是要传递的实际数据,而消息属性包含一些元数据,如消息的路由键、优先级等。
  2. 交换机(Exchange):交换机是消息的接收和分发中心。生产者将消息发布到交换机,而交换机根据指定的路由键将消息路由到一个或多个队列。
  3. 队列(Queue):队列是消息的存储和传递载体。消费者从队列中接收消息,并按照一定的规则进行处理。
  4. 绑定(Binding):绑定是交换机和队列之间的关联关系。它定义了交换机如何将消息路由到队列。

工作模式

  1. 简单模式(Simple Mode):也称为点对点模式(Point-to-Point),是最简单的工作模式。在简单模式中,一个生产者将消息发送到一个队列,一个消费者从该队列中接收并处理消息。每个消息只能被一个消费者消费。
  2. 工作队列模式(Work Queue Mode):也称为任务队列模式(Task Queue),用于在多个消费者之间共享任务。在工作队列模式中,一个生产者将消息发送到一个队列,多个消费者从该队列中竞争接收消息,并进行处理。每个消息只能被一个消费者消费。
  3. 发布/订阅模式(Publish/Subscribe Mode):用于将消息广播给多个消费者。在发布/订阅模式中,一个生产者将消息发送到一个交换机,交换机将消息广播给绑定到它的所有队列。每个消费者都会从自己的队列中接收消息并进行处理。
  4. 主题模式(Topic Mode):主题模式是发布/订阅模式的扩展,它允许消费者根据消息的主题进行选择性订阅。在主题模式中,一个生产者将消息发送到一个交换机,并指定一个主题作为消息的路由键。消费者可以使用通配符表达式来定义自己感兴趣的主题,交换机将消息根据主题进行匹配和路由。
  5. RPC 模式(Remote Procedure Call Mode):RPC 模式用于实现分布式系统中的远程调用。在 RPC 模式中,客户端发送请求消息到一个队列,服务端接收并处理请求,并将结果返回给客户端。客户端等待并接收服务端的响应消息。

4.注册tcp服务到zookeeper

5.服务改造

分布式netty,每个用户所在的netty可能不在一个节点上,他们之间的通讯怎么解决呢?

1.广播(发布-订阅),A给B发送消息,A去给所有节点发送一份,找到B所在的节点,完成通讯。

2.一致性hash,给每个用户session得到哈希值对应的节点,A给B发消息就可以先计算出B的节点,然后通过mq投递消息。

3.路由表,在redis中记录一张表,然后发消息的时候在这张表里查。

6.多端登录

单平台登录,2,3,多平台登录

所以登录需要 userID(用户id),appId(应用id),clientType(web,安卓,ios),imei(标识唯一的设备)。

1 只允许一端在线,手机*/电脑/web* 踢掉除了本client+imel的设备

2 允许手机*/电脑的一台设备 *+ web在线 踢掉除了本client+imel的非web*端设备*

3 允许手机和电脑单设备 + web 同时在线 踢掉非本client+imel的同端设备

4 允许所有端多设备登录 不踢任何设备

使用redis的发布订阅模式,上线后把信息推送给所有netty服务端,接收到之后就给他根据不同的登录策略做处理。文章来源地址https://www.toymoban.com/news/detail-653350.html

到了这里,关于Netty+springboot开发即时通讯系统笔记(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 即时通讯系统为什么选择GaussDB(for Redis)?

    摘要:如果你需要一款稳定可靠的高性能企业级KV数据库,不妨试试GaussDB(for Redis)。 每当网络上爆出热点新闻,混迹于各个社交媒体的小伙伴们全都开启了讨论模式。一条消息的产生是如何在群聊中传递的呢?让我们一起来探索即时通讯系统(IM)的原理。 当你在群聊“相亲相

    2023年04月21日
    浏览(40)
  • 即时通讯独立系统源码包含Android 、iOS、PC

    demo软件园每日更新资源,请看到最后就能获取你想要的: 1.经典版哇呼星聊即时通讯独立系统源码 包含Android 、iOS、PC 自带教程 哇呼星聊即时通讯系统源码 Android+iOS+PC三端 附教程 服务器最低配置4H4G 这套安装跟shiku一样 1.安装宝塔,只安装Nginx,其他不用安装,不用创建站

    2024年02月01日
    浏览(40)
  • 聊天室即时通讯系统源码 类似微信的H5聊天系统APP源码 ThinkPHP内核

    前端: 用Dcloud 的 uni-app全系,基于vue.js和微信小程序开发模式。 目前支持APP(android、ios)、H5、微信小程序、支付宝小程序5端。 在特定场景可以用weex进行原生渲染。 APP用的是Dcloud 公司的H5+进行原生接口调用。 后端: php 7.2.x Thinkphp 5.1作HTTP服务(nginx)。 getWanWork作socket服务

    2024年02月08日
    浏览(47)
  • 聊天、会议、多媒体一体化:多平台支持的即时通讯系统 | 开源日报 No.44

    Stars: 28.2k License: Apache-2.0 Gitness 是一个建立在 Drone 之上的新型开源开发者平台,具备代码托管和流水线功能。它提供了以下核心优势: 轻量级、超快速的代码托管和持续集成服务 支持 Docker 容器化部署 可以在本地环境中构建和运行系统,无需依赖 Docker 容器 提供完整的用户

    2024年02月07日
    浏览(73)
  • 开源im聊天系统源码全套+php即时通讯源码带直播红包系统(uniapp/pc/app/h5四端)

    随着移动互联网的迅猛发展,即时通讯(Instant Messaging,简称IM)已经成为现代社交生活中不可或缺的一部分。无论是个人还是企业,都需要一种高效、安全、稳定的即时通讯方式来满足实时沟通的需求。因此,IM源码的开发变得越来越重要,它为我们提供了构建现代化即时通

    2024年02月03日
    浏览(57)
  • uniapp即时通讯源码/im聊天系统源码开源(app+h5+小程序+pc四端)

    IM即时通讯源码是现今互联网行业中成熟、稳定和高效的即时通讯解决方案之一,其源码可以提供给开发者进行二次开发和定制化,实现更加个性化的即时通讯功能。本文将围绕IM即时通讯源码进行深入探讨,包括其优势、应用场景以及二次开发和定制化等方面的内容。 源码

    2024年02月04日
    浏览(45)
  • IM即时通讯源码/im源码基于uniapp框架从0开始设计搭建在线聊天系统

    随着人社交产品的不断发展,即时通讯聊天这门技术也越来越重要,很多人都开启了学习通讯技术,本文就介绍了即时通讯的基础内容。 在开始设计和搭建聊天系统之前,需要确定所需技术栈。常用的技术栈包括前端、后端和数据库。例如,前端可以选择uni-app,后端可以选

    2024年02月04日
    浏览(57)
  • 自己手写了一套高性能分布式IM即时通讯系统,出去面试嘎嘎聊,都把面试官整不会了!

    沉淀,成长,突破,帮助他人,成就自我。 大家好,我是冰河~~ 分布式IM即时通讯系统本质上就是对线上聊天和用户的管理,针对聊天本身来说,最核心的需求就是: 发送文字、图片、文件、语音、视频、消息缓存、消息存储、消息未读、已读、撤回,离线消息、历史消息、

    2024年01月24日
    浏览(49)
  • PHP脉聊交友系统网站源码,可通过广告变现社交在线聊天交友即时通讯APP源码,附带视频搭建教程

    探索全新社交体验:一站式PHP交友网站解决方案 🌐  全球化交友,无界沟通 在数字化的浪潮下,社交已不再受地域限制。我们的PHP交友网站不仅支持多国语言,还配备了即时翻译功能,让您轻松跨越语言障碍,与全球各地的朋友畅聊无阻。 💬  即时通讯,沟通无延迟 无论

    2024年02月21日
    浏览(50)
  • java+springboot+mysql校园通讯录管理系统

    项目介绍: 使用java+springboot+mysql开发的校园通讯录管理系统,系统包含超级管理员、管理员、用户角色,功能如下: 超级管理员:管理员管理;部门管理;用户管理;留言管理;公告管理;个人信息修改;密码修改。 管理员:比超级管理员少了一个管理员管理模块;其他的

    2024年02月13日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包