java - 具有静态地址的 Grpc Java 热故障转移

标签 java grpc failover grpc-java

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

ManagedChannelBuilder.forAddress("hostA", 234).build();

理想情况下我能够做类似的事情:

ManagedChannelBuilder
   .forAddress("hostA", 234)
   .forAddress("hostA", 235)
   .forAddress("hostB", 234)
   .build();

它会根据每个请求从列表中选择一个工作服务。 看起来像 this在 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";
    }
}

并将其与循环算法一起使用,如下所示:

ManagedChannelBuilder.forTarget("service")
            .nameResolverFactory(new MultiAddressNameResolverFactory(
                    new InetSocketAddress("hostA", 234),
                    new InetSocketAddress("hostA", 235),
                    new InetSocketAddress("hostB", 234)
            ))
            .defaultLoadBalancingPolicy("round_robin")
            .build();

关于java - 具有静态地址的 Grpc Java 热故障转移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58200860/

相关文章:

mongodb - 使用 mongodb 进行故障转移

java - 如何修改抽象数据类型(ADT)堆栈?

java - Bluemix 构建和部署管道不适用于 Maven

java - 合并排序具有可变字数的多个文件

grpc - 在服务器拦截器中应答 gRPC 调用

python : Process calling GRPC server gets stuck and terminates unexpectedly

python - 如何将 gRPC 服务器/客户端部署到 heroku?

Java 6 解析例程正在截断 SQLquery

MySQL 代理和基本故障转移(检测状态)

php - 将 predis 故障转移到 redis 从站的最佳方法是什么?