<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          微服務(wù)間的通信--Protobuf

          共 3372字,需瀏覽 7分鐘

           ·

          2022-04-20 20:35

          點擊上方“Go語言進(jìn)階學(xué)習(xí)”,進(jìn)行關(guān)注

          回復(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 TypeNotesJava TypeGo Type
          double
          doublefloat64
          float
          floatfloat32
          int32Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead.intint32
          int64Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead.longint64
          uint32Uses variable-length encoding.intuint32
          uint64Uses variable-length encoding.longuint64
          sint32Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s.intint32
          sint64Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s.longint64
          fixed32Always four bytes. More efficient than uint32 if values are often greater than 228.intuint32
          fixed64Always eight bytes. More efficient than uint64 if values are often greater than 256.longuint64
          sfixed32Always four bytes.intint32
          sfixed64Always eight bytes.longint64
          bool
          booleanbool
          stringA string must always contain UTF-8 encoded or 7-bit ASCII text, and cannot be longer than 232.Stringstring
          bytesMay contain any arbitrary sequence of bytes no longer than 232.ByteString[]byte

          注釋

          Protobuf 支持 C/C++ 中的兩種注釋風(fēng)格

          1. 斜線加星號 /* ... */

          2. 雙斜線 ?//

          2.2 代碼生成

          Golang 代碼生成

          1. 到 Protobuf 官方 Repo 下載對應(yīng)平臺的 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() {
          ?// 創(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ù)【入群

          萬水千山總是情,點個【在看】行不行

          瀏覽 64
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日日综合网| 大鸡吧内射网站 | 草草影院网站 | 免看一级a毛片一片成人不卡 | 特级特黄A片一级一片 |