クラウド ネイティブ アプリケーション開発のための Go での gRPC の構築

クラウド ネイティブ アプリケーション開発のための Go での gRPC の構築

1. gRPCとは

Google によって開発された gRPC は、言語やプラットフォームに依存しないオープンソースのリモート呼び出しプロセスです。

リモートプロセス呼び出しとは何ですか?簡単に言えば、ローカル アプリケーションを他のアプリケーションに公開する方法です。 gRPC は、分散された異種アプリケーションの接続、呼び出し、操作、デバッグに使用できるプロセス間通信テクノロジです。これは、RPC アプリケーションの特性、つまりローカル関数の呼び出しに似ています。

2. 特徴

gRPC は、モバイルと HTTP/2 向けに設計された高性能なオープンソースの汎用 RPC フレームワークであり、双方向ストリーミング、フロー制御、ヘッダー圧縮、単一の TCP 接続でのリクエストの多重化などの機能を実現します。これらの機能により、モバイル デバイスでのパフォーマンスが向上し、電力とスペースが節約されます。

gRPC では、クライアント アプリケーションは、ローカル オブジェクトを呼び出すのと同じように、別のマシン上のサーバー アプリケーションのメソッドを直接呼び出すことができるため、分散アプリケーションやサービスを簡単に作成できます。

gRPC はデフォルトでプロトコル バッファを使用します。これは、Google がオープンソース化した成熟した構造化データ シリアル化メカニズムです。その機能は XML や JSON に似ていますが、パフォーマンスと効率性に優れたバイナリ形式です (欠点: 読みやすさが悪い)。

3. gRPCとRESTの違い

これは REST API 通信に似ており、通信媒体として HTTP 接続を使用して、アプリケーションの機能を他のアプリケーションに効果的に公開できます。

REST と gRPC は多少似ていますが、動作方法には違いがあることに注意する必要があります。

gRPCはHTTP/2プロトコルを使用し、RESTはHTTP 1.1を使用します。

gRPCは、REST APIで一般的に使用される標準のJSONデータ形式ではなく、プロトコルバッファデータ形式を使用します。

gRPC を使用すると、必要に応じて、サーバー側ストリーミング、クライアント側ストリーミング、さらには双方向ストリーミングなどの HTTP/2 機能を活用できます。

4. GoでgRPCサーバーを構築する

まず、Go で非常にシンプルな gRPC サーバーを定義します。シンプルなサーバーが稼働したら、そのサーバーと対話できる gRPC クライアントの作成に進むことができます。

gRPC はマイクロサービスを実装し、大規模なプロジェクトを複数の小規模で独立したビジネス モジュール、つまりサービスに分割できます。サービス間の RPC 呼び出しには効率的な protobuf プロトコルが使用されます。 gRPC はデフォルトでプロトコル バッファを使用します。これは、Google がオープンソース化した成熟した構造化データ シリアル化メカニズムです (もちろん、JSON などの他のデータ形式も使用できます)。 proto ファイルを使用して gRPC サービスを作成し、メッセージ タイプを使用してメソッド パラメーターと戻り値の型を定義できます。

golang の proto ツールキットをインストールします。

 go get -u github .com / golang / protobuf / proto

gRPC の設定を開始する前に、Protocol Buffers v3 がインストールされていることを確認してください。

 go get - u github .com / golang / protobuf / protoc - gen - go

Go に gRPC をインストールします。

 google .golang .org / grpc にアクセスしてください

次に、TCP 接続のポートをリッスンするサーバーを作成します。主な機能は次のとおりです。

パッケージメイン

輸入
"ログ"
"ネット"


関数main ( ) {

lis , err : = net.Listen ( "tcp" , ":8000" ) です。
err != nil の場合{
log .Fatalf ( "リッスンに失敗しました: %v" , err )
}
}

次に、golang.org から公式の gRPC パッケージをインポートして、新しい gRPC サーバーを作成し、公開するエンドポイントを登録して、上で定義した既存の TCP 接続を介してサービスを提供します。

パッケージメイン

輸入
"ログ"
"ネット"

「google.golang.org/grpc」


関数main ( ) {

lis , err : = net.Listen ( "tcp" , ":8000" ) です。
err != nil の場合{
log .Fatalf ( "リッスンに失敗しました: %v" , err )
}

grpcServer : = grpc.NewServer ( )

err の場合: = grpcServer.Serve ( lis ) ;エラー!=ゼロ{
log .Fatalf ( "サービス失敗: %v" , err )
}
}

