概要:
gRPC では、クライアントが で公開されている複数のサービスと通信できるようになります。単一のサーバー。ただし、各サービスには専用のクライアント接続が必要であると想定されることがよくあります。この記事では、単一の接続を利用して複数の gRPC サービスにアクセスする方法について説明します。
単一ソケットのダイヤル:
個別のサービス インターフェイスがあるにもかかわらず、個別のソケットを確立する必要はありません。各サービスの接続。代わりに、単一の grpc.ClientConn を作成できます。この接続は、New*Client() 関数を使用してインスタンス化されたすべてのサービス クライアントに渡すことができます。接続を共有することで、これらのクライアントは同じ基盤となるトランスポートおよび多重化メカニズムを利用します。
<code class="go">cc, err := grpc.Dial("localhost:6000", grpc.WithInsecure()) if err != nil { log.Fatal(err) }</code>
インターフェイスの使用:
ただし、サービスごとに個別の構造体を作成するとクライアントが簡素化されます。相互作用により、コードの重複が促進されます。これを軽減するために、ServiceClient などのインターフェイスをすべてのサービス クライアントで定義して実装できます。これにより、共通のプロパティとメソッドの共有が可能になり、コードの混乱が軽減されます。
<code class="go">type ServiceClient interface { // Common methods and properties } type SubscriberClient struct { pb.SubscriberServiceClient } type DropperClient struct { pb.DropperServiceClient }</code>
ライブラリの依存関係の排除:
cmux のようなライブラリは接続を共有するためのソリューションを提供しますが、それは外部依存なしでこれを達成することは可能です。 grpc.ClientConn は、基礎となるトランスポートへの直接アクセスを提供し、複数のサービス クライアントの作成を可能にします。
<code class="go">func NewServiceClient(conn *grpc.ClientConn, service interface{}) interface{} { switch service { case pb.SubscriberServiceServer: return pb.NewSubscriberServiceClient(conn) case pb.DropperServiceServer: return pb.NewDropperServiceClient(conn) } panic("Unknown service") }</code>
重要なポイント:
以上が単一の接続を使用して複数の gRPC サービスにアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。