gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:56:08 27 4
gpt4 key购买 nike

我想对 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com