基于netty实现简易版rpc服务-理论分析

embedded/2024/10/20 8:49:48/

1.技术要点

rpc_1">1.1 rpc协议

定义一个rpc协议类,用于rpc服务端和客户端数据交互。

netty_4">1.2 netty粘包半包处理

由于数据传说使用tcp协议,rpc协议的数据在网络传输过程中会产生三种情况:
1)刚好是完整的一条rpc协议数据
2)不止一条rpc协议的数据(粘包)
3)不够一条rpc协议的数据(半包)
针对这些可能发生粘包核半包情况,netty提供了很多解码器,这里使用:

LengthFieldBasedFrameDecoder
这个解码器是基于长度的帧解码器,需要定义最大的帧有多少字节(自定义的rpc协议的数据包最大长度不能超过帧的大小,否则就会抛出异常),只要数据长度不超过最大帧数据,就会按照实际长度进行解码。

下面来看看为什么LengthFieldBasedFrameDecoder能够解决粘包或者半包

rpc4_14">假设rpc协议的数据,长度用4个字节表示。(半包情况)

1)接收到的数据首先会进入到系统的缓冲区中,当读取长度的时候,缓存区数据不够四个字节,就等待够四个字节了在读取,这样就保证先读取到数据长度,假设读取到的长度值是512,表示内容的部分有512个字节。
2)当拿到长度以后,就要读取内容部分了,当缓冲区的数据不够512字节的时候,就等够512个字节以后,就读取512个字节,多余的部分会进行下一个解码。。

rpc4_17">假设rpc协议的数据,长度用4个字节表示。(粘包情况)

1)先读取到数据长度,假设读取到的长度值是512,表示内容的数据有512个字节。
2)当拿到长度以后,就要读取内容部分了,这里只会读取512个字节,多余的部分会进行下一个解码。

rpcjavajava_21">这样长度的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协议的格式进行编解码,客户端通过动态代码封装网络请求,产生接口的代理对象。


http://www.ppmy.cn/embedded/128945.html

相关文章

如何给手机换ip地址

在当今数字化时代,IP地址作为设备在网络中的唯一标识,扮演着举足轻重的角色。然而,有时出于隐私保护、网络访问需求或其他特定原因,我们可能需要更改手机的IP地址。本文将详细介绍几种实用的方法,帮助您轻松实现手机IP…

苍穹外卖学习笔记(二十三)

拒单 OrderController /*** 拒单*/PutMapping("/rejection")ApiOperation("拒单")public Result rejection(RequestBody OrdersRejectionDTO ordersRejectionDTO) throws Exception {orderService.rejection(ordersRejectionDTO);return Result.success(…

记录一个容易混淆的 Spring Boot 项目配置文件问题

记录一个容易混淆的 Spring Boot 项目配置文件问题 去年,我遇到了这样一个问题: 在这个例子中,由于密码 password 以 0 开头,当它被 Spring Boot 的 bean 读取时,前导的 0 被自动去掉了。这导致程序无法正确读取密码。…

探索GenAI/大模型评估与对比:AutoArena开源框架及产品介绍

在生成式人工智能(GenAI)和大型语言模型(LLM)快速发展的今天,如何准确、高效地评估这些模型的性能变得尤为重要。为此,社区中的朋友询问是否有专门用于GenAI和大模型评估与对比的工具。本文将介绍一个强大的开源框架——AutoArena,它专为自动化GenAI评估设计,特别适合于…

源码编译方式安装htppd软件

一.源码编译安装httpd软件 1.安装阿帕奇的依赖,安装apr软件,阿帕奇正常运行的环境这个环境就是apr。 2.安装apr-util软件,主要提供针对apr环境的管理工具, 3.安装阿帕奇软件即httpd软件。 如上图所示,就是三个软件的…

animator及metahuman dna解析

复现原始dna文件转成174 bs dna文件 METAHUMAN51/Source/MetaHumanMeshTracker/Private/api/FaceTrackingAPI.cpp的 pcaRigCreator是将原始dna转为gui control的pca的dna对象 METAHUMAN51/Source/MetaHumanMeshTracker/Private/nls/src/rig/RigLogic.cpp 是读取原始dna文件的…

15分钟学Go 第5天:数据类型

第5天:数据类型 在Go语言中,数据类型是构成程序的重要基础,它们定义了可以在程序中使用的数据特征。了解不同的数据类型及其用途将帮助我们更有效地编写Go代码。在本章节中,我们将详细探讨Go语言的基本数据类型。 1. 数据类型的…

2024软考网络工程师笔记 - 第3章.广域通信网

文章目录 广域网物理层特性1️⃣公共交换电话网 PSTN2️⃣本地回路3️⃣机械特性4️⃣电气特性 🕑流量与差错控制1️⃣流量与差错控制2️⃣流量控制——亭等协议3️⃣流控机制——滑动窗口协议4️⃣差错控制5️⃣差错控制——停等协议6️⃣差错控制——选择重发ARQ协…