首頁  >  文章  >  後端開發  >  微服務間的通訊--Protobuf

微服務間的通訊--Protobuf

Go语言进阶学习
Go语言进阶学习轉載
2023-07-24 15:26:10712瀏覽

1. 概述

微服務間的通訊--Protobuf

上圖是一台被拆解的SONY 相機,裡面的元件在工作的時候各司其職,只做自己擅長的領域。他們可以來自於不同的廠商甚至國家,在全球化的今天,優秀的產品大多在針對某個單點進化,尋求更優質的服務和技術。

其實對軟體技術來說也是一樣,而且比較像是全球化的縮影。

Microservices 沒有固定且單一的定義,隨著時間的流逝以及技術的不斷演進,業界卻已經默默的形成了一些共識,可以總結的特徵包括以下下幾點。

  • 具體的微服務在整個架構中,透過通訊協定相互傳遞訊息 例如 HTTP。

  • 微服務是可以獨立部署的。

  • 微服務是圍繞著業務組織具體的功能的。

  • 微服務不限語言、資料庫、硬體和軟體環境來實現服務。

  • 服務顆粒度小,支援訊息傳遞,受上下文限制並透過自動化流程來建構和發布。

從上述總結來看,微服務間的資訊互動是整個MSA ( Microservice Architecture ) 的基礎,通信協定 的品質決定了基於此建立的服務是否簡潔、有效率、穩定、可擴展、易於維護。最終體在產品中就是使用者體驗,尤其是針對需要快速回應的服務,例如:支付、廣告競價等。而 Protocol Buffers ( 通常稱為 Protobuf ) 正是此中的佼佼者。

#至於為什麼,我們可以參考以下這篇文章,這裡不贅述。

Beating JSON performance with Protobuf LINK

2. 快速使用

#2.1 定義通訊協定

讓我們先來看一個非常簡單的例子,假設我們需要定義一個登入要求,這個登入要求需要有使用者名稱 密碼重試次數。我們可以將這個請求定義在一個後綴為.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)中的類型也可在表中找到。

#
float64##longsint32uint64StringstringByteString
.proto類型 #Java類型 輸入
double
double
##float
##### ### ###
float float32
int32 #使用可變長度編碼。編碼負數效率低 - 如果您的欄位可能有負值,請改用 sint32。 #int32
int64############使用可變長度編碼。編碼負數效率低 - 如果您的欄位可能有負值,請改用 sint64。#########################int64############################################################ # #############uint32############使用可變長度編碼。############int#### # ######uint32###
##uint64 使用可變長度編碼。 ##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。
bytes #可能包含任何不超過232 的任意位元組序列。
#########[]byte##############

注释

Protobuf 支持 C/C++ 中的两种注释风格

  1. 斜线加星号 /* ... */

  2. 双斜线  //

2.2 代码生成

Golang 代码生成

  1. 到 Protobuf 官方 Repo 下载对应平台的 protoc 工具

  2. 首先用 go命令安装生成Go代码的工具, 此工具为生成Golang代码的插件

    go install google.golang.org/protobuf/cmd/protoc-gen-go
  3. 生成最终的代码

    SRC_DIR: 源目录

    DST_DIR: 生成的代码目录

    protoc -I=$SRC_DIR --go_out=$DST_DIR $SRC_DIR/request.proto

    最终生成 request.pb.go文件,该文件不用修改,后期有任何更新可以重新生成。

  4. 将上述代码保存到 request.proto 文件中

Golang 代码使用

生成的代码可以直接在项目中使用

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中文網其他相關文章!

陳述:
本文轉載於:Go语言进阶学习。如有侵權,請聯絡admin@php.cn刪除