具有静态地址的Grpc Java热故障切换

具有静态地址的Grpc Java热故障切换,java,grpc,failover,grpc-java,Java,Grpc,Failover,Grpc Java,我想为我的grpc客户端使用热故障切换,因此如果连接失败,它将直接故障切换到启动时指定的另一台服务器。我不想添加额外的外部解析器,而是在初始化时直接设置所有可能的服务地址。 目前,我正在构建这样的频道: ManagedChannelBuilder.forAddress(“hostA”,234.build(); 理想情况下,我可以做类似的事情: managedChannel Builder .地址(“hostA”,234) .地址(“hostA”,235) .地址(“hostB”,234) .b

我想为我的grpc客户端使用热故障切换,因此如果连接失败,它将直接故障切换到启动时指定的另一台服务器。我不想添加额外的外部解析器,而是在初始化时直接设置所有可能的服务地址。 目前,我正在构建这样的频道:

ManagedChannelBuilder.forAddress(“hostA”,234.build();
理想情况下,我可以做类似的事情:

managedChannel Builder
.地址(“hostA”,234)
.地址(“hostA”,235)
.地址(“hostB”,234)
.build();
它会在每次请求时从列表中选择一个可用的服务。
在Go中似乎类似,但没有我需要的DNS解析。

您可以创建自定义名称解析程序工厂:

class MultiAddressNameResolverFactory extends NameResolver.Factory {

    final List<EquivalentAddressGroup> addresses;

    MultiAddressNameResolverFactory(SocketAddress... addresses) {
        this.addresses = Arrays.stream(addresses)
                .map(EquivalentAddressGroup::new)
                .collect(Collectors.toList());
    }

    public NameResolver newNameResolver(URI notUsedUri, NameResolver.Args args) {
        return new NameResolver() {

            @Override
            public String getServiceAuthority() {
                return "fakeAuthority";
            }

            public void start(Listener2 listener) {
                listener.onResult(ResolutionResult.newBuilder().setAddresses(addresses).setAttributes(Attributes.EMPTY).build());
            }

            public void shutdown() {
            }
        };
    }

    @Override
    public String getDefaultScheme() {
        return "multiaddress";
    }
}

您只能向ManangedChannel Builder提供一个地址。对于故障转移,您可以实现自己的NameResolverProvider并将其注册到NameResolverRegistry中。您自己的NameResolverProvider将提供一个解析器,可以将单个地址解析为多个地址。
ManagedChannelBuilder.forTarget("service")
            .nameResolverFactory(new MultiAddressNameResolverFactory(
                    new InetSocketAddress("hostA", 234),
                    new InetSocketAddress("hostA", 235),
                    new InetSocketAddress("hostB", 234)
            ))
            .defaultLoadBalancingPolicy("round_robin")
            .build();