これは Go で書かれた非常に基本的な gRPC サーバーであり、その機能は現時点では非常に制限されています。

5. 機能を追加する

次に、前のサーバーと対話するクライアントを記述し、client.proto ファイルを作成します。

構文= "proto3" ; //プロトコルはproto3です

パッケージチャット;

//送信リクエスト情報を定義する
メッセージ メッセージ{
//送信するパラメータを定義する
//パラメータ型パラメータ名識別番号重複不可
文字列本体= 1 ;
}

//サービスを定義します (複数のサービスを定義でき各サービスは複数のインターフェースを定義できます)
サービス ChatService {
rpc SayHello (メッセージ)(メッセージ)を返します{ }
}

この .proto ファイルは、任意の言語で記述された任意の gRPC クライアントから呼び出すことができる単一の SayHello 関数を持つ ChatService を公開します。

これらの .proto 定義は通常、あらゆる形状やサイズのクライアント間で共有され、クライアントが独自のコードを生成して gRPC サーバーと通信できるようにします。

protoc ツールを使用して、Go 固有の gRPC コードを生成してみましょう。

 $ protoc --go_out=plugins=grpc:chat チャット.proto

これにより、生成されたコードが含まれる chat/chat.pb.go ファイルが生成され、コード内で簡単に呼び出すことができるようになります。次のように、server.go を更新して ChatService を登録しましょう。

パッケージメイン

輸入
「fmt」
"ログ"
"ネット"

「github.com/tutorialedge/go-grpc-beginners-tutorial/chat」
「google.golang.org/grpc」


関数main ( ) {

fmt .Println ( "Go gRPC 初心者向けチュートリアル!" )

lis err : = net.Listen ( "tcp" fmt.Sprintf ( ":%d" 9000 ) )
err != nil の場合{
log .Fatalf ( "リッスンに失敗しました: %v" err )
}

s : =チャット.サーバー{ }

grpcServer : = grpc.NewServer ( )

チャット.RegisterChatServiceServer ( grpcServer & s )

err の場合: = grpcServer.Serve ( lis ) ;エラー!=ゼロ{
log .Fatalf ( "サービスに失敗しました: %s" エラー)
}
}

次に、メッセージを受信し、メッセージの本文を読み取り、独自のメッセージを返す SayHello メソッドを定義する必要があります。

パッケージチャット

輸入
"ログ"

"golang.org/x/net/コンテキスト"


タイプ Server 構造体{
}

func ( s * Server ) SayHello ( ctx context .Context , in * Message ) ( * Message , error ) {
log .Printf ( "クライアントからメッセージ本文を受信しました: %s" .Body)
return & Message {本文: "サーバーからこんにちは!" } ゼロ
}

gRPC サーバーのより高度な機能を定義する場合は、Server 構造体に基づいて新しいメソッドを定義し、その関数の名前を chat.proto ファイルに追加することで、アプリケーションが他の gRPC クライアントがアクセスできるものとして公開できるようになります。

これらの最終的な変更を行ったら、サーバーを実行してみましょう。

 $ go サーバーを実行.go
Go gRPC 初心者向けチュートリアル!

すばらしい!これで、マシンの localhost:8000 で、真新しい gRPC サーバーが稼働するようになりました。

6. Go で gRPC クライアントを構築する

サーバーが起動したので、サーバーと対話できるシンプルなクライアントの構築方法を見てみましょう。 client.go ファイルを更新します。

パッケージメイン

輸入
"ログ"

"golang.org/x/net/コンテキスト"
"google.golang.org/grpc"

「github.com/tutorialedge/go-grpc-beginners-tutorial/chat」


関数main ( ) {

var conn * grpc.ClientConn
conn , err : = grpc.Dial ( ":8000" , grpc.WithInsecure ( ) )
err != nil の場合{
log .Fatalf ( "接続できませんでした: %s" エラー)
}
conn.Close ( )を延期する

c : =チャット.NewChatServiceClient (接続)

response , err : = c.SayHello ( context.Background ( ) , & chat.Message { Body : "Hello From Client!" } )
err != nil の場合{
log .Fatalf ( "SayHello の呼び出し時にエラーが発生しました: %s" err )
}
log .Printf ( "サーバーからの応答: %s" response .Body )

}

