簡介:
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中文網其他相關文章!