热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBoot+Netty+Redis搭建长连接集群

点击上方“芋道源码”,选择“设为星标”管她前浪,还是后浪?能浪的浪,才是好浪!每天10:33更新文章ÿ

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 
  • 原创 | Java 2021 超神之路,很肝~

  • 中文详细注释的开源项目

  • RPC 框架 Dubbo 源码解析

  • 网络应用框架 Netty 源码解析

  • 消息中间件 RocketMQ 源码解析

  • 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析

  • 作业调度中间件 Elastic-Job 源码解析

  • 分布式事务中间件 TCC-Transaction 源码解析

  • Eureka 和 Hystrix 源码解析

  • Java 并发源码

来源:网络

  • 1.背景

  • 2.技术选项&实现

  • 3.代码实现

  • 4.总结


1.背景

公司在做一个社交项目,音视频技术是使用的第三方技术,直播间开播,进出房间,以及推送相关功能需要自己完成开发,因而需要自己搭建长连接服务器。

于是在技术选型上,为了保证服务高并发性能,以及长连接性能,在本身就是微服务架构上,采用了SpringBoot + Netty实现了长连接服务搭建,关于SpringBoot和Netty框架相关,本文不是重点,本文重点在于Netty集群搭建实现消息转发功能。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能。

项目地址:https://github.com/YunaiV/ruoyi-vue-pro

2.技术选项&实现

2.1 关于Netty长连接

Netty是一个非常优秀的NIO异步事件驱动框架,在JDK NIO的基础上,封装并拓展包装,使得NIO的API简单易用,很多框架底层也应用了(比如Dubbo),Netty是可以做为一个长连接服务的,使用ws协议,可以构建一个高性能的长连接服务器,据说单机就能支持1万左右的连接。

熟悉Netty或NIO的都了解,其底层数据传输时通过一个网络连接Channel,对于单机Netty来说,Channel都连接在同一台服务器上,Channel之间的通信可以直接根据绑定的用户信息进行获取并转发。但是对于Netty集群来说,每个客户端的连接可能在不同的服务器上,这样在Channel互相通信时,需要判断是否在当前节点,并实现消息的转发。

2.2 技术选项

实现消息转发,有多种技术框架可以实现,比如ZK,MQ,Redis等,由于当前项目已经搭建了自己的MQ和Redis服务,因此考虑成本,目前只在MQ和Redis中选择。

如上文,Netty集群搭建后,Channel收到消息后,需要判断目标用户的Channel是否在本节点,如果不在,就需要做消息转发,转发到目标节点上,并将消息写到Channel中。因而MQ的广播机制和Redis的发布订阅就可以实现功能。

对比如下:

  • MQ:专门做消息队列的,可靠性高,但重量级,异步,不能保证实时。

  • Redis:较轻量级,低延迟,高并发,低可靠性。

两者在项目均在使用,考虑到直播消息更加保证时效性,故而选择Redis发布订阅功能,相对而言集成较为简单。

2.3 实现架构图

5c8e847a5c261dc18dc3bd8535e81cb1.png

①服务启动时,向Redis注册自己的节点信息,并指定监听频道。

②客户端连接Netty Server成功后,并在Redis缓存中绑定用户加入的节点,以便后续信息转发,将信息转发到指定的频道。

③在Channel转发时,判断如果当前用户在本节点,就直接转发,如果不在,从Redis获取到注册的节点信息,并将消息发布到指定的频道节点。

基于微服务的思想,构建在 B2C 电商场景下的项目实战。核心技术栈,是 Spring Boot + Dubbo 。未来,会重构成 Spring Cloud Alibaba 。

项目地址:https://github.com/YunaiV/onemall

3.代码实现

45077134b372776df765ee4246b0e818.png

绑定当前节点,服务启动并监听指定的频道,指定Listener。

e674f5faccf4b536f10b76b7d5407ea1.png

订阅节点生成器 本机 ip + 服务端口

04902b78c088eb08eac6672f3a12eea6.png

监听器实现,监听的频道收到消息,处理并发送到对应Channel

1148f4bec7b1d7765d3eb85f11ae0b7d.png

消息转发Sender

4.总结

