gpt4 book ai didi

java - grpc v1.34.1 的客户端负载均衡,不推荐使用 nameResolverFactory

转载 作者:行者123 更新时间:2023-12-05 03:46:07 28 4
gpt4 key购买 nike

我在 Java 中使用 grpc v1.34.1 并且很难配置客户端负载平衡,因为一些方法在这个版本中被弃用了。通过以下方式在早期版本中配置客户端负载平衡非常简单:

final ManagedChannel channel = ManagedChannelBuilder.forTarget(target)
.nameResolverFactory(new DnsNameResolverProvider()) // this is on by default
.loadBalancerFactory(RoundRobinLoadBalancerFactory.getInstance())
.usePlaintext(true)
.build();

或者通过这个https://sultanov.dev/blog/grpc-client-side-load-balancing/

但是,对于已弃用 nameResolverFactory 并删除方法 loadBalancerFactory 的较新版本,没有任何可用的引用。

NameResolver.Factory nameResolverFactory = new MultiAddressNameResolverFactory(
new InetSocketAddress("localhost", 50000),
new InetSocketAddress("localhost", 50001),
new InetSocketAddress("localhost", 50002)
);

channel = ManagedChannelBuilder.forTarget("localhost")
.nameResolverFactory(nameResolverFactory)
.defaultLoadBalancingPolicy("round_robin")
.usePlaintext()
.build();

客户端负载平衡有效。但是,较新的 API 已弃用 nameResolverFactory

任何人都可以指出我在较新版本中使用 nameResolverFactory 的替代方案来实现不同服务器(主机和端口)的客户端负载平衡吗?

最佳答案

通过 grpc-java 内部实现后,我发现新版本接受 NameResolver.Factory 对象的方式略有不同。它被封装到NameResolverProvider,需要注册到默认的NameResolverRegistry。下面分享了在较新版本中执行此操作的示例代码:

NameResolverProvider nameResolverFactory = new MultiAddressNameResolverFactory(
new InetSocketAddress("localhost", 50000),
new InetSocketAddress("localhost", 50001),
new InetSocketAddress("localhost", 50002)
);

NameResolverRegistry nameResolverRegistry = NameResolverRegistry.getDefaultRegistry();
nameResolverRegistry.register(nameResolverFactory);
channel = ManagedChannelBuilder.forTarget("localhost")
.defaultLoadBalancingPolicy("round_robin")
.usePlaintext()
.build();


public class MultiAddressNameResolverFactory extends NameResolverProvider {
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";
}

@Override
protected boolean isAvailable() {
return true;
}

@Override
protected int priority() {
return 0;
}
}

默认情况下,您对 NameResolver.Factory 的自定义实现将由 channel 选择以连接到服务器。根据负载平衡策略,将选择一个 SocketAddress 连接到服务器。

关于java - grpc v1.34.1 的客户端负载均衡,不推荐使用 nameResolverFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65425708/

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