gRPCでいるProtobufについて、あなたは知識を知っておく必要があります。

ソース製品はわずかネットワークです:http://www.pinlue.com/article/2020/03/0415/599980108317.html

 

いるProtobufインターフェイス記述言語(IDL)とApache倹約と同様のツールのセット(主protoc、C ++ベース))の集合です。protocを使用し、次いで、記述ファイルに書き込ま.Protoユーザが容易にインターフェースコードの多くのコンピュータ言語(などのC ++、Java(登録商標)、Pythonの、C#、Golang)に変換することができます。これらのコードはgRPCをサポートすることができ、それはサポートされない場合があります。

gRPCは、GoogleのオープンソースフレームワークとRPCライブラリで主流のコンピュータ言語をサポートしてきました。GRPC基盤となる通信プロトコルは、インターネットのシナリオに適して、採用します。いるProtobufの設計上の考慮事項と併せてgRPC。

、対処された2つの異なる問題を組み合わせて使用​​することができ、また分離することができます。

典型的な使用シナリオを定義RPCインターフェース記述ファイル.proto書き込まれると、次にProtoc(gRPCは、プラグインで)自動的に生成するために、クライアントとサーバのインタフェースコードテンプレート.proto基づきます。

いるProtobuf

必要なツールが含まれます:

コンパイラ:protoc、だけでなく、いくつかの公式言語プラグインではかかりませんでした。

動作環境:さまざまな言語でいるProtobuf図書館、異なる言語が異なるインストールソースを持っています。

構文はC ++言語に似ている、あなたは言語仕様を参照することができます。

、代表サービスRPCインターフェース(文字列、数値、配列、辞書......含むメンバ変数の異なるタイプを含んでいてもよい)コア、メッセージ代表的なデータ構造の比較。後者の変数デジタルメッセージをバイナリコード化された時間を表す、1から15までの変数は熱を表し、これは、より少ないバイトで符号化されます。また、輸入のためにサポートされています。

デフォルトでは、すべての変数は、(オプション)オプションで、それは配列を表し繰り返します。メインサービスのRPCメッセージインタフェースは、単一のパラメータを受け入れ、単一のメッセージを返すことができます。

構文= "proto3";パッケージハロー;メッセージHelloRequest {ストリンググリーティング= 1;}メッセージHelloResponse {ストリング応答= 1。繰り返しINT32数= 4;}サービスHelloService {RPCのsayHello(HelloRequest)リターン(HelloResponse){}}

最も重要なパラメータは、例えば、--python_out = OUT_DIRとしてのpythonを出力言語形式を指定するコンパイラです。

いくつかは、まだ正式にはprotoc対応するプラグインをインストールすることによってサポートすることができ、言語をサポートしていません。例えば、囲碁言語のために、インストールすることができます

$ゴーGET -u github.com/golang/protobuf/{protoc-gen-go,proto} //前者はプラグインであり、後者は、依存ライブラリが行くです

その後、通常の使用ではprotoc --go_out =。/ Hello.proto hello.pb.goを生成するためには、自動的にprotoc-GEN-行くプラグインを呼び出します。

シリアライズ動作データ構造にいるProtobufマーシャル/アンマーシャルメソッドを提供します。3〜10倍XMLよりも格納効率で生成されるバイナリファイル、および大きさの1〜2桁の処理性能。

gRPC

ツールは、次のとおりです。

ランタイムライブラリ:異なる言語の多様性は、さまざまなインストール方法を持って、パッケージマネージャの支配的な言語がサポートされています。

protoc、および他のプラグインとgrpc:いるProtobufコンパイル処理にIDL、.protoファイルとして使用。

非常に包括的に書かれた公式文書。

gRPCライブラリは、サーバ上でgRPCサーバーを提供し、他のRPCフレームワークのように、クライアントライブラリはgRPCスタブです。典型的なシナリオは、クライアントがサーバ・インタフェースへの要求、同期または非同期呼び出しを送信しています。クライアントとサーバ間の通信プロトコルがサポートオーダー保存メッセージフロー二重、より良いパフォーマンスだけでなく、非常に光にHTTP2 gRPCプロトコルをベースにしています。

採用いるProtobuf IDLとして、あなたは、サービスの種類を定義する必要があります。クライアントとサーバのコードを生成します。サーバーのコードを呼び出すために、独自のユーザーインターフェイスを実装し、クライアントにコードを使用すると、サーバーへの要求を開始します。完全な例はここで見つけることができます。

あなたが実行する必要がある場合、上記の例でプロト・ファイルには、プラグインがgrpcを追加しました:

$ protoc --go_out =プラグイン= grpc :. hello.proto

サーバ・コードを生成

サーバーコードは、以下の、主に定義されたHelloServiceServerインタフェースに関連して、ユーザーが独自の実装コードを書くことができます。

タイプHelloServiceServerインターフェース{のsayHello(context.Context、* HelloRequest)(* HelloResponse、エラー)} FUNC RegisterHelloServiceServer(S * grpc.Server、SRV HelloServiceServer){s.RegisterService(&_ HelloService_serviceDesc、SRV)}

ユーザーは以下のように、独自のサーバー・インターフェースを実装する必要があります。

さらに重要なのは、gRPCサービスのプロセスを作成して起動します。

LIS、ERR:リスニングソケットを作成= net.Listen( "TCP"、ポート)を、

作成サーバー:grpc.NewServer();

登録サービス:pb.RegisterHelloServiceServer();

サーバーを起動します。s.Serve(LIS)。

ここでは型サーバのstruct {} //実装サービスは、口を終了しました。FUNC(S *サーバー)のsayHello(* pb.HelloRequest中CTX context.Context、)(* pb.HelloReply、エラー){リターン&pb.HelloReply {メッセージ: "こんにちは" + in.Name}はnil} //作成し、プロセスのgRPCサービスを開始:リスニングソケットを作成し、サーバー、レジストラを作成し、サーバーを起動します。FUNCメイン(){LIS、ERR :! = net.Listen( "TCP"、ポート)であれば、ERR =ゼロ{log.Fatalf( "聞くことができなかった:%Vを" ERR)} S:= grpc.NewServer() pb.RegisterHelloServiceServer(S、&サーバー{})s.Serve(LIS)}

コンパイルし、サーバーを起動します。

クライアントコードを生成します

クライアント関連のコードを生成した移動ファイルは以下のようであり、主にHelloServiceClientインターフェイスを実現しました。ユーザーが直接gRPCでこのインターフェースを呼び出すことができます。

タイプHelloServiceClientインターフェース{のsayHello(CTX context.Context、で* HelloRequest、OPTS ... grpc.CallOption)(* HelloResponse、エラー)}型helloServiceClient構造体{CC * grpc.ClientConn} FUNC NewHelloServiceClient(CC * grpc.ClientConn)HelloServiceClient =新しい(HelloResponse)ERR:= grpcアウト{リターン&helloServiceClient {CC}} FUNC(C * helloServiceClient)のsayHello(CTX context.Context、* HelloRequestに、OPTS ... grpc.CallOption)(* HelloResponse、エラー){ .Invoke(CTX、 "/hello.HelloService/SayHello"、外、中、c.cc、OPTS ...)ERR!= nilを{戻りはnil、errは}アウト返す場合、nilを}

直接ユーザーインタフェースメソッド呼び出し:接続を作成し、クライアント、コール・インタフェースを作成します。

メインfuncを(){//は、サーバーへの接続を設定します。CONN、ERR:= grpc.Dial(アドレス、grpc.WithInsecure())エラーの場合はnil = {log.Fatalf( "接続しませんでした:%V"、ERR)}!延期はconn.close()C:= PB。 NewHelloServiceClient(CONN)//連絡先サーバーとその応答をプリントアウトします。名前:= DEFAULTNAME lenの場合(os.Args)> 1 {名前= os.Args [1]} R、ERR = c.SayHello(context.Background()、&pb.HelloRequest {名:名})であれば、ERR! =ゼロ{log.Fatalf( "挨拶ができませんでした:%のV"、ERR)} log.Printf( "挨拶:%s" を、r.Message)}

コンパイルし、サーバから返されたメッセージを表示するには、クライアントを起動します。

公開された60元の記事 ウォン称賛52 ビュー110 000 +

おすすめ

転載: blog.csdn.net/yihuliunian/article/details/104658616