Grpc的优缺点

  • 优点:
    • protobuf二进制消息,性能好/效率高(空间和时间效率都很不错)
    • proto文件生成目标代码,简单易用
    • 序列化反序列化直接对应程序中的数据类,不需要解析后在进行映射(XML,JSON都是这种方式)
    • 支持向前兼容(新加字段采用默认值)和向后兼容(忽略新加字段),简化升级
    • 支持多种语言(可以把proto文件看做IDL文件)
  • 缺点:
    • GRPC尚未提供连接池,需要自行实现
    • 尚未提供“服务发现”、“负载均衡”机制
    • 因为基于HTTP2,绝大部多数HTTP Server、Nginx都尚不支持,即Nginx不能将GRPC请求作为HTTP请求来负载均衡,而是作为普通的TCP请求。(nginx1.9版本已支持)
    • Protobuf二进制可读性差(貌似提供了Text_Fromat功能)默认不具备动态特性(可以通过动态定义生成消息类型或者动态编译支持)

message、属性后面的数字等:Protoc代码解释

  • 表示在序列化里面的顺序

在RPC框架中主要有三个角色

  • Server: 暴露服务的服务提供方。
  • Client: 调用远程服务的服务消费方。
  • Registry: 服务注册与发现的注册中心。

RPC框架的实现原理?

  • 建立通信
    • net.Listen
  • 服务寻址
  • 网络传输
    • 序列化
    • 反序列化
    • 服务调用

具体调用过程image.png

  • 1)服务消费方(client)调用以本地调用方式调用服务;
  • 2)client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;
  • 3)client stub找到服务地址,并将消息发送到服务端;
  • 4)server stub收到消息后进行解码;
  • 5)server stub根据解码结果调用本地的服务;
  • 6)本地服务执行并将结果返回给server stub;
  • 7)server stub将返回结果打包成消息并发送至消费方;
  • 8)client stub接收到消息,并进行解码;
  • 9)服务消费方得到最终结果。