①通过应用Redis发布订阅,Netty Server多个集群,追加多节点时,新增节点会自动注册监听对于的频道,消息转发时也会自动投递到新注册的节点频道上,可扩展性强。

②当前Redis 5中有很多新增的高级特性,笔者也在慢慢学习中,可应用到项目业务场景中也比较多。



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

5b7ec7e3a4d01f5614902e70d24c7c15.png

已在知识星球更新源码解析如下:

3a6a4aae2f6b3cfdb66635a509a06363.png

11b78c1786719d70a6cbdc083a80edd2.png

9c7c9cbfad441f336bf8b03602deae25.png

25a136f2e801675265c3c44ea9054165.png

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)


推荐阅读
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 修复一个 Bug 竟耗时两天?真的有那么复杂吗?
    修复一个 Bug 竟然耗费了两天时间?这背后究竟隐藏着怎样的复杂性?本文将深入探讨这个看似简单的 Bug 为何会如此棘手,从代码层面剖析问题根源,并分享解决过程中遇到的技术挑战和心得。 ... [详细]
  • 阿里巴巴Java后端开发面试:TCP、Netty、HashMap、并发锁与红黑树深度解析 ... [详细]
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
  • 观察 | 求职体验:收到录用通知的公司通常不深究技术细节,而那些详细追问的公司往往没有后续进展
    观察 | 求职体验:收到录用通知的公司通常不深究技术细节,而那些详细追问的公司往往没有后续进展 ... [详细]
  • 通过一张截图深入解析字节跳动的 Java 开发实力
    在与一位来自字节跳动的朋友交流时了解到,根据他们近期招聘Java工程师的经验,大多数候选人往往在工作3年后会遇到一个难以跨越的瓶颈期。这是因为在职业生涯的这个阶段,许多工程师的技术深度和广度已经达到了一定的水平,但要进一步提升则需要更多的挑战和学习机会。字节跳动作为一家技术驱动的公司,通过严格的面试流程和实际项目经验,能够更好地评估候选人的技术水平和发展潜力。 ... [详细]
  • 阿里巴巴终面技术挑战:如何利用 UDP 实现 TCP 功能?
    在阿里巴巴的技术面试中,技术总监曾提出一道关于如何利用 UDP 实现 TCP 功能的问题。当时回答得不够理想,因此事后进行了详细总结。通过与总监的进一步交流,了解到这是一道常见的阿里面试题。面试官的主要目的是考察应聘者对 UDP 和 TCP 在原理上的差异的理解,以及如何通过 UDP 实现类似 TCP 的可靠传输机制。 ... [详细]
  • 在本篇学习指南中,我们将探讨 Spring Cloud 2020 版本中的技术选型和版本选择策略。具体来说,我们将详细介绍如何在项目中选用 Spring Boot 和 Spring Cloud 的最佳组合。本文以 Spring Boot 2.2.2 为例,结合实际应用场景,提供详细的配置和使用建议,帮助开发者更好地理解和应用这些框架。此外,我们还将讨论不同版本之间的兼容性和升级路径,确保项目能够平稳过渡到最新版本。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • 美团优选推荐系统架构师 L7/L8:算法与工程深度融合 ... [详细]
  • 本文深入解析了Spring Cloud路由网关Zuul的核心功能及其典型应用场景。通过对方志朋老师教材的学习和实践,详细探讨了Zuul在微服务架构中的重要作用,包括请求路由、过滤器链管理以及服务动态扩展等关键特性。同时,结合实际案例,展示了Zuul在高并发和复杂业务场景下的应用优势,为读者提供了全面的技术参考。 ... [详细]
  • 深入解析Spring Boot启动过程中Netty异步架构的工作原理与应用
    深入解析Spring Boot启动过程中Netty异步架构的工作原理与应用 ... [详细]
  • 本文深入探讨了Java枚举类型的使用与实践,详细解析了枚举的基本用法及其在实际开发中的应用。首先介绍了枚举作为常量的替代方案,自JDK 1.5起,通过枚举可以更加简洁、安全地定义常量,避免了传统方式中可能出现的错误。此外,文章还探讨了枚举在实现单例模式、状态机等场景中的优势,并提供了多个实际案例,帮助开发者更好地理解和运用这一强大的语言特性。 ... [详细]
author-avatar
手机用户2502922083
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有