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

ops/2024/10/24 20:32:16/

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/ops/128142.html

相关文章

【随手笔记】远程升级之如何平衡下载包大小与速率?

1. 远程升级基本信息 使用NB_BC26模组,通过AT指令使用TCP的协议与公司后台交互升级的固件为BIN文件,使用原始固件包升级,未使用差分方式原始固件包有110K,大小左右,固件的存储为外置的FLASH W25Q16,w25q16最小存储单位为页&#…

基于SpringBoot+Vue+uniapp微信小程序的宿舍报修系统的详细设计和实现

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

HuggingFace应用——自然语言处理(1):什么是NLP?什么是Transformer?

本篇文章属于HuggingFace应用——自然语言处理系列本篇文章对自然语言处理任务进行基本介绍参考资料:HuggingFace 文章目录 1 什么是NLP?2 主流算法与模型梳理——时间顺序3 Transformer3.1 Transformer模型能做什么?Sentiment Analysis 语义…

计算广告第三版pdf

需要该书pdf版本的同学点赞,私信我:

Hallo 2:通过单张图像与音频生成1小时4K分辨率人像视频的人工智能技术解析

Hallo 2:通过单张图像与音频生成1小时4K分辨率人像视频的人工智能技术解析 近年来,随着人工智能技术的飞速发展,视频生成领域也在不断突破。特别是在虚拟主播、影视制作等行业中,如何高效地生成高质量人像视频已成为当下的热门话…

Linux命令(ubuntu)安装deb文件

Linux命令(ubuntu)安装deb文件 在Linux中,.deb 文件是 Debian 和基于 Debian 的系统(如 Ubuntu)使用的软件包格式。要安装 .deb 文件,您可以使用 dpkg 命令。以下是安装 .deb 文件的步骤: 打开…

Linux:sh脚本

文章目录 1 标头2 执行脚本文件3 数组4 传递参数5 运算符 && 分支语句6 循环语句6.1 for循环6.2 while循环6.3 until循环6.4 case语句 && read输入6.5 循环控制 7 函数8 文件、文件夹、字符串判断 && 示例 1 标头 #!/bin/sh指明了脚本中命令的解释器 …

构建后端为etcd的CoreDNS的容器集群(一)、生成自签名证书

笔者拟使用官方的etcd和CoreDNS容器镜像生成带自签名的分布式DNS容器集群。按计划需做生成自签名证书、部署etcd集群、配置CoreDNS以使用etcd作为后端共三步,本文为第一步。 一、生成自签名证书 1、准备CFSSL工具 官网下载: [rootlocalhost ~]# cd /o…