谈谈接口调用中的序列化协议

接口调用存在于内部服务之间,也存在于客户端和服务端之间
既然涉及接口调用,必然就涉及到数据的序列化

RPC

  • 什么是 RPC?
    • RPC是”远程过程调用”(Remote Procedure Call)的缩写。这是一种计算机通信协议,允许程序调用另一个地址空间(通常是在其它计算机上)的子程序或过程,而程序员就像调用本地程序一样,无需额外地为这个交互作用编程。
  • 其实 RPC 不仅可以存在于内部服务之间,前端和服务端之间的交互也可以用 RPC

序列化

  • 一般情况下,我们习惯于使用 idl 文件定义数据格式(比如 thrift 或 Protocol Buffer),然后使用 RPC(比如 gPRC 等)用于服务之间的调用;而使用 JSON 和 HTTP 作为前端和服务端的交互方式
  • 这里提一点,回看 RPC 的定义,即使使用 JSON 作为序列化协议,也可以使用 RPC 作为接口调用,具体要看 RPC 框架的实现。

使用 RPC 和 IDL文件 的好处

  • 本文只关注序列化方面相关的好处
  • 举个例子,接口调用简单使用 HTTP + JSON;如果后续加字段,而调用方使用不规范,复用接口调用的返回对象用于业务的其他逻辑,而字段名刚好相同,则会冲突从而可能导致逻辑异常,这种低级错误无论是客户端还是服务端都经常发生
  • 理论上每个接口都应该有单独的接口响应类,这样才不会在后续加字段时产生语义冲突,虽然写起来麻烦,但这是最规范最严谨的做法,所以自动化代码工具很重要
  • 其中一种解决方式:使用 IDL 文件定义数据格式,并且通过 RPC 框架限制调用的返回对象不被随意设置,从而解决这种低级又容易忽视的错误
  • 对 RPC 框架的要求:
    1. 限制返回对象不被修改
    2. 排查工具完善,支持将数据转成可阅读格式(比如使用Protobuf二进制传输,将很难排查)
    3. 适配多种语言的客户端 sdk(包括客户端)