首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用grpc-java配置客户端负载平衡

如何使用grpc-java配置客户端负载平衡
EN

Stack Overflow用户
提问于 2022-09-26 20:05:33
回答 1查看 77关注 0票数 0

我已经看到了一些关于负载平衡的高级信息,但我很难将这些信息整合在一起。以下是我的评论:

显然,核心部件是一个解析器和负载均衡器。我的用例是我有几个静态的,已知的地址。我只是想把它们作为主要的,次要的,等等来优先考虑。我相信pick_first政策会在这方面起作用。

我无法理解的是如何设置自定义NameResolver。我定义了一个定制的NameResolverProvider:

代码语言:javascript
复制
public class StaticResolverProvider extends NameResolverProvider {

    @Value("${tls.enabled}")
    private boolean isTlsEnabled;

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

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

    @Override
    public NameResolver newNameResolver(URI targetUri, Args args) {
        return new StaticResolver();
    }

    @Override
    public String getDefaultScheme() {
        return isTlsEnabled ? "https" : "http";
    }
}

并且(希望)在创建“我的频道”时注册它:

代码语言:javascript
复制
new NameResolverRegistry().register(new StaticResolverProvider());

最后,下面是(当前未实现的) NameResolver:

代码语言:javascript
复制
public class StaticResolver extends NameResolver {

    @Override
    public String getServiceAuthority() {
        return null;
    }

    @Override
    public void shutdown() {
    }
}

这是我认为唯一需要实现的两种方法。这两种方法似乎都与返回已知地址的有序列表无关。getServiceAuthority()提到身份验证,这让我感到困惑,因为我不知道NameResolver与身份验证有什么关系。

请告诉我错过了什么。谢谢!

更新

我想出了这个名字。首先,在我的频道注册我的解析器看起来有点不同:

代码语言:javascript
复制
NameResolverRegistry.getDefaultRegistry().register(new StaticResolverProvider());

在我的NameResolverProvider中,我更新了getDefaultScheme()方法以返回"customScheme",这是将其链接到频道对forTarget()的调用的部分。

最后一部分是在我的refresh()中实现NameResolver方法:

代码语言:javascript
复制
@Override
public void refresh() {
    ResolutionResult.Builder resolutionResultBuilder = ResolutionResult.newBuilder();
    List<EquivalentAddressGroup> servers = new ArrayList<>();
    servers.add(new EquivalentAddressGroup(new InetSocketAddress("localhost", 50055)));
    servers.add(new EquivalentAddressGroup(new InetSocketAddress("localhost", 50056)));
    resolutionResultBuilder.setAddresses(Collections.unmodifiableList(servers));
    listener.onResult(resolutionResultBuilder.build());
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-28 06:35:43

这是我认为唯一需要实现的两种方法。

这些都是抽象的。但是,您需要实现的主要工具是refresh(),它被定义为no-op,但需要在实现中被覆盖以执行任何有用的操作。您可以查看UdsNameResolver以查看refresh()是如何实现的,并遵循该模式。

getServiceAuthority()提到了身份验证

对于用例,您可以忽略它。

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

https://stackoverflow.com/questions/73859400

复制
相关文章

相似问题

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