소개:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!