分布式Netty集群方案 加代码 SpringBoot 版
创始人
2024-02-19 20:16:37
0

完整的讲解 netty 集群的搭建部署。从0讲解每一步,比如存入的数据是什么样的?多节点消息是怎么通信的?让没有搭建过的童鞋没有疑惑。例如:“唉,我存入redis中的实际是什么?我有没有写对?”

首先说下单机版 netty 的操作

普通的 springboot netty 项目,都是 springboot 项目启动加载完成后,启动netty 服务。代码如下

@Component
public class StartUpRunner implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) throws Exception {ServerBootstrap.bind(7000).sync();}
}
	@Overrideprotected void initChannel(NioSocketChannel ch) throws Exception {ChannelPipeline pipeline = ch.pipeline();pipeline.addLast(new HttpServerCodec()).addLast(new ChunkedWriteHandler()).addLast(new HttpObjectAggregator(1024 * 1024)).addLast(new WebSocketServerProtocolHandler("/socket.io", null, false, 1024 * 1024 * 50, false, true, 10000L));}

然后前端页面访问 ws://localhost:7000/socket.io 进行通讯。

这样一个单机版本的就 netty 服务就起来了。

单机netty是怎么通信的?

client1 连接上 nettyServer,client2 同样连接上了 nettyServer。client1给client2发送信息,client1 查找ChannelGroup找到client2的 channel 信道把消息写入信道中,这样单机版的发送信息就完成了。

// 如果想让这个单机版的netty服务,集群部署呢?

首先我们把单机版的netty启动两份,把第一份的 tomcat 端口设置成 7111,netty 端口设置成 7177,第二份的 tomcat 端口设置成 7222,netty 端口设置成 7277,这样就启动了多节点集群服务。如果在多台服务器中,因为ip不同所以端口不用变动。

client1 连接上 nettyServer1。client2 连接上 nettyServer2。client1给client2发送信息,client1找client2的channel信道发送信息,client1发现它找不到client2的channel。那就不能发送信息啊,要怎么才能发送信息呢?

我们知道连接上netty服务的客户端 channel 都是存在本地的 自定义 map 或者 netty 提供的 ChannelGroup 里面。所以我的第一想法是 让连接上的客户端channel从存到本地,改成存到分布式缓存redis中,这样启动多个netty的时候,大家都是从redis中把对应客户端所属的channel拿下来发送消息。

实操之后发现这种方法思路是对的,但 channel 存入redis 没反应。不报错,redis 中也没有数据。

这里要说的知识点是 channel 是和机器绑定的,不能被序列化和反序列化,存入不了redis中,即使存进去了拿下来也是不能使用的。

多节点集群netty是怎么通信的呢?

channel 不能存到redis里面,但是 channel 的 id 是可以存到redis里面的,redis 中存入 client 的信息 key是用户id,value是channelId。

client1 连接上 nettyServer1。client2 连接上 nettyServer2。client1给client2发送信息,client1 拿client2的用户id,到redis上获取对应client2的 channelId,通过channelId查找本节点中的ChannelGroup,在本节点中找到了 client2 的channel,就可以发送信息了。在本节点中没有找到client2的 channel,就向 消息中间件mq 中广播 client2的channelId,所有nettyServer订阅此消息,nettyServer2收到了mq中的 channelId消息,然后nettyServer2拿着channelId查找ChannelGroup,它找到了channel,通过 channel 向 client2 发送了信息"你真棒"。这样就完成了集群netty的通信。

上面一直有提到集群,那么

netty集群是怎么搭建的呢?

这里介绍 3 种方式

1:zookeeper 注册中心 

不推荐,需要额外编码网关服务实现负载均衡,如果是使用dubbo生态的话zk还是很推荐的

2:nginx                               

强烈推荐。只需要配置nginx的负载均衡即可,不需要集成格外的注册中心和网关服务

3:nacos 注册中心

推荐。springcloud系列提供了网关服务,只需要集成进来即可。需要集成nacos注册中心和gateway网关

  • zookeeper 注册中心

