网络协议
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 服务代理模型]