netty给指定客户端发消息_实现分布式服务注册及简易的netty聊天

本文介绍了如何使用SpringBoot、Zookeeper和Swagger2实现服务注册,通过创建临时节点和监听事件来跟踪在线服务器。接着展示了如何搭建一个简单的Netty聊天系统,利用protobuf进行序列化和反序列化,防止粘包、拆包问题。通过实例展示了客户端与服务端的交互过程。
摘要由CSDN通过智能技术生成

作者:黄青石

www.cnblogs.com/huangqingshi

现在很多地方都会用到zookeeper, 用到它的地方就是为了实现分布式。用到的场景就是服务注册,比如一个集群服务器,需要知道哪些服务器在线,哪些服务器不在线。

ZK有一个功能,就是创建临时节点,当机器启动应用的时候就会连接到一个ZK节点,然后创建一个临时节点,那么通过获取监听该路径,并且获取该路径下的节点数量就知道有哪些服务器在线了。当机器停止应用的时候,zk的临时节点将会自动被删除。我们通过这个机制去实现。

这次主要实现是采用springboot, zkui, swagger实现。接下来来看一下主要的代码实现:

在机器启动的时候获取本机的IP,然后将本机的IP和指定的端口号注册到程序中:

250631b7e9226fc3160c51337cb8d84a.png

创建一个工具类,工具类主要实现创建父节点,创建临时路径,监听事件,获取所有注册节点。

3a250d99331d6f1088996cf54c80a092.png

这块就基本完成了,下面开始创建controller,目的是为了获取所有在线机器的节点。为了方便测试和查看我使用了Swagger2, 这样界面话的发请求工具特别好用。

接下来看controller的主要内容:

fe21a4f6ba8d196e659cdda2a74d3e3d.png

同时配置对应的Swagger2

33c838ad34ac7722025ade75488f3c2b.png

好了,接下来该启动工程了,启动之后访问:http://localhost:8080/swagger-ui.html

2a3f49ba91afb97e18455dd008649e9a.png

点击下面的zk-controller,对应controller的方法就会显示出来,然后点try it out, execute 相应的结果就直接出来了, 通过下面的图片,可以发现我本机的IP已经注册到里边了。 

cb5837af12262374090561dd41f14c85.png

接下来,咱们使用ZKUI连接上zookeeper,看一下是否真的有注册的机器(父节点用的monior),已经存在了,没有问题:

e41e7eac52c6958cee73f6d9338bc5c7.png

注册这块就算实现完了,我一直想实现一个简易的聊天,参考了各种资料然后实现了一把,也算圆梦了。下面开始实现简易netty版聊天(为什么选择netty?因为这个工具非常棒),使用protobuf进行序列化和反序列化:

首先从官网上下载protobuf工具,注意对应不同的操作系统,我的是WINDOWS的,直接下载一个EXE程序,你下载的哪个版本,需要使用与该版本对应的版本号,否则会出错误。

ed225c3c5d3fb60c34ec15c10b55271d.png

自己创建好对应的Request.proto和Response.proto,在里边指定好对应的字段和包名信息。分别执行命令即可生成对应的文件:protoc.exe ./Response.proto --java_out=./ 这个是生成Response的,还需要指定一条生成Request。

将文件夹放到工程里边,工程的大致接入如下:

cb10b4dec196fc93fe0461ccb13226d2.png

Server的主要实现,主要基于protoBuf固定长度的进行实现的(序列化和反序列化一般通过固定长度或者分隔符实现),这样的话就不会造成粘包、拆包的问题。

7a122c788d2ea57d42f0d2dc710105d9.png

客户端主要两个方式,一个方式是客户端向服务端发请求,一个方式是群组发消息,我为了快速实现,就直接发一条请求,并且将结果输出到日志中了。客户端使用一个线程执行两个不同的方法,然后将一个是发送给Server, 一个是发送给Group。发送给Server比较简单就直接给Server了。

a1bae877b90f6edbbf93b3b566c8e94f.png

发送给Group的话需要记住每次过来的唯一requestId,并且保存对应的channel,然后发送消息的时候遍历所有requestId,并且与之对应的发送消息:

44094f0d9a42bc869e694580d92723dc.png

输出的结果如下,自定义两个客户端,一个requestId是1L,另一个requestId是2L,然后都在启动的时候sleep 3秒,然后发送给server。sleep5秒发送到Group里边去,输出的结果就是如下这个样子的。

ec9252cf356123c71d9cbf44a87a56f0.png

对了,在这里说一下,我目前是在职Java开发,如果你现在正在学习Java,了解Java,渴望成为一名合格的Java开发工程师,在入门学习Java的过程当中缺乏基础入门的视频教程,可以关注并私信我:01。获取。我这里有最新的Java基础全套视频教程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值