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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/56809.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java网络编程-简单的API调用

Get请求 - 无参数 安装依赖库 首先需要安装一个库&#xff1a; Okhttp3&#xff0c;这是一个非常流行的 HTTP 库&#xff0c;可以简单、快速的实现 HTTP 调用。 安装 Okhttp3 的方式是在 pom.xml 文件中增加依赖&#xff1a; <!-- https://mvnrepository.com/artifact/co…

【算法】哈希表:49.字母异位词分组

目录 1、题目链接 2、题目介绍 3、解法 初始化设定--图解 步骤图解 4、代码 1、题目链接 49. 字母异位词分组 - 力扣&#xff08;LeetCode&#xff09; 2、题目介绍 3、解法 字母异位词的本质是字符相同但排列不同。因此&#xff0c;我们可以对字符串进行排序&#xf…

YOLOv8实战水果识别【数据集+YOLOv8模型+源码+PyQt5界面】

本文采用YOLOv8作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv8以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对水果数据集进行训练和优化&#xff0c;该数据集包含丰富的水果图像样本&#xf…

零基础Java第七期:方法的使用

一、方法的概念与使用 1.1. 方法的概念 方法就是一个代码片段. 类似于 C 语言中的 "函数"。方法存在的意义&#xff1a; 是能够模块化的组织代码(当代码规模比较复杂的时候)做到代码被重复使用, 一份代码可以在多个位置使用让代码更好理解更简单直接调用现有方法开…

Solidity基础语法

Solidity的在线编辑器&#xff1a;https://remix.ethereum.org/ 一、合约结构 1、SPDX许可标识&#xff1a;指定代码的开源许可 2、pragma指令&#xff1a;声明Solidity版本 3、导入语句&#xff1a;引入其他合约或库 4、合约声明&#xff1a;使用contract关键字 5、状态变量&…

直流和交流变频压缩机工作原理

直流变频压缩机工作原理&#xff1a; 压缩机定子产生旋转磁场与转子永磁磁场直接作用&#xff0c;实现压缩机运转。转子是永磁体&#xff0c;没有线圈/绕组&#xff0c;无需外部供电&#xff0c;不产生电能损耗&#xff0c;效率高、节能&#xff1b;直流变频压缩机属于同步控制…

uboot中mmc是使用

进入uboot的界面后 mmc命令 mmc list #查看有哪些可用的mmc设备 mmc dev 0 #切换到mmc的0设备&#xff0c;一般是指SD卡 ls mmc 0:1 #查看mmc 0设备&#xff08;sd卡&#xff09;中1分区保存的信息 ls mmc 0:2 #查看mmc 0设备&#xff08;sd卡&#xff09;中2分区保存的信…

Leetcode 1129. 颜色交替的最短路径

1.题目基本信息 1.1.题目描述 给定一个整数 n&#xff0c;即有向图中的节点数&#xff0c;其中节点标记为 0 到 n – 1。图中的每条边为红色或者蓝色&#xff0c;并且可能存在自环或平行边。 给定两个数组 redEdges 和 blueEdges&#xff0c;其中&#xff1a; redEdges[i] …

顺序表算法题【不一样的解法!】

本章概述 算法题1算法题2算法题3彩蛋时刻&#xff01;&#xff01;&#xff01; 算法题1 力扣&#xff1a;移除元素 我们先来看这个题目的要求描述&#xff1a; 把与val相同数值的元素移除掉&#xff0c;忽略元素的相对位置变化&#xff0c;然后返回剩下与val值不同的元素个数…

基于SpringBoot+Vue+uniapp的涪陵区特色农产品交易系统的详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的视频演示 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

pytest中@pytest.fixture常用顺序function

ytest中pytest.fixture用法讲解 1、测试函数开始之前2、执行测试函数&#xff1a;3、测试函数结束后&#xff1a; 备注&#xff1a;内容来自chatGPT 在 pytest 中&#xff0c;pytest.fixture 是一个非常强大的功能&#xff0c;用于设置测试所需的环境和状态。它可以通过 scope…

AP上线的那些事儿(1)capwap建立过程、设备初始化以及二层上线

1、了解FITAP与AC的建立过程 之前我们已经知道了FATAP与FIT是一对双胞胎一样的兄弟&#xff0c;FAT哥哥能够直接独立使用当AP桥接、路由器等&#xff0c;而弟弟FIT则比较薄弱&#xff0c;独自发挥不出功效&#xff0c;需要一位师傅&#xff08;AC&#xff09;来带领&#xff0c…

ssm配置模式

新版 用Java类&#xff0c;全注解demo案例 1. AppConfig.java (Spring主配置类)package com.example.config;import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.cont…

MATLAB实现AM调制解调

1.基本概念 1.1 AM调制原理 调幅就是使载波的振幅随调制信号的变化规律而变化。基带信号m(t)与直流分量A0相加&#xff0c;然后和高频载波相乘实现AM信号的调制&#xff0c;如图1所示。 1.2 AM解调原理 AM信号经过信道传输&#xff0c;引入噪声后&#xff0c;再和载波相乘&…

OpenCV之换脸技术:一场面部识别的奇妙之旅

在这个数字化与智能化并进的时代&#xff0c;图像处理技术日益成为连接现实与虚拟世界的桥梁。其中&#xff0c;换脸技术作为一项颇受欢迎且富有挑战性的应用&#xff0c;不仅让人惊叹于技术的魔力&#xff0c;更在娱乐、影视制作等领域展现了无限可能。今天&#xff0c;我们就…

arp欺骗及其实验

ARP欺骗&#xff08;ARP Spoofing&#xff09;是一种网络攻击技术&#xff0c;攻击者通过伪造ARP&#xff08;地址解析协议&#xff09;消息&#xff0c;将其MAC地址与目标IP地址关联&#xff0c;从而实现对网络流量的截获、篡改或重定向。以下是ARP欺骗的详细信息&#xff1a;…

怎么修改编辑PDF的内容,有这4个工具就行了。

PDF 软件在现代的办公或者是学习当中的应用非常广泛&#xff0c;编辑PDF内容对很多人来说也是一件常有的事情。如果有了PDF 编辑软件&#xff0c;查看&#xff0c;编辑&#xff0c;修改&#xff0c;分享也会变得更加方便简单&#xff0c;所以今天要给大家介绍几款这样的工具。 …

python-库

python-库 常用库 仅个人笔记使用&#xff0c;感谢点赞关注 常用库 dill&#xff1a;对象序列化 目前仅专注于 NLP 大模型 机器学习和前后端的技术学习和分享 感谢大家的关注与支持&#xff01;

vue特效,一片动态星空

vue实现漂亮星空&#xff0c;超级简单 1.创建vue项目&#xff1a; vue create demo 2.注册vuecli : npm i element-ui -S 3.加载依赖 &#xff1a;npm i 4.运行项目 :npm run serve <!DOCTYPE html> <html lang"en"> <head><…

Linux SSH免密登录

生成密钥-默认 出现三个提示步骤,直接回车即可 看到下图的提示的时候,你已经生成密钥成功 ssh-keygen -t rsa 生成密钥-定制化 与默认的步骤一致,唯一不同的是命令,话不多说,上命令 ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_new-t rsa&#xff1a;指定密钥类型为 RSA。…