RPC编程:RPC框架设计目标
一:前导知识
Http是超文本传输协议,跨平台性非常好。Http可以传输文本,更多的时候传输的是文本,我们也是可以传输二进制的,我们基于Http进行下载的时候,就是走的Http协议。
Tcp协议,处理的时候会更麻烦,我们需要自己开发服务器,对外提供服务,我们可以使用socket,可以使用nio,可以使用Netty。作为服务器端,暴露服务的时候,我们直接将我们的service暴露出来,这样的话业务性会很好,只不过我们的服务端代码实现起来会很繁琐。当我们进行调用的时候,这种方式比Http协议请求的方式会更加的方便,设计的好的话我们甚至可以在代码中直接service.业务性更强。
对于TCP这中方式的话,我们的客户端也是需要处理TCP协议的数据的,这样的话学位也是有一丢丢繁琐
TCP协议作为一种长链接协议。不需要进行频繁的三次握手四次挥手,Http协议底层也是TCP协议,但是高层进行了封装,需要频繁的关闭连接,这样就需要频繁的握手挥手,再加上应用层协议协议头内容很多,导致传输的内容负担较大。
通过RPC进行过程调用的时候,我们往往需要传递这样的几个参数:类的名字,方法的名称,方法的参数,就可以找到唯一的一个service中的方法,进而可以提供服务。服务提供完之后,再通过网络传输给我们的调用方。一个是有网络,另外一个通过页面。
通信的时候,我们基于Http协议还是TCP协议(不要再说底层就是TCP了!!!)的区别如下:

二:RPC框架的设计
1:设计目标
让调用者像调用本地方法一样,调用远端的服务方法。调用者就是我们的客户端,远端的服务方法就是我们的服务方service层中的某一个方法。基于这样的RPC来讲,我们的代码业务含义就会非常强。
我们想要达到这样的一个设计目标,我们必须需要解决两个问题:网络通讯+传递数据,接收返回值。在设计RPC的时候我们要这两个问题封装掉,让低级程序员使用的时候,达到上述的目的即可。
2:目标思路分析
1):通讯方式
通讯方式,我们可以选择Http协议或者选择TCP协议,选择Http协议的话,我们大概率就不需要自己写服务了。
如果我们使用TCP协议的话,我们大概率的通讯工具使用的是Netty、Socket、Nio、Mina等等
2):自定义协议
当然,如果我们使用TCP的话,我们可能还需要自定义协议。我们自定义协议在Netty文章中就已经探讨过了,我们自定义的协议包括两大部分:协议头+协议体(消息主体、协议主体)

3):序列化方式
协议当中很重要的一个组成部分就是序列化,就是我们要传输的数据要以什么样的数据进行序列化。JSON,protobuf,hessian?
序列化是协议的一个组成部分,只不过他非常的重要,我们往往把他给拿出来单独来讲。
二进制协议与非二进制协议:
这个协议,什么是二进制,什么不是二进制,网络传输的时候不都是二进制的吗?对了网络传输的时候都是二进制,网络底层通讯走的都是二进制,而我们现在考虑的序列化是站在Java的角度考虑这个问题。是网络传输的上游,我们走JSON的这样的方式的话,我们走的是{id:10,age:30},如果走的时候Java的序列化的话,那么就是ObjectOutputStream转成的byte[],当这些数据走到传输层的时候,就会变成二进制。
4):客户端增加远程代理类
当请求达到服务端之后,我们的服务提供方也就是服务器,可以拿到客户端请求的类的名称、方法的名称、方法的参数。服务端就可以去调用这个方法,然后在这个方法当中去进行访客户端中的Dao,甚至Redis,MQ等其他资源,当业务结果处理完毕之后,将方法的返回结果基于序列化协议通过网络返回给调用端。
通过代理类为原始类增加额外功能。也就是在客户端当中使用了远端代理,通过代理的思想,完成对远端服务的功能的包含,以及外功能的编写。

