RPC 如何做到 服务调⽤者可以像调⽤当地接⼝⼀样调⽤长途的服务提供者 ...

锦通  论坛元老 | 2025-2-12 17:17:06 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1015|帖子 1015|积分 3045

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
RPC(Remote Procedure Call,长途过程调用)的焦点目的是让服务调用者能够像调用当地接口一样调用长途服务提供者。为了实现这一目的,RPC 框架通常通过以下几个关键步骤和技术来实现:

1. 定义服务接口



  • 目的:让调用者知道长途服务提供者提供了哪些方法。
  • 实现

    • 服务提供者和调用者共享雷同的接口定义(如 Java 中的接口类)。
    • 接口定义了长途服务的所有方法及其参数和返回值范例。

  • 示例
    java
    复制
    1. public interface UserService {
    2.     User getUserById(int id);
    3. }
    复制代码

2. 代理模式(Stub 和 Skeleton)



  • 目的:隐蔽长途调用的复杂性,让调用者像调用当地方法一样调用长途方法。
  • 实现

    • Stub(客户端代理):在客户端生成一个代理对象,负责将当地调用转换为网络请求。
    • Skeleton(服务端代理):在服务端接收网络请求,并将其转换为对现实服务方法的调用。

  • 示例

    • 客户端调用 UserService.getUserById(1),现实上调用的是 Stub 对象。
    • Stub 将方法名、参数等序列化后发送到服务端。
    • Skeleton 接收到请求后,反序列化并调用真正的 UserService 实现。


3. 序列化与反序列化



  • 目的:将方法调用的参数和返回值转换为可以在网络中传输的格式。
  • 实现

    • 使用序列化技术(如 JSON、Protobuf、Thrift、Hessian 等)将对象转换为字节流。
    • 反序列化则将字节流转换回对象。

  • 示例

    • 客户端将 getUserById(1) 的参数 1 序列化为字节流。
    • 服务端将字节流反序列化为 1,并调用现实方法。


4. 网络通信



  • 目的:将序列化后的数据通过网络传输到服务端,并将效果返回给客户端。
  • 实现

    • 使用网络协议(如 TCP、HTTP、gRPC 等)举行数据传输。
    • 客户端通过网络将请求发送到服务端。
    • 服务端处置惩罚请求后,将效果通过网络返回给客户端。

  • 示例

    • 客户端通过 TCP 连接将请求发送到服务端。
    • 服务端处置惩罚请求后,通过同连续接返回效果。


5. 服务注册与发现



  • 目的:让客户端能够找到服务提供者的地址。
  • 实现

    • 使用服务注册中央(如 ZooKeeper、Consul、Nacos、Eureka 等)。
    • 服务提供者启动时,将自己的地址注册到注册中央。
    • 客户端调用时,从注册中央获取服务提供者的地址。

  • 示例

    • 服务提供者启动时,向注册中央注册 UserService 的地址 192.168.1.1:8080。
    • 客户端调用时,从注册中央获取 192.168.1.1:8080,并发送请求。


6. 负载均衡



  • 目的:在多个服务提供者之间分配请求,克制单点压力过大。
  • 实现

    • 客户端从注册中央获取多个服务提供者的地址。
    • 使用负载均衡算法(如轮询、随机、加权等)选择一个服务提供者。

  • 示例

    • 客户端从注册中央获取 192.168.1.1:8080 和 192.168.1.2:8080。
    • 使用轮询算法选择 192.168.1.1:8080 发送请求。


7. 透明化调用



  • 目的:让调用者无需关心长途调用的细节。
  • 实现

    • 通过动态代理或代码生成技术,自动生成 Stub 和 Skeleton。
    • 调用者只需调用当地接口,RPC 框架自动处置惩罚长途调用。

  • 示例

    • 使用 Java 动态代理生成 UserService 的 Stub。
    • 调用者直接调用 userService.getUserById(1),无需关心网络通信细节。


8. 非常处置惩罚



  • 目的:处置惩罚网络故障、超时、服务不可用等非常情况。
  • 实现

    • 提供重试机制、超时机制、熔断机制等。
    • 将长途非常转换为当地非常,方便调用者处置惩罚。

  • 示例

    • 如果服务端不可用,客户端捕获 RemoteException 并举行重试。


9. 性能优化



  • 目的:进步 RPC 调用的性能。
  • 实现

    • 使用高效的序列化协议(如 Protobuf)。
    • 支持异步调用和流式调用。
    • 使用连接池减少网络开销。

  • 示例

    • 客户端使用连接池复用 TCP 连接,减少连接建立的开销。


10. 安全性



  • 目的:确保 RPC 调用的安全性。
  • 实现

    • 支持身份验证和授权。
    • 使用 SSL/TLS 加密通信。

  • 示例

    • 客户端和服务端通过 TLS 加密通信,防止数据泄露。


总结

RPC 框架通过定义接口、代理模式、序列化、网络通信、服务注册与发现、负载均衡、透明化调用、非常处置惩罚、性能优化和安全性等技术,实现了让服务调用者像调用当地接口一样调用长途服务提供者。常见的 RPC 框架包罗 gRPC、Dubbo、Thrift、Spring Cloud 等。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

锦通

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表