《从 0 开始学微服务》学习归整(四)RPC远程服务调用

内容纲要

RPC

RPC(Remote Procedure Call)即远程过程调用。解决了不同物理机及进程之间的方法调用问题。

如何完成调用?

RPC 要解决的问题

客户端和服务端如何建立连接?

常用途径

  1. HTTP
  2. Socket

服务端如何处理请求

常用途径

  1. 同步阻塞(BIO)
    • 原理:客户端每发起一次请求,服务端即开辟一个线程去处理请求
    • 场景:连接数较小的业务场景
  2. 同步非阻塞(NIO)
    • 原理:客户端每发起一次请求,服务端使用 I/O 多路复用技术处理请求
    • 场景:连接数较多,且业务消耗较轻的业务场景
  3. 异步非阻塞(AIO)
    • 原理:客户端发起请求随即返回,I/O 处理真正完成后,内核会通知客户端程序
    • 场景:连接数较多,且业务消耗较重的业务场景

数据传输采用什么协议?

核心思想
“契约”,即服务端和客户端之间定义一个协议,使得他们达成共识。

常用途径

  1. HTTP
  2. gRPC 等

数据如何序列化和反序列化?

Q:为什么需要?
A:主要是为了解决内存中的数据和字节序列之间的映射过程,如何保持数据结构和字段之间的关系,以及减少数据传输量,部分数据安全问题等……

常用方式

  1. 文本(XML/JSON 等)
  2. 二进制数据(Thrift/PB 等)

协议选择考虑因素

  • 支持的数据结构丰富度
    • 适用最好,最符合自己项目的最好
    • 不要一味求多,也要综合考虑其他因素
  • 跨语言支持
    • 适用最好,最符合自己项目的最好
    • 不要一味求多,也要综合考虑其他因素
  • 性能
    • 压缩率高好
    • 序列化、反序列化速度快好
    • 还是要综合考虑其他因素

落地

分类

  • 语言、平台绑定的 RPC 框架
    • Dubbo(Java 限定)
      • 通信框架:Netty
      • 通信协议:Dubbo、RMI、Hession、HTTP、Thrift 等
      • 序列化格式:Dubbo、Hession、JSON、Kryo、FST 等
    • Motan(Java 限定)
      • 通信框架:Netty
      • 通信协议:Motan
      • 序列化格式:Hession2
    • Tars(C++、Java、Nodejs、PHP、GO)
      • 通信框架:?
      • 通信协议:几乎支持所有协议?
      • 序列化格式:TUP?
    • Spring Cloud(Java 限定)
      • 通信框架:RestTemplate、Fengn
      • 通信协议:RPC、HTTP……
      • 序列化格式:Jackson?
        SC
  • 跨语言、平台的 RPC 框架
    • gRPC
      • 通信协议:HTTP2
      • IDL:ProtoBuf
      • 序列化:ProtoBUF
    • Thrift
      • 通信协议:Socket、File 等
      • IDL:Thrift
      • 序列化:Binary、Compact、JSON 等

选型

考虑因素

  • 是否真的需要跨语言?
  • 是否需要支持多种通信协议、序列化方式等?
  • 对效率、性能要求高不高?

总结

  • 多种框架未来都往多语言支持的方向发展(Sidecar 方案)
  • 目前几个知名的框架(除了 Thrift、gRPC)都有较成体系的服务注册、发现、治理等组件

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注