zookeeper 的方式,是通过 zk 的临时编号节点EPHEMERAL_SEQUENTIAL。在netty服务启动的时候,创建 一个 zk 的临时编号节点,把 netty 服务的 ip 和 端口存入节点中。当 netty 服务停止后,zk 的心跳检测到来时会删除临时节点。zk教程传送门

当 zk 节点存在的时候,表示有nettyServer,需要编写代码获取zk节点下的nettyServer节点,当有client 请求进来时,拿到这些节点下 netty 的 ip和port,连接对应的 netty 服务。如果需要轮询负载均衡的话,需要自己实现轮询算法。

明天贴代码

相关内容

热门资讯

读什么什么有感的英文 读什么什么有感的英文英语读后感标题 “读XXX有感”用英语说是 “Reading after XX...
秦岚个人资料身高体重 秦岚个人资料身高体重身高:165公分 体重:46公斤秦岚 生日:七月十七日 星座:巨蟹座 出生地:沈...
双鱼和天秤会纠缠一辈子,既相配... 双鱼和天秤会纠缠一辈子,既相配又相克,为什么?双鱼座的人和天秤座的人都是比较细心的,而且特别敏感,有...
独自一人在外怎样和别人相处? 独自一人在外怎样和别人相处?我觉得独自一个人在外面一定要好好的照顾自己,应该找一份工作,找一个住的地...
朱自清散文集有哪些写的好,值得... 朱自清散文集有哪些写的好,值得背诵的?《背影》、《 春》、《 荷塘月色》、《 匆匆》都是不错的佳...
大家最讨厌的电视剧的哪一个主角... 大家最讨厌的电视剧的哪一个主角?我觉得最讨厌的电视剧主角是容嬷嬷。都挺好,里面的苏大强就是越看越别扭...
69DT伤害怎么才能上1300... 69DT伤害怎么才能上1300 !我加点是4L1M!现在60了!伤害才800!我没大号,想买梦幻币买...
孩子上课不认真听讲 孩子上课不认真听讲我的孩子七周半,已经上二年级了,但是上课不认真听讲总是搞小动作,说了很多次也不听,...
《红脸儿》的主要内容 《红脸儿》的主要内容  红脸儿主要内容:   小说以散淡而富有诗意的语言回顾了“我”与3个小伙伴之间...
异地恋的成功例子 异地恋的成功例子 情侣异地恋8年终成正果 两人存下186张火车票见证爱情一对河南的情侣在大学恋爱时便...
小狗吃了死耗子怎么办 小狗吃了死耗子怎么办你好,没事的,放心吧,你的小狗是宠物狗还是土狗,若是宠物狗的话可能会给它造成身体...
请问有没有死亡万花筒广播剧资源... 请问有没有死亡万花筒广播剧资源?死亡万花筒,我有呀!死亡万花筒广播剧,地·址:9525.video(...
徐缺有哪些女人 徐缺有哪些女人徐缺是小说《最强反套路系统》中的角色,他有许多女性关系,其中包括:1. 林小红:徐缺的...
假如我是四大名著中的人物作文9... 假如我是四大名著中的人物作文900假如你是的林黛玉的话那你就会好好读书,不至于连900个字都写不出了...
西游记81难? 西游记81难?西游记的81难是师徒四人取经回来在河中落水经书被淹了的事
魔兽世界风暴王子问题! 魔兽世界风暴王子问题!现在3.05这版本 王子第4阶段的屏障 是不是可以被MS驱散? 屏障驱散后是...
如何评价张杰的少年中国说 如何评价张杰的少年中国说我觉得非常棒,张杰的家庭条件不好。从小就非常努力。刻苦学习音乐,经过拼搏奋斗...
智取生辰纲中杨志是怎样的人?他... 智取生辰纲中杨志是怎样的人?他失败的原因是什么?简短些志有智慧,但是他忽略了一个重要的因素:团队的合...
有一本书,名字忘记了.好象是美... 有一本书,名字忘记了.好象是美国人写的.梭罗《瓦尔登湖》 如果你用的是新教材,应该是这篇吧是 海明威...
四岁孩子看什么书 四岁孩子看什么书可以看一些带有简单数字的书、色彩鲜艳的图画、动物图画等,培养他的数字感和色彩感,尽量...