我想为我的grpc客户端使用热故障转移,因此,如果连接失败,它将直接故障转移到启动时指定的另一台服务器。我不想添加其他外部解析器,而是在初始化时直接设置所有可能的服务地址。目前,我正在建立这样的频道:
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();