首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GRPCv1.34.1的客户端负载平衡,nameResolverFactory已弃用

GRPCv1.34.1的客户端负载平衡,nameResolverFactory已弃用
EN

Stack Overflow用户
提问于 2020-12-23 22:13:17
回答 1查看 628关注 0票数 2

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

代码语言:javascript
运行
复制
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的较新版本,没有任何可用的参考。

代码语言:javascript
运行
复制
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的替代方案是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-31 17:50:57

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

代码语言:javascript
运行
复制
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自定义实现将通过通道获取以连接到服务器。根据负载均衡策略,选择一个SocketAddress连接到服务器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65425708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档