首页 > 解决方案 > 基于 HostSNI 和 gRPC 连接 Traefik 中的服务

问题描述

我想在 Traefik 中有 1 个入口点,然后是两个基于 HostSNI 路由的不同路由器。我真的不知道如何基于 HostSNI 访问这些不同的服务

我的入口点是:5160.

两个不同的路由器去两个不同的服务。
一个有规矩HostSNI('service-1.local'),一个有规矩HostSNI('service-2.local')

如何使用 Java 中的 gRPC 连接到这些服务?

到目前为止,我的客户:

public class GrpcClient {
     public GrpcClient(String host, int port) {
        this(ManagedChannelBuilder.forAddress(host, port).usePlaintext());
    }

    public GrpcClient(ManagedChannelBuilder<?> channelBuilder) {
        channel = channelBuilder.build();
        blockingStub = ServiceGPRC.newBlockingStub(channel);
        asyncStub = ServiceGRPC.newStub(channel);
    }
    public void shutdown() throws InterruptedException {
        channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
    }
}

标签: javagrpctraefikgrpc-java

解决方案


SNI 是 TLS 扩展,因此需要使用 TLS。另请参阅https://docs.traefik.io/routing/routers/#rule_1

然后在您的 GrpcClient 中,您不能使用纯文本,而必须使用 TLS 通道。请参阅示例https://github.com/grpc/grpc-java/tree/master/examples/example-tls。SNI 是根据您可以使用 ManagedChannelBuilder#overrideAuthority 覆盖的权限设置的。


推荐阅读