上圖是一台被拆解的SONY 相機,裡面的元件在工作的時候各司其職,只做自己擅長的領域。他們可以來自於不同的廠商甚至國家,在全球化的今天,優秀的產品大多在針對某個單點進化,尋求更優質的服務和技術。
其實對軟體技術來說也是一樣,而且比較像是全球化的縮影。
Microservices 沒有固定且單一的定義,隨著時間的流逝以及技術的不斷演進,業界卻已經默默的形成了一些共識,可以總結的特徵包括以下下幾點。
具體的微服務在整個架構中,透過通訊協定相互傳遞訊息 例如 HTTP。
微服務是可以獨立部署的。
微服務是圍繞著業務組織具體的功能的。
微服務不限語言、資料庫、硬體和軟體環境來實現服務。
服務顆粒度小,支援訊息傳遞,受上下文限制並透過自動化流程來建構和發布。
從上述總結來看,微服務間的資訊互動是整個MSA ( Microservice Architecture ) 的基礎,通信協定 的品質決定了基於此建立的服務是否簡潔、有效率、穩定、可擴展、易於維護。最終體在產品中就是使用者體驗,尤其是針對需要快速回應的服務,例如:支付、廣告競價等。而 Protocol Buffers ( 通常稱為 Protobuf ) 正是此中的佼佼者。
#至於為什麼,我們可以參考以下這篇文章,這裡不贅述。
Beating JSON performance with Protobuf LINK
讓我們先來看一個非常簡單的例子,假設我們需要定義一個登入要求,這個登入要求需要有使用者名稱
、密碼
、重試次數
。我們可以將這個請求定義在一個後綴為.proto
的檔案中。資訊的內容如下:
/* LoginRequest represents a login request * user_name: user name * password: password * retry_time: retry times, can not over 3 times */ syntax = "proto3"; // proto3 syntax option go_package = "pb/request"; message LoginRequest { string user_name = 1; string password = 2; int32 retry_times = 3; }
第一行定義了當前使用語法版本,最新的版本就是proto3。也可以使用 proto2
LoginRequest
訊息體定義了具體的三個參數,每個參數都有具體的類型以及名字。每個欄位都可以按照以下表格中的.proto Type 來定義– 並且最終應用在特定語言(Java Go)中的類型也可在表中找到。
.proto類型 | #Java類型 | 輸入 | |
---|---|---|---|
double | double | ||
##float ##### ### ### |
float | float32 | |
int32 | #使用可變長度編碼。編碼負數效率低 - 如果您的欄位可能有負值,請改用 sint32。 | #int32 | |
int64############使用可變長度編碼。編碼負數效率低 - 如果您的欄位可能有負值,請改用 sint64。#########################int64############################################################ # #############uint32############使用可變長度編碼。############int#### # ######uint32### | |||
##uint64 | 使用可變長度編碼。 | ##long##uint64 | |
使用可變長度編碼。有符號 int 值。這些比常規 int32 更有效地編碼負數。 | int | int32 | |
##### ####sint64############使用可變長度編碼。有符號 int 值。這些比常規 int64 更有效地編碼負數。############long############int64################################################################################################# ####fixed32############總是四個位元組。如果值通常大於 228,則比 uint32 更有效率。### | int | uint32 | |
fixed64 | |||
總是八個位元組。如果值通常大於 256,則比 uint64 更有效率。 | long | ||
#sfixed32############總是四個位元組。############int########## #int32# ################sfixed64#############總是八個位元組。########### #long### #########int64###################bool############ |
布林值 | 布林值 | |
字串 | ##字串必須始終包含UTF-8 編碼或7 位元ASCII 文本,且長度不能超過232。 | ||
string | bytes | #可能包含任何不超過232 的任意位元組序列。 |
Protobuf 支持 C/C++ 中的两种注释风格
斜线加星号 /* ... */
双斜线 //
到 Protobuf 官方 Repo 下载对应平台的 protoc
工具
首先用 go
命令安装生成Go代码的工具, 此工具为生成Golang代码的插件
go install google.golang.org/protobuf/cmd/protoc-gen-go
生成最终的代码
SRC_DIR: 源目录
DST_DIR: 生成的代码目录
protoc -I=$SRC_DIR --go_out=$DST_DIR $SRC_DIR/request.proto
最终生成 request.pb.go
文件,该文件不用修改,后期有任何更新可以重新生成。
将上述代码保存到 request.proto
文件中
生成的代码可以直接在项目中使用
func main() { // 创建请求 loginRequest := request.LoginRequest{ UserName: "Gavin.Yang", Password: "92d273941d98a8e1c1bb13ac163f0d4e40c5aa70", RetryTimes: 0} // 序列化 out, err := proto.Marshal(&loginRequest) if err == nil{ fmt.Println(out) } }
以上是微服務間的通訊--Protobuf的詳細內容。更多資訊請關注PHP中文網其他相關文章!