什么是RPC
核心:动态代理+网络传输
RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。最终解决的问题:让分布式或者微服务系统中不同服务之间的调用像本地调用一样简单。
RPC 架构设计
网络传输, 保证可靠性 ①传输模块, 收发二进制数据, 屏蔽网络传输的复杂性
②协议模块 序列化过程: 用户请求基于方法调用,方法出入参数都是对象数据,对象在网络中传输需要转成二进制 协议封装: 在方法调用参数的二进制数据后面增加“断句”符号来分隔出不同的请求,在两个“断句”符号中间放的内容就是请求的二进制数据 压缩功能: 在方法调用参数或者返回值的二进制数据大于某个阈值的情况下,通过压缩框架进行无损压缩,然后在另外一端也用同样的压缩算法进行解压,保证数据可还原 目的: 保证数据在网络中可以正确传输
③Bootstrap 模块 屏蔽细节, 让研发人员感觉不到本地调用和远程调用的区别 if 用到Spring, 希望可以把一个 RPC 接口定义成一个 Spring Bean,并且这个 Bean 也会统一被 Spring Bean Factory 管理,可以在项目中通过 Spring 依赖注入到方式引用
以上组成单机版本的RPC, (Point to Point)版本的 RPC 框架, 没有集群能力 ④集群模块 集群能力,就是针对同一个接口有着多个服务提供者,但这多个服务提供者对于调用方来说是透明的,所以在 RPC 里面还需要给调用方找到所有的服务提供方,并需要在 RPC 里面维护好接口跟服务提供者地址的关系,这样调用方在发起请求的时候才能快速地找到对应的接收地址,这就是“服务发现”。
但服务发现只是解决了接口和服务提供方地址映射关系的查找问题,这更多是一种“静态数据”。说它是静态数据是因为,对于 RPC 来说,每次发送请求的时候都是需要用 TCP 连接的,相对服务提供方 IP 地址,TCP 连接状态是瞬息万变的,所以 RPC 框架里面要有连接管理器去维护 TCP 连接的状态。
有了集群之后,提供方可能就需要管理好这些服务了,那 RPC 就需要内置一些服务治理的功能,比如服务提供方权重的设置、调用授权等一些常规治理手段。而服务调用方在每次调用前,都需要根据服务提供方设置的规则,从集群中选择可用的连接用于发送请求。