Dubbo系列:远程过程调用(RPC)

2025-01-29 20:29
315
0

RPC(Remote Procedure Call Protocol)远程过程调用协议,允许本地程序像调用本地函数一样调用远程服务器上的函数或方法,而无需关心底层网络通信细节和远程服务器的具体实现,为分布式系统中不同节点间的通信提供了一种简单、高效、透明的方式。

目的:主要目的是为了实现分布式系统中不同节点之间的通信和协作,使各个节点能够共享资源和功能,提高系统的可扩展性和灵活性。

一、概念介绍

RPC协议是什么?

RPC调用过程中需要将参数编组为消息进行发送,接收方需要解组消息为参数,过程处理结果同样需要经编组、解组。消息由哪些部分构成及消息的表示形式就构成了消息协议。RPC调用过程中采用的消息协议称为RPC协议。

RPC协议规定请求、响应消息的个数。在TCP(网络传输控制协议)之上我们可以选用或自定义消息协议来完成我们的RPC消息交互。

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

RPC 是要做什么,RPC协议是规定怎么做。

RPC框架是什么?

封装好了参数编组、消息解组、底层网络通信的RPC程序开发框架,让我们可以直接在其基础上只需专注于我们的过程代码编码。

传统的webservice框架:Apache CXF、Apache Axis2、Java自带的JAX-WS等等。

新兴的微服务框架:Dubbo、spring cloud、Apache Thrift、ICE、GRPC等等。

RPC和RMI有什么区别?

RMI(remote method invocation)远程方法调用是oop领域中RPC的一种具体实现。

我们熟悉的webservice、restfull接口调用是RPC吗?

都是RPC,只是消息的组织方式、消息协议不同罢了。

二、RPC 工作流程

1、客户端调用

  • 本地函数调用:客户端应用程序代码中,开发者直接调用本地定义的函数,该函数实际上是 RPC 客户端代理函数,其参数为要传递给远程函数的参数。
  • 生成请求数据:RPC 客户端运行时库接收到调用后,根据调用的函数名、参数等信息,按照特定的格式生成请求数据,对参数进行序列化操作。

2、消息发送

  • 确定目标地址:客户端的 RPC 运行时系统根据配置或服务发现机制,确定要调用的远程服务的地址,包括服务器的 IP 地址和端口号等信息。
  • 网络传输:使用选定的通讯协议,如 TCP 或 UDP,将请求数据发送到服务器端指定的地址。

3、服务器接收与处理

  • 监听与接收:服务器端的 RPC 运行时系统在指定的端口上监听网络请求,当接收到客户端发送的请求数据后,将其从网络缓冲区中读取出来。
  • 解包与反序列化:对接收的请求数据进行解包操作,将字节流转换为服务器端能够理解的本地数据结构,并根据请求中的函数名,找到对应的本地函数进行调用,将解包后的参数传递给该函数。
  • 执行函数:服务器端应用程序代码中的相应函数被调用,执行具体的业务逻辑,处理客户端请求。

4、结果返回

  • 生成响应数据:服务器端函数执行完成后,将返回结果传递给服务器端的 RPC 运行时库,对结果进行封装,可能会进行序列化操作,将结果转换为适合网络传输的格式。
  • 发送响应:服务器端的 RPC 运行时系统使用与接收请求相同的通讯协议,将封装好的响应数据发送回客户端。

5、客户端接收与处理

  • 接收响应:客户端的 RPC 运行时系统接收服务器返回的响应数据,将其从网络缓冲区中读取出来。
  • 解包与反序列化:对响应数据进行解包和反序列化操作,将数据转换为客户端能够理解的格式,得到远程函数的执行结果。
  • 返回结果给调用者:将反序列化后的结果返回给最初发起函数调用的地方,使客户端程序能够继续执行后续的操作,就好像本地函数调用返回一样。

 

