简介:
gRPC 允许客户端与暴露在多个服务上的通信单个服务器。但是,通常假设每个服务都需要专用的客户端连接。本文探讨如何利用单个连接访问多个 gRPC 服务。
拨打单个 Socket:
尽管有单独的服务接口,但没有必要建立单独的 Socket每个服务的连接。相反,您可以创建一个 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中文网其他相关文章!