RPC框架核心技术

news2024/12/23 22:48:26

一、RPC框架整体架构

RPC Client && RPC Server
在这里插入图片描述
RPC Client
1、动态代理,根据lookUp信息(接口-实现-方法)动态创建出代理类,(创建代理类==RPC服务端的目标接口)。即Lookup为远端目标接口地址,创建调用目标接口代理。

2、上下文管理,主要为标识每个请求的sessionID,保证server端返回的结果找到对应的上下文。例如同时ABC三个请求从客户端发送到server去请求,上下文就用来标识server返回的ABC response对应客户端发来的ABC request。

处理好client的请求数据后,经过序列化、经由两端统一的协议,传输到server端,进行反序列化操作解析出目标接口、参数等信息,执行invoke调用后,将结果再次序列化传输。

RPC Server

1、分发器,将请求分发到sever实例(负载策略&容错)

2、过滤器,统一拦截,在server方法执行前后进行链路调用统计、超时统计等操作

3、线程模型,下面深入总结:

核心流程

在这里插入图片描述
1、创建接口代理类:从客户端开始,利用动态代理创建server目标接口代理
2、序列化:将入参对象序列化
3、协议组装:将序列化方式、协议版本、协议类型、方法签名等信息组装成一个协议包,交付给传输层进行发送

4、传输,server协议:传输层将协议包发送到sever端,server端将协议包解析,从中取出接口签名、入参对象字节流信息
5、server反序列化:反序列化操作,找出接口实现类(server端真实的服务实现),invoke执行目标方法
6、server将结果序列化:Server端将返回结果按照同样的序列化方式进行序列化操作。
7、server组装协议:同样,将序列化方式、协议版本、协议类型、方法签名等信息组装成一个协议包,发送给client

8、client解析协议,反序列化结果:Client接收sever返回的协议包,经过解析协议包中返回结果流,反序列化操作,得到RPC方法调用结果

完整的一个RPC请求流程 (provider、consumer、zk注册中心这这个是应用层的事情,不是rpc底层)

从RPC架构和流程不难看出,RPC核心技术包括:动态代理、序列化、协议、通讯(netty)、注册中心几块技术。动态代理就不多说了,可见下一篇博文:JDK、CGLib、Javassist实现动态代理。本次重点讨论序列化反序列化、传输协议、server端的线程模型。

二、序列化&反序列化

序列化载体:
xml:可扩展标记语言,自定义节点schema含义;但传输太多额外无用的数据(schema、节点解析)

Json:kv结构,易扩展

二进制字节流:紧凑,无额外多余数据,减少传输占用带宽;但字节顺序是固定的,例如user对象,1-8字节存储userId,8-16存储username;如果删减user属性,序列化反序列化时数据则对不上。则需要对属性添加tagId标识,tagID(sortedId)=1,则标识userId,tagId=2标识username;type标识属性类型(类型可知则知道对应占字节长度),value标识属性值;(其实这里用tagID标识属性名,根据属性名采用反射即可得到字段类型、长度信息;可能考虑效率,直接采用key标识)

这就定义好了采用字节流来序列化传输对象。

三、协议

常用的通讯协议、数据传输格式、底层传输协议、序列化方式、应用实现整理如下:
在这里插入图片描述
而项目中用的是restTemplate,(这里重点说一下它的LTS协议)

它是一个用于调用RESTful服务的java客户端库,它支持http和https协议。当使用https协议时,RestTemplate会使用TLS(transport layer security)协议来进行安全通讯。

TLS协议是一个加密协议,用于确保客户端和服务器之前的通信是安全的,它提供了认证、加密和数据完整性保护等功能,防止敏感数据被篡改或者窃听。

在使用RestTemplate进行https通信时,需要注意以下几点:
1、配置TLS版本:可以通过设置系统属性‘javax.net.ssl.keyStore’和’javax.net.ssl.keyStorePassword’,或者通过RestTemplate的‘DefaultUriBuilderFactory’来配置TLS八本。例如,可以使用以下代码配置TLS版本为TLSv1.2;

‘’‘java
System.setProperty(“https.protocols”,“TLSv1.2”);
‘’’

2、验证服务器证书:RestTemplate会默认验证服务器的证书,可以通过设置‘SimpleClientHttpRequestFactory’的‘setHostnameVerifier’方法来自定义证书验证逻辑。例如,可以使用以下代码跳过证书验证;
‘’’java
SumpleCilentHttpRequestFactory factory = new SumpleCilentHttpRequestFactory ();
factory.setHostnameVerifier((hostname.session) -> true);
RestTemplate restTemplate = new RestTemplate (factory);
‘’’

3、使用受信任的证书:如果服务器使用的是自签名或者由私有CA颁发的证书,需要将服务器的证书导入到Java的信任库中。可以使用keytool命令将证书导入信任库,然后代码中指定信任库的路径。例如,可以使用以下代码指定信任库的路径:
‘’’java
System.setProperty(“javax.net.ssl.trustStore”,“/path/to/your/truststore”);
System.setProperty(“javax.net.ssl.trustStorePassword”,“your_password”);
‘’’

通过以上配置,就可以使用RestTemplate进行https请求,并通过TLS协议进行加密和认证。

https://blog.csdn.net/Daybreak1209/article/details/80509964

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

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

相关文章

localStorage是什么?有哪些特点?

localStorage的主要作用是本地存储,它可以将数据按照键值对的方式保存在浏览器中,直到用户或者脚本主动清除数据,否则该数据会一直存在。也就是说,使用了本地存储的数据将被持久化保存。 localStorage与sessionStorage的区别是存…

