我已经看到了一些关于负载平衡的高级信息,但我很难将这些信息整合在一起。以下是我的评论:
显然,核心部件是一个解析器和负载均衡器。我的用例是我有几个静态的,已知的地址。我只是想把它们作为主要的,次要的,等等来优先考虑。我相信pick_first政策会在这方面起作用。
我无法理解的是如何设置自定义NameResolver。我定义了一个定制的NameResolverProvider:
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";
}
}并且(希望)在创建“我的频道”时注册它:
new NameResolverRegistry().register(new StaticResolverProvider());最后,下面是(当前未实现的) NameResolver:
public class StaticResolver extends NameResolver {
@Override
public String getServiceAuthority() {
return null;
}
@Override
public void shutdown() {
}
}这是我认为唯一需要实现的两种方法。这两种方法似乎都与返回已知地址的有序列表无关。getServiceAuthority()提到身份验证,这让我感到困惑,因为我不知道NameResolver与身份验证有什么关系。
请告诉我错过了什么。谢谢!
更新
我想出了这个名字。首先,在我的频道注册我的解析器看起来有点不同:
NameResolverRegistry.getDefaultRegistry().register(new StaticResolverProvider());在我的NameResolverProvider中,我更新了getDefaultScheme()方法以返回"customScheme",这是将其链接到频道对forTarget()的调用的部分。
最后一部分是在我的refresh()中实现NameResolver方法:
@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());
}发布于 2022-09-28 06:35:43
这是我认为唯一需要实现的两种方法。
这些都是抽象的。但是,您需要实现的主要工具是refresh(),它被定义为no-op,但需要在实现中被覆盖以执行任何有用的操作。您可以查看UdsNameResolver以查看refresh()是如何实现的,并遵循该模式。
getServiceAuthority()提到了身份验证
对于用例,您可以忽略它。
https://stackoverflow.com/questions/73859400
复制相似问题