一文搞懂RPC

简介: 一文搞懂RPC

分布式服务化与 SOA/ESB 区别

服务汇聚到ESB:

  • 暴露和调用
  • 增强和中介
  • 统计和监控

分布式服务化作为SOA的另一种选择,以不同方式把ESB的一些功能重做了一遍。

SOA/ESB:代理调用,直接增强。

1 RPC是什么

RPC,Remote Procedure Call,远程过程调用。

过程 就是业务处理、计算任务,也就是程序,像调用本地方法一样调用远程方法。


RPC的概念与技术早在1981年由Nelson提出。1984年,Birrell和Nelson把其用于支持异构型分布式系统间的通讯。Birrell的RPC 模型引入存根进程( stub) 作为远程的本地代理,调用RPC运行时库来传输网络中的调用。

Stub和RPC runtime屏蔽了网络调用所涉及的许多细节,特别是,参数的编码/译码及网络通讯是由stub和RPC runtime完成的,因此这一模式被各类RPC所采用。


这到底是如何能做到本地方法调用时转换成远程呢?

RPC采用Client-Server结构,通过request-response消息模式实现。


  • RPC VS RMI
    RMI,remote method invocation,远程方法调用是OOP领域中RPC的一种具体实现。
  • webservice、restfull接口调用是RPC吗?
    都是RPC,仅消息的组织方式及消息协议不同。


远程过程调用较本地调用区别:

  • 速度相对慢
  • 可靠性减弱


RPC原理

// 本地
UserService service = new UserService();
User user = service.findById(1);
// RPC
UserService service = Rpcfx.create(UserService.class, url);
User user = service.findById(1);

1.png

  1. 客户端处理过程中调用Client stub (就像调用本地方法一样),传递参数
  2. Client stub将参数编组为消息,然后通过系统调用向服务端发送消息
  3. 客户端本地操作系统将消息从客户端机器发送到服务端机器
  4. 服务端操作系统将接收到的数据包传递给Server stub
  5. Server stub 解组消息为参数
  6. Sever stub再调用服务端的过程,过程执行结果以反方向的相同步骤响应给客户端


核心是代理机制:

  1. 本地代理存根Stub,通过动态代理或 AOP 拦截请求
  2. 本地序列化反序列化
  3. 网络通信
  4. 远程序列化反序列化
  5. 远程服务存根Skeleton
  6. 调用实际业务服务
  7. 原路返回服务结果
  8. 返回给本地调用方


2.png

流程需要解决什么问题呢?


3 RPC协议

RPC调用过程中需要将参数编组为消息进行发送,接收方需要解组消息为参数,过程处理结果同样需要经编组、解组。

消息由哪些部分构成及消息的表示形式就构成了消息协议。

RPC调用过程中采用的消息协议称为RPC协议。

RPC协议规定请求、响应消息的格式在TCP (网络传输控制协议)上可选用或自定义消息协议来完成RPC消息交互

我们可以选用通用的标准协议(如: http、 https) ,也可根据自身的需要定义自己的消息协议!

  • 常见的RPC协议

image.png

4 RPC框架

封装好参数编组、消息解组、底层网络通信的RPC框架,让我们站在巨人肩膀上,只需专注过程代码的编写。

传统的webservice框架:

  • Apache CXF


4.png


  • Apache Axis2


5.png


  • Java 自带的JAX-WS

6.png

  • webService框架大多基于标准的SOAP协议。

新兴的微服务框架

  • Dubbo

7.png

  • spring cloud alibaba

8.png

  • Apache Thrift

9.png

为何使用RPC

  • 服务化
  • 可重用
  • 系统间交互调用


5 RPC相关术语

  • Client、 Server、 calls、 replies、service、programs、procedures、version、marshalling(编组)、unmarshalling(解组)
  • 一个网络服务由一个或多个远程程序集构成
  • 一个远程程序实现一个或多个远程过程
  • 过程、过程的参数、结果在程序协议说明书中定义说明
  • 为兼容程序协议变更、一个服务端可能支持多个版本的远程程序




目录
相关文章
|
Kubernetes 关系型数据库 MySQL
k8s学习--利用helm部署应用mysql,加深helm的理解
k8s学习--利用helm部署应用mysql,加深helm的理解
992 0
|
缓存 监控 负载均衡
Java一分钟之-Ehcache:分布式缓存系统
【6月更文挑战第17天】**Ehcache是Java的开源缓存库,支持本地和分布式缓存,提供负载均衡、数据复制和容错能力。常见问题包括网络分区导致的数据不一致、缓存雪崩和配置不当引起的性能瓶颈。解决策略涉及选择强一致性策略、设置合理缓存过期时间和监控调整配置。使用Ehcache需添加相关依赖,并配置分布式缓存,如示例所示,通过CacheManager创建和管理缓存。实践中,持续监控和优化配置至关重要。**
379 1
tasks.json、launch.json、c_cpp_properties.json配置
tasks.json、launch.json、c_cpp_properties.json配置
336 0
|
Linux 编译器 测试技术
嵌入式 Linux 下的 LVGL 移植
嵌入式 Linux 下的 LVGL 移植
721 0
|
SQL 存储 容灾
关于主从延迟,一篇文章给你讲明白了!
在实际的生产环境中,由单台MySQL作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面 因此,一般来说都是通过集群主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力进行部署与实施总结MySQL主从集群带来的作用是:提高数据库负载能力,主库执行读写任务(增删改),备库仅做查询。提高系统读写性能、可扩展性和高可用性。数据备份与容灾,备库在异地,主库不存在了,备库可以立即接管,无须恢复时间。用于记录数据库执行的写入性操作(不包括查询)信息,以二进制的形式保存在磁盘中。可以简单理解为记录的就是sq
2140 0
|
存储 机器学习/深度学习 缓存
CPU片上环互联的侧信道攻击
本研究提出了首个利用CPU环互联争用(ring interconnect contention)的微架构侧信道攻击。有两个问题使得利用侧信道变得异常困难:首先,攻击者对环互联的功能和架构知之甚少;其次,通过环争用学习到的信息本质上是带有噪声的,并且有粗糙的空间粒度。为了解决第一个问题,本文对处理环互联上的复杂通信协议进行了彻底的逆向工程。有了这些知识可以在环互联上构建了一个跨核隐蔽信道,单线程的容量超过 4 Mbps,这是迄今为止不依赖共享内存的跨核信道的最大容量。为了解决第二个问题,利用环争用的细粒度时间模式来推断受害者程序的秘密。通过从易受攻击的 EdDSA 和 RSA 实现中提取key位
202 0
|
存储 编译器 C语言
C语言之数据存储
C语言之数据存储
127 0
|
前端开发 数据库
@Param注解的作用
Param注解的作用 1.便于传递多个参数 (1)Mapper层
653 0
|
关系型数据库 MySQL 数据库
Mysql5.7实现主从 延迟数据复制
Mysql5.7实现主从 延迟数据复制