没有合适的资源?快使用搜索试试~ 我知道了~
内容概要:本文详细介绍了如何基于SpringBoot扩展Netty来搭建高性能、可伸缩的分布式通信服务。具体步骤涵盖利用Zookeeper作为注册中心管理集群成员,确保节点间的高效协作;采用Redis客户端连接池(Jedis)避免端口冲突并实现灵活配置;以及运用RabbitMQ实施广播通信,保障信息传递的有效性和及时性。
适合人群:面向具有一定Java开发经验和微服务架构背景的技术爱好者及专业程序员,特别是对实时通讯、网络编程或者消息队列应用感兴趣的学习者。
使用场景及目标:该解决方案旨在帮助企业快速搭建稳定可靠的即时通讯平台或物联网系统,能够支持大量并发连接,具备良好的容错能力和扩展潜力。开发者可以根据业务需求调整参数设定,优化性能表现。
其他说明:文中提供了大量实战代码样例和技术细节讲解,帮助读者深入理解各组件的作用及相互关系,进而掌握Netty集群的设计思想与实现技巧。此外还涉及到了诸如服务治理、负载均衡等概念,在理论层面上丰富了文章的内容。

Netty 集群构建
HaoYang Luo
March 2025
1 引言
在已经实现单体 Netty 的 SpringBoot 微服务服务端功能后,进一步向
Netty 分布式集群拓展。
2 Zookeeper 实现 Netty 集群方案
NettyServer 在 zookeeper 中注册后,zookeeper 会得到每个 NettyServer
的地址与端口号,并将其以树形路径保存起来。采用临时节点的方式,一旦
NettyServer 宕机下线,就会将相应地址在路径中去除。用户端通过 Con-
troller 向 zookeeper 请求 NettyServer,通过均衡负载(最小连接数、轮询)
后与 NettyServer 连接。
3 消息广播
当多个 NettyServer 同时订阅 RabbitMQ 消息队列时,用户通过一个
NettyServer 节点向与另一 NettyServer 节点连接的用户发送消息时,Rab-
bitMQ 消息队列就会对所有的 NettyServer 进行广播确保消息能够正确传
递。
4 构建 Jedis 客户端连接池服务
之前单体 NettyServer 构建的过程是通过硬编码确认端口号,但对于几
十上百个 NettyServer 启动就不适用了,通过 Redis 实现启动时动态使用没
1

