RPC
简介
RPC是远程调用协议的简称,在分布式系统下,RPC是一个基础组件。不同于传统的Http调用或者SOA调用,RPC通过本地的stub,虽然调用远程的服务端,但是从调用方式来看,更像本地方法调用。
RPC框架包括的组件如下:
RPC本质上仍然是远程调用,所以其包括socket通信组件,socket通信一般采用epoll机制实现,socket传输的是将参数序列化之后的数据。
PRC分为client端和server端,server端处理用户发起的请求,client作为请求发起端。
Stub作为RPC调用的重要组成部分,是RPC调用可以用类似本地方法调用的关键,比如客户端Stub实现了Client调用的接口,接口的实现就是socket调用远程服务端。
RPC调用的地址是通过注册中心寻址的,服务端启动的时候把服务提供的地址,IP+port存储到配置中心,客户端调用之前,会首先从配置中心获取服务端地址列表,然后通过负载均衡机制选举其中一个地址进行调用。
原理
注册中心
RPC服务的注册中心主要提供名字服务,类似于DNS系统,在注册中心注册服务之后,客户端可以通过命名获取这些服务的地址信息,进行通信。
所以注册中心既需要和服务端通信,也需要和客户端通信,服务端将自己的地址信息注册到地方的服务名字上(服务注册),注册中心进行进行相关信息的存储,客户端一般定期拉取服务的地址列表(服务发现)。
除了服务注册以及服务发现之外,注册中心一般还提供服务探活,服务剔除,服务权重等功能。
注册中心常用的实现方式有zookeeper,eureka、consul、Nacos等。
注册中心 | 实现方案 | 访问协议 | 多数据中心 | CAP选型 |
---|---|---|---|---|
Zookeeper | 通过Zookeeper的发布机制实现服务注册功能,例如观察者( Watcher )机制实现服务发现。 | TCP | CP | |
Eureka | Eureka Server通过心跳机制和服务方进行保活,一旦不能接受心跳,就会进行剔除。 | Http | 支持 | AP |
Consul | consul 使用了gossip协议来同步信息 | Http/DNS | 支持 | CP |
Nacos | 通过心跳机制 | Http/DNS | 支持 | CP/AP |
负载均衡
RPC框架的负载均衡机制一般是轮询、Hash、随机以及权重。
随机的负载均衡机制是每次从服务列表中选择随机一个结点。
轮询的机制是把服务器列表构造一个List,每次请求依此从列表中获取地址。
Hash算法是通过一定的机制对客户端或者请求进行Hash,之后根据Hash映射到服务列表中的某个结点,Hash算法可以基于主体或者请求固定分发到一台服务器,对于部分有状态的服务(例如需要在本机内存临时存储数据)是非常必要的。
权重是值不同结点有不同的请求权重,在随机的时候权重最为随机的权重。
序列化
RPC框架执行的时候,服务端需要获取的信息有调用的具体方法以及参数,客户端需要把请求参数序列化为网络上可以传输的数据传给服务端,服务端接收数据之后再将数据反序列化为具体参数进行对应的方法调用。
常用的序列化协议有xml、json之类的文本协议,也有thrift等二进制协议。