微服務(wù)間的通信--Protobuf
回復(fù)“Go語言”即可獲贈從入門到進(jìn)階共10本電子書
紅顏棄軒冕,白首臥松云。
微服務(wù)間的通信--Protobuf
微服務(wù)間的通信--Protobuf1. 概述2. 快速使用2.1 定義通信協(xié)議協(xié)議版本協(xié)議字段類型注釋2.2 代碼生成Golang 代碼生成Golang 代碼使用相關(guān)代碼
1. 概述

上圖是一個被拆解的 SONY 相機,里面的元器件在工作的時候各司其職,只做自己擅長的領(lǐng)域。他們可以來自于不同的廠家甚至國家,在全球化的今天,大部分優(yōu)秀的產(chǎn)品都在針對某個單點進(jìn)化,尋求更優(yōu)質(zhì)的服務(wù)和技術(shù)。
其實對于軟件技術(shù)來說也是一樣,并且更像全球化的一個縮影。
Microservices 沒有固定且單一的定義,隨著時間的流逝以及技術(shù)的不斷演進(jìn),業(yè)界卻已經(jīng)默默的形成了一些共識,可以總結(jié)出的特征包括以下下幾點。
具體的微服務(wù)在整個架構(gòu)中,通過通信協(xié)議相互傳遞信息 例如 HTTP。
微服務(wù)是可以獨立部署的。
微服務(wù)是圍繞業(yè)務(wù)組織具體的功能的。
微服務(wù)不限語言、數(shù)據(jù)庫、硬件和軟件環(huán)境來實現(xiàn)服務(wù)。
服務(wù)顆粒度小,支持消息傳遞,受上下文限制并通過自動化流程來構(gòu)建和發(fā)布。
從以上總結(jié)來看,微服務(wù)間的信息交互是整個 MSA ( Microservice Architecture ) 的基礎(chǔ),通信 協(xié)議 的質(zhì)量決定了基于此建立的服務(wù)是否簡潔、高效、穩(wěn)定、可擴(kuò)展、易于維護(hù)。最終體在產(chǎn)品中就是用戶體驗,尤其是針對需要快速響應(yīng)的服務(wù),比如:支付、廣告競價等。而 Protocol Buffers ( 通常稱為 Protobuf ) 正是此中的佼佼者。
至于為什么,我們可以參考以下這篇文章,這里不贅述。
Beating JSON performance with Protobuf LINK
2. 快速使用
2.1 定義通信協(xié)議
讓我們先來看一個非常簡單的例子,假設(shè)我們需要定義一個登錄請求,這個登錄請求需要有 用戶名、密碼、重試次數(shù)。我們可以將這個請求定義在一個后綴為.proto 的文件中。信息的內(nèi)容如下:
/*?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;
}協(xié)議版本
第一行定義了當(dāng)前使用語法版本,最新的版本就是 proto3。也可以使用 proto2
協(xié)議字段類型
LoginRequest 消息體定義了具體的三個參數(shù),每個參數(shù)都有具體的類型以及名字。每個字段都可以按照以下表格中的 .proto Type 來定義 – 并且最終應(yīng)用在特定語言(Java + Go)中的類型也可在表中找到。
| .proto Type | Notes | Java Type | Go Type |
|---|---|---|---|
| double | double | float64 | |
| float | float | float32 | |
| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int | int32 |
| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | long | int64 |
| uint32 | Uses variable-length encoding. | int | uint32 |
| uint64 | Uses variable-length encoding. | long | uint64 |
| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int | int32 |
| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | long | int64 |
| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 228. | int | uint32 |
| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 256. | long | uint64 |
| sfixed32 | Always four bytes. | int | int32 |
| sfixed64 | Always eight bytes. | long | int64 |
| bool | boolean | bool | |
| string | A string must always contain UTF-8 encoded or 7-bit ASCII text, and cannot be longer than 232. | String | string |
| bytes | May contain any arbitrary sequence of bytes no longer than 232. | ByteString | []byte |
注釋
Protobuf 支持 C/C++ 中的兩種注釋風(fēng)格
斜線加星號
/* ... */雙斜線 ?
//
2.2 代碼生成
Golang 代碼生成
到 Protobuf 官方 Repo 下載對應(yīng)平臺的
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文件中
Golang 代碼使用
生成的代碼可以直接在項目中使用
func?main() {
?// 創(chuàng)建請求
loginRequest?:=?request.LoginRequest{
UserName:?"Gavin.Yang",
Password:?"92d273941d98a8e1c1bb13ac163f0d4e40c5aa70",
RetryTimes:?0}
?// 序列化
out,?err?:=?proto.Marshal(&loginRequest)
if?err?==?nil{
fmt.Println(out)
}
}相關(guān)代碼
https://github.com/yyl719133368/imooc_demo
-------------------?End?-------------------
往期精彩文章推薦:

歡迎大家點贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入Go學(xué)習(xí)群請在后臺回復(fù)【入群】
萬水千山總是情,點個【在看】行不行
