网络协议

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

网络协议在 RPC 场景中非常重要。在微服务场景下,服务进程之间的通信依赖于可连接的网络,以及客户端和服务器之间一致的网络协议。网络协议是一个抽象的概念。从 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 序列对象的示例

type HelloRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields

Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
}

可以与 Java 服务通信的 hessian2 序列化对象的示例

type HelloRequest struct {
Name string `hessian:"name"`
}

func (u *HelloRequest) JavaClassName() string {
return "org.apache.dubbo.sample.User"
}

序列化协议和解包协议之间的关系

  • 一个打包和解包协议可以适配支持多种序列化协议:例如,可以使用 dubbogo 的 triple 协议传递 hessian 序列化参数与 Dubbo-java 服务框架通信;传递 pb 序列化参数与原生 gRPC 服务互操作;通过实现接口自定义所需的序列化方法,例如 json,从而传递可读性强的参数。

1.3 接口协议

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

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

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

proto 编写的接口描述文件

syntax = "proto3";
package api;

option go_package = "./;api";

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (User) {}
  // Sends a greeting via stream
  rpc SayHelloStream (stream HelloRequest) returns (stream User) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message User {
  string name = 1;
  string id = 2;
  int32 age = 3;
}

接口协议和序列化协议之间的关系

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

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

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

| 协议 | 协议名称(用于配置) | 序列化方法 | 默认序列化方法 | | ————— | —————– | :————- ———-: | ————– | | Triple 【推荐】 | tri | pb/hessian2/msgpack/custom | pb | | Dubbo | dubbo | hessian2 | hessian2 | | gRPC | grpc | pb | pb | | jsonRPC | jsonrpc | json | json |

相关阅读:[Dubbo-go 服务代理模型]


上次修改时间:2023 年 1 月 2 日:增强 Dubbogo 文档 (#1800) (71c8e722740)