RPC(远程过程调用)中的通讯、寻址、序列化是其实现远程调用的关键技术

  • 通讯协议:如 TCP、UDP 等,用于在客户端和服务器之间传输数据,确保数据的可靠传输或高效传输。
  • 寻址技术:通过服务发现机制和地址解析方法,让客户端能够找到要调用的远程服务的地址。
  • 序列化与反序列化:将内存中的数据结构转换为字节流在网络上传输,并在接收端将字节流还原为内存中的数据结构。

传输方式和序列化会直接影响RPC的性能。

三、RPC如何实现安全的访问控制

RPC(远程过程调用)实现安全的访问控制可以从身份认证、授权、数据加密、访问控制列表等多个方面入手

1、身份认证

  • 基于令牌的认证:客户端在请求服务器之前,需要向认证服务器获取一个令牌,通常是一个包含用户身份信息和权限的加密字符串。客户端在每次 RPC 请求中携带该令牌,服务器接收到请求后,对令牌进行验证,解析出其中的用户身份和权限信息,以确定请求的合法性。例如 OAuth 2.0 协议,常用于 Web 应用和微服务架构中的身份认证。
  • 基于证书的认证:客户端和服务器都拥有由权威证书颁发机构(CA)颁发的数字证书。在建立连接时,双方通过交换证书来验证对方的身份。这种方式利用了公钥基础设施(PKI)的原理,保证了通信双方的身份真实性和不可抵赖性。常用于对安全性要求极高的金融、医疗等领域的 RPC 系统。

2、授权

  • 角色 - based 访问控制(RBAC):定义不同的角色,并为每个角色分配相应的权限。用户被分配到特定的角色,当客户端发起 RPC 请求时,服务器根据用户的角色来判断其是否具有执行相应操作的权限。例如,在一个企业资源管理系统中,管理员角色可能具有创建、删除用户的权限,而普通用户角色只有查询个人信息的权限。
  • Attribute-based 访问控制(ABAC):根据用户的属性(如部门、职位、工作年限等)、资源的属性(如资源的敏感程度、所属部门等)以及环境属性(如请求的时间、地点等)来动态地进行授权决策。例如,只有来自特定部门且在工作时间内的用户才能访问某些敏感资源。

3、数据加密

  • 传输层加密:在传输层使用加密协议,如 SSL/TLS,对 RPC 通信过程中的数据进行加密。SSL/TLS 会在客户端和服务器之间建立一个安全的加密通道,确保数据在传输过程中不被窃取或篡改。大多数现代 RPC 框架都支持与 SSL/TLS 的集成,如 gRPC 可以很方便地配置 TLS 加密。
  • 应用层加密:在应用层对 RPC 请求和响应数据进行加密。客户端在发送数据之前,使用特定的加密算法对数据进行加密,服务器接收到数据后再进行解密。这种方式可以对敏感数据进行更精细的加密保护,即使传输层的加密被破解,攻击者也难以获取明文数据。

4、访问控制列表(ACL)

  • IP 地址限制:服务器可以配置访问控制列表,只允许来自特定 IP 地址或 IP 地址段的客户端发起 RPC 请求。这种方式可以防止来自未知或不可信网络的访问。例如,企业内部的 RPC 服务可能只允许公司内部的 IP 地址段进行访问。
  • 端口限制:除了 IP 地址限制外,还可以对端口进行限制。服务器只监听特定的端口用于接收 RPC 请求,并且只允许经过授权的客户端连接到这些端口。同时,客户端也只能通过特定的端口发送 RPC 请求。

5、审计与监控

  • 日志记录:对所有的 RPC 请求和响应进行详细的日志记录,包括请求的时间、发起者、调用的方法、参数以及响应结果等信息。通过分析日志,可以及时发现异常的访问行为和潜在的安全威胁。例如,发现某个用户频繁尝试访问未授权的资源,可能是遭受了恶意攻击。
  • 实时监控:利用监控工具对 RPC 系统的运行状态进行实时监控,包括请求的流量、响应时间、错误率等指标。当发现异常的流量或行为时,及时发出警报,以便管理员能够迅速采取措施进行处理。




 

 

全部评论