一、rpc是什么
RPC全称为Remote Procedure Call,翻译过来为“远程过程调用”。通过RPC框架机器A某个进程可以通过网络调用机器B上的进程方法,就像在本地上调用一样。
二、rpc一般调用流程
- client发出调用方法(服务)的请求
- client stub作为中转站,进行
请求接口、方法、参数以及服务地址、请求Id
的封装,包装成RequestMessage
对象、序列化——编码,最后传输到网络上去 - 服务端(service)经过网络接受到RequestMessage
- 首先server stub进行字节流的反序列化、解析
requestMessage
——解码,最后将请求转发给server - server调用
method(...)
,返回结果给server stub - server stub将
result
、返回状态码、请求id等进行包装成ResponseMessage
、序列化——编码、传输 - client stub得到字节流,进行反序列化、解析
ResponseMessage
——解码,将结果返给client
三、关键实现点
1. 想要实现像调用本地函数一样, 调用远程函数。 就需要实现一个stub。 该类把接口伪装成本地接口一样调用, 实际上通过网络把接口,方法,参数等信息序列化传输到远程服务器上执行, 然后收集网络传输过来的运算结果。
2. 传输信息封装和序列化。 请求信息:接口名称, 方法名称, 参数, 超时时间,requestId,返回信息需要返回值, 状态code,表示这次请求成功与否,requestid。 请求信息,返回信息都需要序列化。
3. 服务发布问题。
一般情况,如果客户端依赖的服务挂掉或者切换地址等,那么客户端可能就无法工作或者需要改变配置。为了能够达到自动切换服务、寻址等问题,就需要一个服务注册和发现功能的框架。市面上流行的是zookeeper,他可以将上线的服务注册进去,提供给客户端调用。zookeeper会不断对服务进行心跳检测,一旦服务挂掉,就会在注册中心把他消掉。客户端可以在注册中心切换到其他可用的服务
zookeeper的服务注册格式:/{service}/{version}/{ip:port}
4. 服务负载均衡问题。
中间在加入个代理服务器, 客户端不直接通过zookeeper拿到服务地址去访问, 而是代理去拿服务地址,代理再根据负载均衡策略分配服务务。负载均衡策略, 如轮询, 权重分配等。为了性能,客户端可能缓存服务地址, 隔一段时间才去请求一次代理。如果失败可以重试,或者重新向代理要服务信息。
5. 服务监控问题。
服务可以由代理进行管控。 服务失败了可以向代理进行报告。连续累计一定次数代理可以进行降级,熔断服务处理。
参考:https://www.cnblogs.com/Franken-Fran/p/rpc_fornoob.html, 这篇文章写得挺好的。