複数の gRPC サービスに同時にアクセスする
問題:
複数の gRPC サービスを持つサーバー内単一ポートで利用可能ですが、クライアントからダイヤルするときにサービスごとに個別の接続を確立する必要があるのはなぜですか?
<code class="go">func NewSubscriber() (c SubscriberRPC, err error) { c.conn, err = grpc.Dial("localhost:6000", grpc.WithInsecure()) if err != nil { log.Fatal(err) } c.client = pb.NewSubscriberServiceClient(c.conn) return } func NewDropper() (c DropperRPC, err error) { c.conn, err = grpc.Dial("localhost:6000", grpc.WithInsecure()) if err != nil { log.Fatal(err) } c.client = pb.NewDropperServiceClient(c.conn) return }</code>
解決策:
初期とは異なります前提として、同じサーバー上の複数の gRPC サービスに 1 つの接続でアクセスできます。これは、1 つの grpc.ClientConn を作成し、それを複数の pb.New*Client 関数に渡すことで実現できます。
<code class="go">func main() { cc, err := grpc.Dial("localhost:6000", grpc.WithInsecure()) if err != nil { log.Fatal(err) } c1 := pb.NewSubscriberServiceClient(cc) c2 := pb.NewDropperServiceClient(cc) }</code>
インターフェイスの使用:
クライアントのカスタマイズ-side エクスペリエンスは、pb.go ファイルで提供される生成コードを使用して可能です。ただし、生成されたコードは、必要な RPC 機能をすべてすでに処理しています。
便宜上、複数のサービスを 1 つの構造体に結合できます。
<code class="go">type SubscriberDropper struct { pb.SubscriberServiceClient pb.DropperServiceClient } func main() { // ... as above ... sd := &SubscriberDropper{c1, c2} }</code>
以上が1 つの接続で複数の gRPC サービスにアクセスできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。