これを実行すると、次のように、クライアントがサーバーから完全な Hello メッセージを受信したことがわかります。

 $ go クライアントを実行.go
2022/07/07 23:23:01サーバーから応答:サーバーからこんにちは!

新しい gRPC サーバーと通信できる非常にシンプルな gRPC クライアントの作成に成功しました。

インストールの問題

go get google.golang.org/grpc のインストールでエラーが発生した場合は、次のようにします。

次のように置き換えます。

  • git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc
  • git clone https://github.com/golang/net.git $GOPATH/src/golang.org/x/net
  • git clone https://github.com/golang/text.git $GOPATH/src/golang.org/x/text
  • go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
  • git clone https://github.com/google/go-genproto.git $GOPATH/src/google.golang.org/genproto
  • $GOPATH/src/ をコピーします
  • google.golang.org/grpc をインストールしてください

7. まとめ

この記事では、Go でシンプルな gRPC クライアントとサーバーを構築する方法を学びました。私たちは、クライアントからの受信メッセージを受け入れ、それらのクライアントに応答を返す基本的なサーバーを構築しました。

<<:  サーバーレス アプリケーション決定ガイド

>>:  クラウド データ ウェアハウス アーキテクチャにおけるコントロール パネルの重要性

推薦する

vmiss の最も安価な「中国 - 香港 - 国際回線」VPS をレビューします。年間 10 ドルで、「netflix\spotify\steam currency\chatgpt」のロックを解除できます。

vmiss は長年香港 VPS を提供してきました。デフォルトは中国本土向けに最適化された「中国-香...

チャンネルソーシャルネットワーキングに焦点を当て、スーパーファンパスの機能アップグレードの目標はブランドマーケティングです

モバイル端末の発展により、ブランドはソーシャルメディアとソーシャル配信のチャネルを継続的に拡大し、製...

openvirtuals - 年間 20 ドル / 512 MB メモリ / 180 GB ハード ドライブ / 2 TB トラフィック / 6 つのデータ センター

2011 年 6 月以来、OpenVirtuals は HostCat ブログに何度も登場しています...

シーメンス中国とアマゾン ウェブ サービスが、製造業における生成型 AI の革新的なアプリケーションの実装を加速するための戦略的協力契約を締結

シーメンス中国とアマゾン ウェブ サービスの上級幹部がシーメンス中国の北京本社で会談し、 「共同イノ...

SpringbootはKafka Streamのリアルタイム統計を統合します

[[417927]]環境: springboot2.3.12.RELEASE + kafka_2.1...

電子商取引インターネット マーケティング: ROI の罪と罰 (パート 1)

ほとんどの男は、厳しい真実に直面するよりもそれを否定するほうを選ぶ。 – ティリオン・ラニスター、『...

セルフサービス Web サイト構築に推奨される 5 つのオープン ソース システムをご存知ですか?

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますインターネ...

WeChat公開アカウントプロモーションのコメント欄でフォロワーを増やす方法!

公開アカウントを運営する人にとって、フォロワーを増やすことは第一のミッションです。公開アカウントのツ...

SAPとSuningが戦略的提携を結び、スマートな小売ソリューションを創出

[51CTO.comよりオリジナル記事] 9月6日、SAP China Summitにおいて、Sun...

ステータスをアップグレードするには、「Straight to the Clouds Seed Program」トレーニングキャンプに参加するだけです。

IT 業界は常に高給で知られています。昨年、IT業界の給与は金融業界を上回り、社会給与ランキングで1...

ウェブサイト構築経験交流

Webサイトを制作する会社として、避けられないのが地域差です。たとえば、企業や個人が Web サイト...

SEO担当者はタオバオSEOの頻繁な再編にどう対処すべきか

CPSを行うことでウェブマスターが利益を上げる良い方法だと言えます。ポップアップ広告やクリック広告と...

ウェブサイトが消費を支配する仕組み

現在、インターネットショッピングは人々の生活に大きな利便性をもたらし、オンラインショッピングブームを...

ブログの存続期間 = 利益 + 記事 + 運営

独立系ブログの発展環境をはっきりと説明できる人はいないと思います。周りの友人が独立系ブログは衰退期に...

Weibo マーケティングが失敗しているのではなく、使い方がわからないだけなのです。

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス王仔ミルクが人気です!こ...