网络协议

1. RPC 服务框架与网络协议

网络协议在 RPC 场景十分重要,在微服务场景下,服务进程之间的通信依赖可以连通的网络,以及client与server 端保持一致的网络协议。网络协议是一个抽象的概念,站在 Dubbo-go 应用开发的角度,不妨把我们关注的协议分为三个维度来讨论。

1.1 打解包协议

Dubbo-go 服务框架内置的打解包协议都是基于 TCP/IP 协议栈的,在此基础之上,封装/引入了多种协议,例如 Triple(dubbo3)、Dubbo、gRPC。

这一类协议重点关注 TCP 报文的封装和拆解过程,保证点对点的可靠通信。

在 dubbo-go 生态中,支持多种网络往往值得这一类协议。

1.2 序列化协议

序列化协议负责将内存中的对象以特定格式序列化为二进制流。一些主流的序列化库有:具有较好可读性、应用广泛的 json 序列化方式;较高压缩效率,性能较好的 protobuf 序列化方式;适配与 Java 语言的 hessian2 序列化方式等。Dubbo-go 内置了这三种序列化方式

序列化协议是需要开发者在业务开发过程中关注的,序列化协议往往需要特定的对象标注:

一个由 protoc-gen-go 生成的 protobuf 序列对象的例子:

  1. type HelloRequest struct {
  2. state protoimpl.MessageState
  3. sizeCache protoimpl.SizeCache
  4. unknownFields protoimpl.UnknownFields
  5. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
  6. }

一个可与 java 服务互通的 hessian2 序列化对象

  1. type HelloRequest struct {
  2. Name string `hessian:"name"`
  3. }
  4. func (u *HelloRequest) JavaClassName() string {
  5. return "org.apache.dubbo.sample.User"
  6. }

序列化协议与打解包协议的关系

  • 一种打解包协议可以适配于多种序列化协议支持:例如,您可以使用 dubbogo 的 triple 协议来传递 hessian序列化参数与 Dubbo-java 服务框架互通;传递 pb 序列化参数与原生 gRPC 服务互通;通过实现接口来自定义您的希望的序列化方式例如 json,从而传递具有较强可读性的参数。

1.3 接口协议

接口协议,是由业务开发人员开发并且维护的协议,用于描述服务接口的信息。例如接口名、方法、参数类型。

以 Triple/gRPC 为例,开发人员可以使用插件,从 proto 文件中定义的接口生成存根(.pb.go 文件),存根文件内包含接口所有信息,及接口协议。

在编写服务时,客户端和服务端同时引入相同的接口,即可保证客户端发起针对特定接口和方法的调用,能被服务端正确识别和响应。

一个由 proto 编写的接口描述文件:

  1. syntax = "proto3";
  2. package api;
  3. option go_package = "./;api";
  4. // The greeting service definition.
  5. service Greeter {
  6. // Sends a greeting
  7. rpc SayHello (HelloRequest) returns (User) {}
  8. // Sends a greeting via stream
  9. rpc SayHelloStream (stream HelloRequest) returns (stream User) {}
  10. }
  11. // The request message containing the user's name.
  12. message HelloRequest {
  13. string name = 1;
  14. }
  15. // The response message containing the greetings
  16. message User {
  17. string name = 1;
  18. string id = 2;
  19. int32 age = 3;
  20. }

接口协议与序列化协议的关系

  • 接口协议是抽象的概念,一种接口协议可以使用多种接口描述语言来编写,并且可以转化成多种序列化协议对象。

2. Dubbo-go 支持的网络协议

Dubbo-go 支持的网络协议和序列化方式如下:

协议协议名 (用于配置)序列化方式默认序列化方式
Triple 【推荐】tripb/hessian2/msgpack/自定义pb
Dubbodubbohessian2hessian2
gRPCgrpcpbpb
jsonRPCjsonrpcjsonjson

相关阅读:【Dubbo-go 服务代理模型】

最后修改 December 16, 2022: Fix check (#1736) (97972c1)