实战Netty集群 - CrazyIM 分布式聊天实战
文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 :
免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备
免费赠送 经典图书:《Java高并发核心编程(卷1)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:《Java高并发核心编程(卷2)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:《Java高并发核心编程(卷3)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:《尼恩Java面试宝典 最新版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 资源宝库: Java 必备 百度网盘资源大合集 价值>10000元 加尼恩领取
1 开启 Netty集群实战的理由
Java基础练习中,一个重要的实战练习是: java的聊天程序。基本上,每一个java工程师,都有写过自己的聊天程序。
实现一个Java的分布式的聊天程序的分布式练习,同样非常重要的是。有以下几个方面的最重要作用:
1 体验高并发的程序的开发
从研究承载千、万QPS级的流量,拓展能够承载百万级、千万级、亿万级流量
2 增加高并发经验
有分布式、高并发的实战经验,面试谈薪水的时候,能提升不少
3 Netty集群的使用非常广泛
Netty集群的分布式原理,和大数据的分布式原理,elasticsearch 的分布式原理,和redis集群的分布式原理,和mongodb的分布式原理,很大程度上,都是想通。 Netty集群作为一个实战开发, 是一个非常好的分布式基础练习
4 简历上增加亮点
基于本项目,可以开发 亿级流量IM推送中台, 亿级流量IM消息中台, 在简历上加上重要的一个亮点项目。
Netty 集群 实战源码
本文的代码,来自于开源项目CrazyIm , 项目的地址为
https://gitee.com/crazymaker/crazy_tourist_circle__im.git源码 目前已经完成了基本的通信,在不断迭代中,不少的群友,通过疯狂创客圈的QQ群,沟通迭代过程中的问题。
2 Netty 集群中,服务节点的注册和发现
2.1 服务节点的注册和发现
zookeeper作为注册中心,每一个netty服务启动的时候,把节点的信息比如ip地址+端口号注册到zookeeper上。
具体的原理,请参见书籍《Netty Zookeeper Redis 高并发实战》。 或者参见文末的视频。
2.2 服务的发现
利用zk有一个监听机制,就是针对某个节点进行监听,一点这个节点发生了变化就会收到zk的通知。我们就是利用zk的这个watch来进行服务的上线和下线的通知,也就是我们的服务发现功能。
具体的原理,请参见书籍《Netty Zookeeper Redis 高并发实战》。
3 负载均衡策略
3.1 负载均衡策略的基本思路
在我们解决了服务的注册和发现问题之后,那么我们究竟提供给客户端那台服务呢,这时候就需要我们做出选择,为了让客户端能够均匀的连接到我们的服务器上(比如有个100个客户端,2台服务器,每台就分配50个),我们需要使用一个负载均衡的策略。
这里我们使用轮询的方式来为每个请求的客户端分配ip。具体的代码实现如下:
具体的原理,请参见书籍《Netty Zookeeper Redis 高并发实战》。
4 开发或者测试环境搭建
两种模式:
1 基于windows搭建开发环境
2 基于windows+ centos 虚拟机的形式搭建开发环境
区别在于: 方式2 的 Zookeeper、redis 部署在 centos 虚拟机.
4.1 step1:安装和启动Zookeeper
Zookeeper的安装和原理,以及开发的基础知识,请参见:
或者,请参见:
下面是示意图:
启动zookeeper的两个节点,本来有三个,启动二个即可
客户端连接zookeeper集群。命令如下:
./zkCli.cmd -server localhost:2181
4.2 step2: 安装和启动Redis
Redis的安装和原理,以及开发的基础知识,请参见:
或者,请参见:
并且可以安装一下 redis 的客户端界面。如下:
5 Netty集群启动
前提1:maven install 进行全量编译
下载代码到本地,然后使用 maven install 进行全量编译:
前提2: 加入WEBGate 到idea,并且编译
由于webgate是一个web项目,没有放在根pom下,需要单独导入。
并且编译和安装到本地
前提3:修改代码中的zk配置
搜索配置文件中的 zookeeper.connect.url ,一共有两个地方
改为本地的 地址如: 127.0.0.1:2181
前提3:修改代码中的redis配置
修改redis的host、port、pass,指向本地或者正确的服务器地址。
host改为本地的 地址如: 127.0.0.1
5.1 step3:启动WEBGate
使用一个WEBGate,作为负载均衡的服务器,具体的原理,请参见书籍《Netty Zookeeper Redis 高并发实战》。
除了负载均衡,从WEBGate还可以从 zookeeper中删除所有IM节点
连接为: http://localhost:8080/swagger-ui.html
swagger 的界面如下:
5.2 启动第一个Netty节点
服务端的端口为7000
5.3 启动第二个Netty节点
服务端的端口为7001,自动递增的
5.4 启动第一个客户端
启动后输入登录的信息
请输入登录信息,格式为:用户名@密码
z1@1
启动客户端后,并且登录后,会自动连接一个netty节点, 这里为7001,第二个Netty服务节点。
5.5 启动第二个客户端
启动后输入登录的信息
请输入登录信息,格式为:用户名@密码
z2@1
启动客户端后,并且登录后,按照负载均衡的机制,会自动连接一个netty节点, 这里为7000,第一个Netty服务节点。
6 不同服务器直接进行IM通信
下面演示,不同的客户端,通过各自的服务器节点,进行通信。
6.1 发送聊天消息
在第二个客户端(用户为z2),发送消息给第一个客户端(用户为z1),消息的格式为 :“ 内容@用户名”
请输入聊天信息,格式为:内容@用户名
hello@z1
请输入聊天信息,格式为:内容@用户名
helloworld@z1
6.2 远程客户端接收消息
通过Netty服务节点的转发,第一个客户端收到的消息如下:
收到消息 from uid:z2 -> hello
收到消息 from uid:z2 -> helloworld
7 总结
7.1 开发的难度
通过Netty+Zookeep+Redis的架构,整个Netty的集群,具备了服务节点的自动发现,节点之间的消息路由的能力。
说明一下,整个程序,还是比较复杂的,如果看不懂,建议不要捉急,慢慢来。
如果能从0到1的自己实现一版,开发的水平,也就不一般了。
7.2 如果还不行,就看配套视频吧
很多小伙伴反应,实操起来有点难点(实属正常),故提供了配套视频