实战Netty集群 - CrazyIM 分布式聊天实战

文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源:


推荐:入大厂 、做架构、大力提升Java 内功 的 精彩博文

入大厂 、做架构、大力提升Java 内功 必备的精彩博文 2021 秋招涨薪1W + 必备的精彩博文
1:Redis 分布式锁 (图解-秒懂-史上最全) 2:Zookeeper 分布式锁 (图解-秒懂-史上最全)
3: Redis与MySQL双写一致性如何保证? (面试必备) 4: 面试必备:秒杀超卖 解决方案 (史上最全)
5:面试必备之:Reactor模式 6: 10分钟看懂, Java NIO 底层原理
7:TCP/IP(图解+秒懂+史上最全) 8:Feign原理 (图解)

Java 面试题 30个专题 , 史上最全 , 面试必刷 阿里、京东、美团... 随意挑、横着走!!!
1: JVM面试题(史上最强、持续更新、吐血推荐) 2:Java基础面试题(史上最全、持续更新、吐血推荐
3:架构设计面试题 (史上最全、持续更新、吐血推荐) 4:设计模式面试题 (史上最全、持续更新、吐血推荐)
17、分布式事务面试题 (史上最全、持续更新、吐血推荐) 一致性协议 (史上最全)
29、多线程面试题(史上最全) 30、HR面经,过五关斩六将后,小心阴沟翻船!
9.网络协议面试题(史上最全、持续更新、吐血推荐) 更多专题, 请参见【 疯狂创客圈 高并发 总目录

SpringCloud 精彩博文
nacos 实战(史上最全) sentinel (史上最全+入门教程)
SpringCloud gateway (史上最全) 更多专题, 请参见【 疯狂创客圈 高并发 总目录

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的安装和原理,以及开发的基础知识,请参见:

书籍《Netty Zookeeper Redis 高并发实战》

或者,请参见:

博客:windows zk 伪集群搭建

下面是示意图:

在这里插入图片描述
启动zookeeper的两个节点,本来有三个,启动二个即可

客户端连接zookeeper集群。命令如下:

./zkCli.cmd -server localhost:2181

在这里插入图片描述

4.2 step2: 安装和启动Redis

Redis的安装和原理,以及开发的基础知识,请参见:

书籍《Netty Zookeeper Redis 高并发实战》

或者,请参见:

博客:Windows 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 如果还不行,就看配套视频吧

很多小伙伴反应,实操起来有点难点(实属正常),故提供了配套视频

posted @ 2019-09-05 22:29  疯狂创客圈  阅读(16907)  评论(1编辑  收藏  举报