網路協定
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 檔案中定義的介面生成 stub 檔案(.pb.go 檔案)。stub 檔案包含介面和介面協定的所有資訊。
在編寫服務時,客戶端和伺服器端同時引入相同的介面,可以確保客戶端發起對特定介面和方法的呼叫時,伺服器端能夠正確識別並響應。
以 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 服務代理模型]