问题
The page on Service Discovery using apache curator (https://github.com/Netflix/curator/wiki/Service-Discovery) introduces the following concepts:
The main abstraction class is ServiceProvider. It encapsulates the discovery service for a particular named service along with a provider strategy. A provider strategy is a scheme for selecting one instance from a set of instances for a given service. There are three bundled strategies: Round Robin, Random and Sticky (always selects the same one). ServiceProviders are allocated by using a ServiceProviderBuilder.
Each of the above query methods calls ZooKeeper directly. If you need more than occasional querying of services you can use the ServiceCache. It caches in memory the list of instances for a particular service. It uses a Watcher to keep the list up to date. You allocate a ServiceCache via the builder returned by ServiceDiscovery.serviceCacheBuilder().
I can see how to use the Provider strategies with a ServiceProviderBuilder
, but there's no equivalent method on the ServiceCacheBuilder
, and the only relevant method available on the ServiceCache
class itself is getInstances()
, which gets all instances.
How can I use a provider strategy with a ServiceCache
?
回答1:
@simonalexander2005 I was just looking in the code and it turns out that ServiceProvider
internally already uses a serviceCacheBuilder
. TBH - I've either forgotten about this or it got put in by another committer - I'm not sure. Anyway, I'm very sorry about the runaround here. Also, the documentation must be updated to reflect this - I'll open an issue for this today. I'm sure this be maddening to you, again sorry for this. The good news, though, is that with ServiceProvider
you automatically get caching.
回答2:
Frankly, the docs on this are really bad. It would be fantastic if someone could give a pull request with better docs...
Notice that ServiceCache
implements InstanceProvider
. Also notice that ProviderStrategy.getInstance()
has as its argument InstanceProvider
. Therefore, you can pass a ServiceCache instance to whichever ProviderStrategy you want to use.
I hope this helps.
来源:https://stackoverflow.com/questions/57009605/using-selection-strategies-with-a-cache-in-curator