有关使用apache curator(https://github.com/Netflix/curator/wiki/Service-Discovery)进行服务发现的页面引入了以下概念:
主要的抽象类是ServiceProvider。它封装了特定命名服务的发现服务以及提供者策略。提供者策略是一种用于为给定服务从一组实例中选择一个实例的方案。共有三种捆绑策略:Round Robin,Random和Sticky(始终选择相同的策略)。通过使用ServiceProviderBuilder分配ServiceProvider。
以上每种查询方法均直接调用ZooKeeper。如果您不仅仅需要偶尔查询服务,还可以使用ServiceCache。它将特定服务的实例列表缓存在内存中。它使用观察程序来使列表保持最新。您可以通过ServiceDiscovery.serviceCacheBuilder()返回的构建器分配ServiceCache。
我可以看到如何在ServiceProviderBuilder
中使用提供者策略,但是ServiceCacheBuilder
上没有等效方法,ServiceCache
类本身唯一可用的相关方法是{ {1}},它获取所有个实例。
如何与getInstances()
一起使用提供商策略?
答案 0 :(得分:1)
坦率地说,关于此的文档确实很糟糕。如果有人可以提出要求更好的文档的请求,那就太棒了……
请注意,void parse(string input) { // helper function to set up recursion
parse_rec(istringstream(input), 0);
}
void parse_rec(istringstream& stream, int level) {
// 'level' param indicates how many nested brackets we've seen
string token;
while (stream >> token) {
if (is_close_bracket(token) { return; }
else if (is_open_bracket(token)) {
parse_rec(stream, level + 1);
}
else {
// handle token at this level
}
}
// If we get here, we ran out of tokens. So if we're not at the base level...
if (level) {
// ... then we had an unmatched bracket, so do error handling
}
}
实现了ServiceCache
。还要注意,InstanceProvider
作为其自变量ProviderStrategy.getInstance()
。因此,您可以将ServiceCache实例传递给想要使用的任何ProviderStrategy。
我希望这会有所帮助。
答案 1 :(得分:1)
@ simonalexander2005我只是在看代码,结果发现ServiceProvider
内部已经使用了serviceCacheBuilder
。 TBH-我已经忘记了它,或者它被另一个提交者放入了-我不确定。无论如何,对于此处的解决方法,我感到非常抱歉。另外,必须更新文档以反映这一点-我今天将为此发布一个问题。我敢肯定这会让你发疯,对此再次感到抱歉。好消息是,ServiceProvider
会自动使您缓存。