ホームページ >バックエンド開発 >Golang >マイクロサービス間の通信 -- Protobuf

マイクロサービス間の通信 -- Protobuf

Go语言进阶学习
Go语言进阶学习転載
2023-07-24 15:26:10736ブラウズ

#1. 概要

マイクロサービス間の通信 -- Protobuf

上の図分解された SONY のカメラですが、内部のコンポーネントはそれぞれの役割を果たし、得意なことだけを行います。グローバル化した今日の世界では、ほとんどの優れた製品は、より良いサービスや技術を求めて一点で進化しています。

#実際、これはソフトウェア テクノロジについても同様であり、グローバリゼーションの縮図のようなものです。

マイクロサービス 固定された単一の定義はなく、時間の経過とテクノロジーの継続的な進化により、業界は密かに一定のコンセンサスを形成してきました。特徴をまとめると以下のような点が挙げられます。

  • 特定のマイクロサービスは、HTTP などのアーキテクチャ全体にわたる通信プロトコルを通じて相互に情報を転送します。

  • #マイクロサービスは独立してデプロイできます。

  • #マイクロサービスは、ビジネスに関する特定の機能を組織します。

  • #マイクロサービスは、サービスを実装するための言語、データベース、ハードウェア、ソフトウェア環境に限定されません。

  • サービスは粒度が小さく、メッセージングをサポートし、コンテキストに依存しており、自動化されたプロセスを通じて構築およびリリースされます。

上記の概要から、マイクロサービス間の情報対話は、MSA (マイクロサービス アーキテクチャ) 全体の基礎であり、通信 プロトコルの品質## は、それに基づいて確立されたサービスがシンプル、効率的、安定性、拡張性があり、保守が容易であるかどうかを決定します。製品における究極の具体化は、特に支払いや広告入札など、迅速な対応が必要なサービスのユーザー エクスペリエンスです。 プロトコル バッファー (一般に Protobuf として知られています) はその中で最高のものです。

その理由については、次の記事を参照してください。ここでは詳しく説明しません。

#Protobuf による JSON パフォーマンスの向上 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;
}

プロトコルバージョン

最初の行現在の「Use the syntax」バージョンを定義します。最新バージョンは

proto3 です。 proto2 を使用することもできます。

プロトコル フィールド タイプ

LoginRequest メッセージ本文では 3 つの特定のパラメータが定義されており、各パラメータには特定の型と名前が付いています。各フィールドは、次の表で .proto Type として定義できます。また、特定の言語 (Java Go) で使用される最終的な型も表で確認できます。

#int64可変長エンコーディングを使用します。負の数値をエンコードするには非効率的です。フィールドに負の値が含まれる可能性がある場合は、代わりに sint64 を使用してください。#longint64#uint32#fixed32常に 4 バイト。値が 228 より大きい場合が多い場合は、uint32 よりも効率的です。bytes232 以内の任意のバイト シーケンスを含めることができます。
#.proto タイプ 注意事項 Java タイプ Go Type
double
double float64
float #float float32
int32 可変長エンコーディングを使用します。負の数値をエンコードするには非効率的です。フィールドに負の値が含まれる可能性がある場合は、代わりに sint32 を使用してください。 #int int32
#可変長エンコーディングを使用します。 ##int uint32
uint64 可変長エンコーディングを使用します。 long uint64
sint32 可変長エンコーディングを使用します。符号付き int 値。これらは、通常の int32 よりも効率的に負の数値をエンコードします。 #sint64 可変長エンコーディングを使用します。符号付き int 値。これらは、通常の int64 よりも効率的に負の数値をエンコードします。
#int uint32
fixed64 常に 8 バイト。値が 256 より大きいことが多い場合は、uint64 より効率的です。 long uint64
sfixed32 常に 4 バイト。 int int32
sfixed64 常に 8 バイト。 long int64
ブール ブール値 ブール
文字列 文字列には、常に UTF-8 エンコードまたは 7 ビット ASCII テキストを含める必要があり、232 を超えることはできません。 ##string
ByteString []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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はGo语言进阶学习で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。