补充说明:
我们一般将远端的服务方法叫做skeleton(骨架)代理类叫做(stub)这个stub是远端服务的代理,这个代理即完成网络通讯,又完成传输数据。

3:衍生问题
1):注册中心
服务端有多个实例,这种情况下就必须考虑注册中心的功能了。注册中心有所有的服务的注册信息。
负载均衡:基于轮训或者是加权的一些策略,将请求打到对应的服务上
管理服务:那些服务是可用的、健康的。定期的发心跳,管理服务。
解耦合:不需要直接绑定到对应的服务上,而是都跟我们的注册中心发声联系。
注册中心的核心作用就是:服务的治理
1:负载均衡
2:健康管理 服务管理(心跳 重试【延迟队列时间论算法】)
3:解耦合 耦合性更低
4:熔断
5:限流 虽然做了限流,但是流量过大,我们必须做限流。
相关文章:
RPC编程:RPC框架设计目标
一:前导知识 Http是超文本传输协议,跨平台性非常好。Http可以传输文本,更多的时候传输的是文本,我们也是可以传输二进制的,我们基于Http进行下载的时候,就是走的Http协议。 Tcp协议,处理的时候…...
RBAC 权限模型介绍
RBAC 权限: 一、关系: 这基于角色的访问控制的结构就叫RBAC结构。 二、RBAC 重要对象: 用户(Employee):角色施加的主体;用户通过拥有某个或多个角色以得到对应的权限。角色(Role&…...
西电面向对象程序设计核心考点汇总(期末真题)
文章目录前言一、往年真题与答案1.1 改错题1.2 读程题1.3 面向对象程序设计二、易错知识点2.1 构造函数2.2 静态成员变量和静态成员函数2.3 权限2.4 继承2.5 多态总结前言 主要针对西安电子科技大学《面向对象程序设计》的核心考点进行汇总,包含总共8章的核心简答。…...
判断一个用字符串表达的数字是否可以被整除
一.问题引出 当一个数字很大的时候,我们常用字符串进行表达,(超过了int和long等数据类型可以存储的最大范围),但是这个时候我们该如何判断他是否可以被另一个数整除呢? 这个时候我们不妨这样来考虑问题,每次将前边求模之后的数保存下来,然后乘以10和这一位的数字进行相加的操…...
这是一款值得开发人员认真研究的软件,数据库优化,应用服务器安全优化...
1.查询数据库死锁相关信息2.查看数据库的链接情况3.当前实例上的所有用户4.创建数据库独立密码5.查看数据库使用的端口号6.当前数据库设置的最大连接数7.当前数据库最大的理论可连接数8.当前数据库实例的连接数9.当前数据库连接数10.当前数据库连接超时设置11.当前sqlserver 超…...
栈与队列小结
一、理论基础1.队列是先进先出,栈是先进后出2.栈和队列是STL(C标准库)里面的两个数据结构。栈提供push和pop等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器。3.栈是以底层容器…...
SpringBoot整合(五)HikariCP、Druid数据库连接池—多数据源配置
在项目中,数据库连接池基本是必不可少的组件。在目前数据库连接池的选型中,主要是 Druid ,为监控而生的数据库连接池。HikariCP ,号称性能最好的数据库连接池。 在Spring Boot 2.X 版本,默认采用 HikariCP 连接池。而…...
ShardingSphere水平、垂直分库、分表和公共表
目录一、ShardingSphere简介二、ShardingSphere-分库分表1、垂直拆分(1)垂直分库(2)垂直分表2、水平拆分(1)水平分库(2)水平分表三、水平分库操作1、创建数据库和表2、配置分片的规则…...
《分布式技术原理与算法解析》学习笔记Day24
分布式缓存 在计算机领域,缓存是一个非常重要的、用来提升性能的技术。 什么是分布式缓存? 缓存技术是指用一个更快的存储设备存储一些经常用到的数据,供用户快速访问。 分布式缓存是指在分布式环境或者系统下,把一些热门数据…...
强化学习RL 02: Value-based Reinforcement Learning
DQN和TD更新算法。 目录 Review 1. Deep Q-Network(DQN) 1.1 Approximate the Q*(s,a) Function 1.2 Apply DQN to Play Game 1.3 Temporal Difference(TD) Learning 1.4 TD Learning for DQN 1.4.1 TD使用条件 condition 1.4.2 Train DQN using TD learning 1.5 summ…...
08_MySQL聚合函数
1. 聚合函数介绍什么是聚合函数聚合函数作用于一组数据,并对一组数据返回一个值。聚合函数类型AVG()SUM()MAX()MIN()COUNT()注意:聚合函数不能嵌套调用。比如不能出现类似“AVG(SUM(字段名称))”形式的调用。1.1 AVG和SUM函数可以对数值型数据使用AVG 和…...
「TCG 规范解读」词汇表
可信计算组织(Ttrusted Computing Group,TCG)是一个非盈利的工业标准组织,它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立,并采纳了由可信计算平台联盟(the Trusted Computing Platform Alli…...
第三阶段-03MyBatis 中使用XML映射文件详解
MyBatis 中使用XML映射文件 什么是XML映射 使用注解的映射SQL的问题: 长SQL需要折行,不方便维护动态SQL查询拼接复杂源代码中的SQL,不方便与DBA协作 MyBatis建议使用XML文件映射SQL才能最大化发挥MySQL的功能 统一管理SQL, 方…...
从0开始学python -41
Python3 命名空间和作用域 命名空间 先看看官方文档的一段话: A namespace is a mapping from names to objects.Most namespaces are currently implemented as Python dictionaries。 命名空间(Namespace)是从名称到对象的映射,大部分的命名空间都是…...
如何将Google浏览器安装到D盘(内含教学视频)
如何将Google浏览器安装到D盘(内含教学视频) 教学视频下载链接地址:https://download.csdn.net/download/weixin_46411355/87503968 目录如何将Google浏览器安装到D盘(内含教学视频)教学视频下载链接地址:…...
三战阿里测试岗,成功上岸,面试才是测试员涨薪真正的拦路虎...
第一次面试阿里记得是挂在技术面上,当时也是技术不扎实,准备的不充分,面试官出的面试题确实把我问的一头雾水,还没结束我就已经知道我挂了这次面试。 第二次面试,我准备的特别充分,提前刷了半个月的面试题…...
Java代码弱点与修复之——ORM persistence error(对象关系映射持久错误)
弱点描述 ORM persistence error, ORM 持久化错误 。表示 ORM 工具在尝试将对象保存到数据库中时出现了问题。可能的原因包括: 数据库连接错误:ORM 工具无法连接到数据库,或者连接到数据库的权限不足。数据库表结构错误:ORM 工具无法正确映射对象和数据库表之间的关系,可…...
原始GAN-pytorch-生成MNIST数据集(原理)
文章目录1. GAN 《Generative Adversarial Nets》1.1 相关概念1.2 公式理解1.3 图片理解1.4 熵、交叉熵、KL散度、JS散度1.5 其他相关(正在补充!)1. GAN 《Generative Adversarial Nets》 Ian J. Goodfellow, Jean Pouget-Abadie, Yoshua Be…...
Vue下载安装步骤的详细教程(亲测有效) 1
目录 一、【准备工作】nodejs下载安装(npm环境) 1 下载安装nodejs 2 查看环境变量是否添加成功 3、验证是否安装成功 4、修改模块下载位置 (1)查看npm默认存放位置 (2)在 nodejs 安装目录下,创建 “node_global…...
[Android Studio] Android Studio生成数字证书,为应用签名
🟧🟨🟩🟦🟪 Android Debug🟧🟨🟩🟦🟪 Topic 发布安卓学习过程中遇到问题解决过程,希望我的解决方案可以对小伙伴们有帮助。 📋笔记目…...
HGVE-2025-E001引用语法中和不当导致的SQL注入漏洞
文章目录环境BUG/漏洞编码症状触发条件解决方案环境 系统平台:N/A 版本:9.0.1 BUG/漏洞编码 HGVE-2025-E001 症状 PostgreSQL的引用API在文本编码验证失败时未能正确中和引用语法,导致在某些使用模式下可能引发SQL注入漏洞。 具体来说&…...
FPGA车牌识别demo 软件用的Vivado2020.2 板子用的正点原子达芬奇ProA7-...
FPGA车牌识别demo 软件用的Vivado2020.2 板子用的正点原子达芬奇ProA7-100T,下载到板子插好摄像头显示屏即可用。 功能包括:基于阈值的车牌识别,字符分割及HDMI显示,特征识别与字符库进行匹配,将捕捉到的车牌打印到串口显示。实验…...
MoE 前沿综述总结
综述时间线:2017 - 2025 作者:贾维斯 生成时间:2026-03-13综述导读 这篇综述系统梳理了 Mixture-of-Experts (MoE) 从 2017 年诞生到 2024 年开源里程碑的完整演进路径。MoE 的核心思想非常直观:通过稀疏激活(每个输…...
基于单片机的智能抢答器的设计(有完整资料)
资料查找方式:特纳斯电子(电子校园网):搜索下面编号即可编号:T1092204C设计简介:本设计是基于单片机的智能抢答器的设计,主要实现以下功能:1.抢答器同时供8名选手使用,分…...
基于Matlab的《液体动静压轴承》回油槽径向静压轴承图谱程序
基于matlab的根据《液体动静压轴承》编写的有回油槽径向静压轴承的可显示承载能力、压强、刚度及温升等图谱.程序已调通,可直接运行。打开MATLAB就闻到机油味是怎么回事?最近折腾了个有意思的玩意——基于《液体动静压轴承》教材搞的径向静压轴承仿真程序…...
能用脚本就别用Agent。
今天早上发了那篇文章以后,有很多朋友跟我讨论。发现大家问得最多的一个问题是,你天天说Agent和Skills是未来,那你自己平时干活是不是什么都丢给Agent?我说实话,还真不是。正好借这个机会我再补充一下,因为…...
EPICOR KINECT物料其他入库接口
系统版本:EPICOR KINECT 一、需求描述,作为ERP系统我们经常需要提供给第三方系统接口,今天的需求就是为WMS系统提供杂项入库接口即其他入库。 二、思路, 1、使用F12查看EPICOR KINECT调用的接口参明细 2、使用EPICOR 自带的function实现这些接口的调用 3、暴露入参和出…...
【免费下载】 CreamInstaller 使用教程
CreamInstaller 使用教程 【免费下载链接】CreamInstaller Automatically finds all installed Steam, Epic and Ubisoft games with their respective DLC-related DLL locations on the users computer, parses SteamCMD, Steam Store and Epic Games Store for user-selecte…...
告别传统复制粘贴!yanky.nvim的剪贴板历史管理功能详解
告别传统复制粘贴!yanky.nvim的剪贴板历史管理功能详解 【免费下载链接】yanky.nvim Improved Yank and Put functionalities for Neovim 项目地址: https://gitcode.com/gh_mirrors/ya/yanky.nvim yanky.nvim是一款专为Neovim打造的剪贴板增强插件ÿ…...
180天打造180个网站:Jennifer Dewalt的自学编程传奇之旅
180天打造180个网站:Jennifer Dewalt的自学编程传奇之旅 【免费下载链接】jennifer_dewalt a.k.a. 180 Websites in 180 Days 项目地址: https://gitcode.com/gh_mirrors/je/jennifer_dewalt Jennifer Dewalt通过"180天180个网站"的挑战࿰…...
