如何实现一个RPC框架2 ——用Netty实现协议通信
前言:
大家好,我是秋雨清笛,一个在读学生。这两个月里我初步实现了一个简单的RPC框架。做这个RPC框架的主要目的是为了学习,让自己能在平时的CRUD之余学习到一些不一样的东西,了解更多造轮子过程中的细节。实现并不是很复杂,主要目的还是学习。
接下来我将以几篇博文来谈谈我是怎么实现它的,遇到了一些什么样的技术细节。大家可以参照以下链接的源码:
https://github.com/PanYuDi/qyqd-rpc
本篇主要内容是用Netty实现通信
一、实现服务端
- 定义接口
- 写NettyServer
需要说的不多,基本的Netty服务端模板,值得一提的是
这一句启动了TCP长连接,为我们以后实现心跳机制和链接缓存埋下了伏笔
二、实现客户端
大家可以参考NettyClient客户端的代码,这里涉及到心跳机制的实现,具体实现我们下一篇再仔细讨论,我们要知道的是客户端唯一目的就是发送数据
三、编码和解码
这节我们这篇聊的重点
我们在上一篇定义了协议,现在我们要在Netty通信中实现这个协议,我们将在Netty handler调用链中实现协议的编码和解码。
Netty调用链机制分为了InboundHandler和OutboundHandler,这里不做赘诉。我们要实现的是把一个ProtocolMessage塞进Netty客户端然后经过客户端和服务端的handler能原封不动的由服务端拿到这个类。
编码的实现
我们使用Netty的MessageToByteEncoder,它可以将一个类写成Byte流。我们仅需按照我们定义的协议顺序依次写入
解码的实现
Netty提供的LengthFieldBasedFrameDecoder为我们提供了方便的解码方式
它的作用主要是按照偏移量先读取报文长度,然后自动读取到整个报文
构造函数的后四个参数决定了怎样读取这个报文
- lengthFieldOffset 长度域偏移量,因为我们的长度域之前有一个4B的魔数,所以这里我们传4
- lengthFieldLength 长度与的大小,我们协议中定义的是4B,所以传4
- lengthAdjustment 决定了读取完长度后,我们从哪里开始读?因为我们还是需要读取魔数和长度,所以我们回到开始的地方,也就是-8
- initialBytesToStrip 指定这个字段可以忽略到请求头的一些数据,我们设置为0不去跳过
了解这个解码器的原理后就简单了,接下来我们要做的就是依次从ByteBuf中读取数据就行了,也不用担心读多了,读多了也会抛出异常的,很容易debug
四、后续的处理
下一步就是在handler中继续处理ProtocolMessage了
这里的MessageHandler是我自己定义的抽象接口,这个handler会按照类型依次处理请求。
接下来就是具体的业务处理了,通过Netty的协议通信也基本实现了,下一篇将介绍心跳机制的实现
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库