有占用的端口号,由于 ChatServer 本质上并不是属于 SpringBoot 环境,对
于先前微服务开发流程中的 Redis 相关配置与工具类并不适用,使用 Jedis
客户端工具即可解决这一问题。
在 chat-server 模块下 pom 文件中带入以下依赖:
1 <dependency >
2 <groupId >redis .clients </ groupId >
3 <artifactId >jedis </ artifactId >
4 <version >4.4.3</ version >
5 </dependency >
Listing 1: Jedis 依赖配置
创建 JedisPoolUtils 工具类:
1 import redis. clients .jedis .Jedis ;
2 import redis. clients .jedis .JedisPool;
3 import redis. clients .jedis .JedisPoolConfig;
4
5 import java .time.Duration ;
6
7 public class JedisPoolUtils {
8
9 private static final JedisPool jedisPool;
10
11 static {
12 JedisPoolConfig poolConfig = new JedisPoolConfig ();
13 // 最 大 连 接 数
14 poolConfig . setMaxTotal (10) ;
15 // 最 大 空 闲 连 接 数
16 poolConfig . setMaxIdle (10);
17 // 最 小 空 闲 连 接 数
18 poolConfig . setMinIdle (5);
19 // 最 长 等 待 时 间 ms
20 poolConfig . setMaxWait( Duration. ofMillis (1500));
21
22 jedisPool = new JedisPool( poolConfig , " 127.0.0.1",
5379, 1000 , "imooc");
23 }
24
2

25 public static Jedis getJedisPool() {
26 return jedisPool. getResource ();
27 }
28 }
Listing 2: JedisPoolUtils 构建
在 ChatServer 启动类中创建如下方法:
1 public static final Integer nettyDefaultPort = 875;
2 public static final String initOnlineCounts = "0";
3
4 public static Integer selectPort( Integer port) {
5 String portKey = "netty_port";
6 Jedis jedis = JedisPoolUtils. getJedis();
7
8 Map< String , String > portMap = jedis.hgetAll (portKey);
9 System.out.println( portMap );
10 // 由 于 map 中 的 key 都 应 该 是 整 数 类 型 的 port , 所 以 先 转 换 成 整
数 后 , 再 比 对, 否 则 string 类 型 的 比 对 会 有 问 题
11 List <Integer > portList = portMap .entrySet (). stream()
12 .map( entry -> Integer. valueOf (entry .getKey ()))
13 .collect(Collectors. toList ());
14 System.out.println( portList);
15
16 Integer nettyPort = null;
17 if (portList == null || portList .isEmpty()) {
18 jedis .hset(portKey , port +"", initOnlineCounts);
19 nettyPort = port;
20 } else {
21 // 循 环 portList , 获 得 最 大 值, 并 且 累 加 10
22 Optional <Integer > maxInteger = portList .stream ().
max( Integer :: compareTo );
23 Integer maxPort = maxInteger.get(). intValue();
24 Integer currentPort = maxPort + 10;
25 jedis .hset(portKey , currentPort+"",
initOnlineCounts);
26 nettyPort = currentPort;
27 }
28 return nettyPort;
3

29 }
Listing 3: 自动生成端口方法
即可解决 NettyServer 分布式启动时的端口占用问题,实现端口的自动生成
选择。
5 NettyServer 集群
5.1 Zookeeper 工作机制
Zookeeper 主要通过以下几个核心机制实现分布式协调:
1. 数据模型(树状结构)Zookeeper 采用类似文件系统的树形结构存储
数据(称为 Znode)。每个节点(Znode)可存储少量数据,且可以有子节
点。节点类型:持久节点(Persistent):一旦创建,除非手动删除,否则一
直存在。临时节点(Ephemeral):创建节点的客户端会话结束时,自动删除
该节点。顺序节点(Sequential):创建时自动在节点名称后加上递增序号。
2. Watcher(监听机制)客户端可在 Znode 节点上注册监听器(Watcher)。
一旦节点数据发生变化或节点删除,Zookeeper 会主动通知客户端,客户端
接收通知后执行相应的动作。
3. 会话机制(Session)客户端连接 Zookeeper 服务器后建立一个会话。
会话期间,客户端可以创建临时节点,会话中断或客户端断开连接后临时节
点自动删除,适用于服务注册与发现场景。
4. Zab 协议(一致性协议)Zookeeper 基于 Zab 协议实现数据同步和复
制。Zab 协议主要用于解决分布式系统中数据一致性问题,保证了 Zookeeper
服务的高可用性与数据的强一致性。
5.2 Docker 部署 Zookeeper
打开 cmd 执行以下拉取命令:
1 docker run zookeeper :3.9.2
Listing 4: 镜像拉取
拉取 image 到本地后使用以下指令启动(需提前创建好文件夹)
1 docker run --name zookeeper^
4
剩余15页未读,继续阅读
资源推荐
资源评论
2023-02-24 上传

196 浏览量
153 浏览量
2021-02-05 上传
2014-01-24 上传
145 浏览量
149 浏览量
164 浏览量
200 浏览量
2019-08-12 上传
2018-12-20 上传
2023-10-16 上传

108 浏览量

189 浏览量
2020-02-23 上传
2017-11-06 上传
159 浏览量
130 浏览量
131 浏览量
127 浏览量
183 浏览量
133 浏览量
2021-05-14 上传
180 浏览量
154 浏览量
106 浏览量
158 浏览量

157 浏览量

6868 浏览量
资源评论


J_Silver
- 粉丝: 43
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 3DSMax插件安装完全向导.doc
- 软件技术职业生涯规划.doc
- 单片机实用系统设计方案教学进度表、教案.doc
- 大数据视角下的人工智能技术应用探讨.docx
- 2017-2018学年高中数学-第二章-算法初步-2.2-算法框图的基本结构及设计-2.2.3-循环结构-北师大版必修3.ppt
- 医院财务管理信息化研究.docx
- 云计算在现代远程教育中的应用研究.docx
- 区块链视角的企业业财融合与财务共享研究.docx
- RSA数据加密算法分析与改进.docx
- 单片机汇编语言经典一百例.doc
- 以培养学生自觉意识为基础的计算机程序设计课程教学改革研究.docx
- JAVA计算器课程设计.docx
- 声源定位在智能语音识别中的应用-洞察研究.pptx
- 自学考试C--程序设计C--笔记.doc
- 基于云计算环境下数据存储安全的关键技术初探.docx
- C语言-第12章.ppt
安全验证
文档复制为VIP权益,开通VIP直接复制
