RPC

RPC

RPC是什么?

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

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

RPC原理

1
2
3
4
5
6
7
// 本地
UserService service = new UserService();
User user = service.findById(1);

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

image-20240407161928531

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

核心是代理机制:

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

image-20240407162652843

RPC协议

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

消息由哪些部分构成及消息的表示形式就构成了消息协议。 RPC调用过程中采用的消息协议称为RPC协议。

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

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

  • 常见的RPC协议
    • image-20240407163012087

RPC框架

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

传统的webservice框架

  • Apache CXF
  • Apache Axis2
  • Java自带的 JAX-WS

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

新兴的微服务框架

  • Dubbo
  • Spring Cloud alibaba
  • Apache Thrift

为何使用RPC

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

其他相关

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

序列化工具

JDK Serializable

  • Java自带的序列化机制,通过实现java.io.Serializable接口来实现对象的序列化。

JSON-B / JSON-P

  • Java EE的一部分,用于JSON数据的绑定和解析。

Jackson

  • 一个快速的JSON处理工具,可以轻松地将Java对象转换成JSON格式,并且反过来将JSON字符串转换成Java对象。

Thrift

  • Apache Thrift是一个软件框架,用于进行可扩展且跨语言的服务的开发。

Protobuf (Protocol Buffers)

  • 由Google开发的一个数据描述语言,用于序列化结构化数据,如请求、响应、配置文件等。