一 前言
RPC即远程过程调用(Remote Procedure Calls)它是是一种网络协议,用于支持分布式系统中跨应用跨主机之间的接口调用。RPC之存在使我们调用其他服务的接口时就像调用三方库类的方法一样便捷,但是RPC接口作为微服务中对外提供能力的暴露点,稍有不慎就会陷入万劫不复之地。那如何优雅的设计高可用的RPC接口呢?下面将以阿里巴巴-智能服务的最佳实践为你一一详解。
二 RPC 的优点与缺点
RPC 的优点
- 对于服务器端开发人员而言,容易设计、开发。
- 对于消费者而言,调用非常简单。
- 便于做集中的监控。
- 基于socket的二进制RPC协议,建立连接延迟低、网络传输效率高。
- 支持有状态的长连接,可进行双向通信,实时性好。
- 在各个企业的使用较为成熟,许多企业都有自己的RPC实践,并已广泛应用在生产环节。
RPC 的缺点
- 紧耦合
- API一旦发布,就难以再做改动。
- 客户端必须使用特定的框架,而且还需引入API包。
- 第三方依赖API包升级会特别复杂。
- 没有统一的设计风格
- 增加了客户端开发人员的学习成本
- 难以实现通用的客户端库,每个RPC框架都有各自的协议。
- 通常以动词的形式设计API,一个功能就增加一个API,设计的时候很少考虑领域模型。
- 掩盖了网络的复杂性
- 开发人员很容易混淆远程调用与本地调用。
实际上网络调用与本地调用是完全不同的,RPC的调用方式,让使用者很难意识到是在进行网络调用,忽略了针对网络复杂性的处理。 - 会损害用户(客户端)可感知的性能
- 开发人员很容易混淆远程调用与本地调用。
三 RPC接口设计的要点
通用性/扩展性/兼容性考量
- RPC风格API一旦发布,修改和升级就会变的特别的复杂和繁琐。所以设计之初就应该要考虑到接口的通用性、可扩展性、兼容性。
使用单参数-参数尽可能封装
- RPC接口查询参数封装,后续接口升级时不用改变方法签名,避免调用方出现找不到方法的情况,新增参数放在封装对象中。
返回数据使用Result封装
- 使用Result封装数据,有效的返回数据及接口调用异常消息。
接口异常设计
- 接口中定义的异常实际上是一种契约,调用方清晰明了的知道接口会抛异常,自然会处理异常情况。
接口降级
- RPC接口调用失败是常态,如果出现大量失败,需要针对异常进行降级。