Cpolar+Tipas:在Ubuntu上搭建私人问答网站,为您提供专业的问题解答

文章目录 前言2.Tipask网站搭建2.1 Tipask网站下载和安装2.2 Tipask网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道(云端设置)3.3 Cpolar稳定隧道(本地设置) 4. 公网访问测试5. 结语 前…

什么是JavaScript中的严格模式(strict mode)?应用场景是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 严格模式(Strict Mode):⭐ 使用场景⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&…

shell脚本指令:for循环、函数、数组、grep等指令的使用

1、实现一个对数组求和的函数,数组通过实参传递给函数 2、写一个函数,输出当前用户的uid和gid 并使用变量接收结果 #!/bin/bash echo "请输入一个数组" read -a arr function add_arr() {var1${#arr[*]}for i in ${arr[*]} do((sumi))doner…

技术解码 | GB28181/SIP/SDP 协议--EasyGBS国标GB28181平台国标视频技术SIP解析

EasyGBS国标视频云服务是基于国标GB/T28181协议的视频能力平台,可实现的视频功能包括:实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强,支持将接入的视频流进行全终端、全平台分发&#…

中国人民大学与加拿大女王大学金融硕士——人生总要逼自己一把

我们每个人都是一个独特而丰富的个体,身上蕴藏着各种潜力和可能性。要不断去开发自己的潜能,不断学习和提升自己的知识和技能,保持对新知识和趋势的敏感。想要在职场上走得更远,就要逼自己一把,在职继续攻读硕士学位是…

82 # koa-bodyparser 中间件的使用以及实现

准备工作 安装依赖 npm init -y npm i koakoa 文档:https://koajs.cn/# koa 中不能用回调的方式来实现,因为 async 函数执行的时候不会等待回调完成 app.use(async (ctx, next) > {console.log(ctx.path, ctx.method);if (ctx.path "/login…

518抽奖软件,是否会重复中奖,还是没人只能抽中一次

518抽奖软件简介 518抽奖软件,518我要发,超好用的年会抽奖软件,简约设计风格。 包含文字号码抽奖、照片抽奖两种模式,支持姓名抽奖、号码抽奖、数字抽奖、照片抽奖。(www.518cj.net) 不会重复中奖 类似抽奖箱的概念&#xff0c…

【1++的数据结构】之哈希(二)

👍作者主页:进击的1 🤩 专栏链接:【1的数据结构】 文章目录 一,前言二,位图1. 位图2. 位图的应用 三,布隆过滤器 一,前言 上一节我们讲解了哈希表,简单的了解了哈希思想…

探索工业4.0:数字孪生如何重塑工业生产流程?

在过去的几十年里,工业生产经历了从机械化、自动化到数字化的巨大转变。随着工业4.0的到来,我们正处于第四次工业革命的边缘,这次革命将由数字孪生技术引领。本文将深入探讨数字孪生在工业生产中的应用和潜力。 数字孪生(Digital …

第六章 进程管理与系统监控

第六章 进程管理与系统监控 ​ 一个具有较好的安全性和稳定性的系统是用户所需要的。无论进行何种操作和业务处理,用户都希望系统始终处于安全、稳定的状态。因此,即时地进行系统的进程管理和系统监控工作是保证系统安全、稳定的状态。 1.进程管理 1.…

C++项目实战——基于多设计模式下的同步异步日志系统-⑥-日志等级类与日志消息类设计

文章目录 专栏导读日志等级类设计日志等级划分to_string函数设计日志等级类整理 日志消息类设计 专栏导读 🌸作者简介:花想云 ,在读本科生一枚,C/C领域新星创作者,新星计划导师,阿里云专家博主,…

第4篇 vue的 ECMAScript 6的学习

一 ECMAScript 6 1.1 ECMAScript 6 ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现(另外的 ECMAScript 方言还有 Jscript 和 ActionScript)。 因此,ES6 既是一个历史名词,也…

java+ssm+mysql高校图书管理系统

项目介绍: 本系统为基于jspssmmysql的高校图书管理系统,包含管理员、学生角色,功能如下: 管理员(高级管理和普通管理):用户管理(管理员和学生管理);图书管理…

ps制作gif动图

最后存储就可以了

问道管理:历史市净率在哪看?

市净率是评价一家企业股票价格是否合理的一项重要指标,并且也能够反映企业的财务状况。前史市净率则是指某家企业在曩昔一段时间内(比方一年或三年)的市净率平均值。那么,前史市净率在哪里能够查询呢?本文将从多个视点…

华为OD机试 - 一种字符串压缩表示的解压(Java 2022 Q4 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路1、题意2、根据题意,不合法方式如下:3、解题思路 五、Java算法源码六、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为O…

【CSS系列】writing-mode —— 文字方向(水平/垂直;左右/右左)

文章目录 一、引子二、writing-mode1.语法horizontal-tb(默认:水平方向,文字 从左到右,行 从上到下)vertical-rl(垂直方向,文字 从上到下,行 从右到左)vertical-lr&#…

Go基础16-defer的运作机制及常见用法

defer的运作离不开函数,这至少有两层含义: ● 在Go中,只有在函数和方法内部才能使用defer; ● defer关键字后面只能接函数或方法,这些函数被称为deferred函数。defer将它们注册到其所在goroutine用于存放deferred函数…

IAM、EIAM、CIAM、RAM、IDaaS 都是什么?

后端程序员在做 ToB 产品或者后台系统时,都不可避免的会遇到账号系统、登录系统、权限系统、日志系统等这些核心功能。这些功能一般都是以 SSO 系统、RBAC 权限管理系统等方式命名,但这些系统合起来有一个专有名词:IAM。 IAM IAM 是 Identi…