常州网站设计平台,wordpress在线仿站,站群搭建,免费app制作网站1.技术要点
1.1 rpc协议
定义一个rpc协议类#xff0c;用于rpc服务端和客户端数据交互。
1.2 netty粘包半包处理
由于数据传说使用tcp协议#xff0c;rpc协议的数据在网络传输过程中会产生三种情况#xff1a; 1#xff09;刚好是完整的一条rpc协议数据 2#xff09;不…1.技术要点
1.1 rpc协议
定义一个rpc协议类用于rpc服务端和客户端数据交互。
1.2 netty粘包半包处理
由于数据传说使用tcp协议rpc协议的数据在网络传输过程中会产生三种情况 1刚好是完整的一条rpc协议数据 2不止一条rpc协议的数据粘包 3不够一条rpc协议的数据半包 针对这些可能发生粘包核半包情况netty提供了很多解码器这里使用 LengthFieldBasedFrameDecoder 这个解码器是基于长度的帧解码器需要定义最大的帧有多少字节自定义的rpc协议的数据包最大长度不能超过帧的大小否则就会抛出异常只要数据长度不超过最大帧数据就会按照实际长度进行解码。 下面来看看为什么LengthFieldBasedFrameDecoder能够解决粘包或者半包
假设rpc协议的数据长度用4个字节表示。半包情况
1接收到的数据首先会进入到系统的缓冲区中当读取长度的时候缓存区数据不够四个字节就等待够四个字节了在读取这样就保证先读取到数据长度假设读取到的长度值是512表示内容的部分有512个字节。 2当拿到长度以后就要读取内容部分了当缓冲区的数据不够512字节的时候就等够512个字节以后就读取512个字节多余的部分会进行下一个解码。。
假设rpc协议的数据长度用4个字节表示。粘包情况
1先读取到数据长度假设读取到的长度值是512表示内容的数据有512个字节。 2当拿到长度以后就要读取内容部分了这里只会读取512个字节多余的部分会进行下一个解码。
这样长度的4个字节的数据内容的512个字节的数据516个字节的rpc协议数据就接收完成了然后通过后续的解码器解码成对应的java对象可以在代码中使用这样java对象进行后续业务操作。
1.3 动态代理
在rpc的客户端能够获取service的代理对象这个代理对象内部通过netty封装网络请求rpc协议的数据编解码。
1.4 整体流程
客户端请求注册中心找到某个服务接口的地址列表然后从地址列表中选一个地址这个过程也叫负载均衡 然后通过实现InvocationHandler的invoke方法在invoke方法里面里面会把接口名、方法参数、方法参数类型等信息封装成一个java请求对象这个java请求对象在客户端经过一系列的编码器编码成rpc协议字节数据发送给服务端 服务端接收到rpc协议数据以后经过一系列解码器把rpc协议数据解码成java请求对象然后进行后续业务操作生成java响应对象 服务端把java响应对象通过一系列编码器编码成rpc协议数据发送给客户端客户端经过一些列解码器变成java响应对象。
2.项目结构
2.1 公共部分
service 服务接口 register (注册中心) protocol (rpc协议) context rpc上下文 codec (rpc调用编解码)
2.2 服务端
server
2.3 客户端
client
总结
通过netty实现rpc服务需要定义rpc协议用来客户端和服务端数据交互服务端通过监听端口客户端tcp连接服务端然后发送和接收数据这个数据交互的过程需要把数据序按照rpc协议的格式进行编解码客户端通过动态代码封装网络请求产生接口的代理对象。