今天学习江学武老师的RPC框架分层设计。 概念: RPC(Remote Procedure Call):远程过程调用,让我们调用远程方法像调用本地方法一样。 典型 RPC 的使用场景中,包含了服务发现、负载、容错、网络传输、序列化等组件。 RPC调用流程: 1、 服务消费者(Client 客户端)通过本地调用的方式调用服务 2、客户端存根(Client Stub)接收到调用请求后负责将方法、入参等信息序列化(组装)成能够进行网络传输的消息体 3、客户端存根(Client Stub)找到远程的服务地址,并且将消息通过网络发送给服务端 4、服务端存根(Server Stub)收到消息后进行解码(反序列化操作) 5、服务端存根(Server Stub)根据解码结果调用本地的服务进行相关处理 6、服务端(Server)本地服务业务处理 7、处理结果返回给服务端存根(Server Stub) 8、服务端存根(Server Stub)序列化结果 9、服务端存根(Server Stub)将结果通过网络发送给消费方 10、客户端存根(Client Stub)接收到消息,并进行解码(反序列化) 11、服务消费方得到最终结果 RPC面临的挑战: 在大规模服务化之前,应用可能只是通过RPC框架,简单的暴露和引用远程服务,通过配置URL地址进行远程服务调用,路由则通过F5负载均衡器等进行简单的负载均衡。 当服务越来越多的时候,服务的URL配置管理变得更加困难。单纯的使用RPC就有点吃不消。所以在大规模分布式集群中,RPC只是作为集群的一个方法调用手段。例如在Hadoop的进程间交互都是通过RPC来进行的,比如Namenode与Datanode直接,Jobtracker与Tasktracker之间等。 RPC协议是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议广泛的应用于分布式系统中,主要用于不同计算机(即服务节点)间的通信,RPC主要是基于Socket,而Socket又基于TCP,因此我们可以理解为RPC基于TCP协议(部分RPC框架基于HTTP协议),在TCP的基础上增加了编程语言的机制,比如反射、编码与解码、以及动态代理,因此我们可以认为RPC只是一个概念,而实现这一概念有不同方式,典型的RPC框架如gRPC、Thrift、Netty、Dubbo等都是基于这一思想。 在分布式环境中,网络不稳定、服务节点故障是常见的情况。容错和重试机制帮助 RPC 系统在这些情况下仍能保持服务的可用性。 *重试机制:当一次调用失败时,客户端可以自动重试。重试机制通常会设置最大重试次数和重试间隔,以避免过度重试导致的资源浪费。 *熔断器:熔断器用于防止对故障服务的持续调用。当检测到某个服务的调用失败率达到阈值时,熔断器会暂时中止对该服务的调用,并直接返回错误或执行降级处理。 *服务降级:当服务提供者不可用或响应超时时,客户端可以执行本地的备用逻辑或返回默认值,以保证服务的可用性。