JAR包:
Curator Service Discovery在Maven Central中以其独立的软件包提供:curator-x-discovery
什么是Discovery Service
在SOA /分布式系统中,服务需要相互查找。 即网络服务可能需要找到缓存服务,等等。DNS可以用于此目的,但是对于不断变化的服务而言,它的灵活性还远远不够。 服务发现系统提供了以下机制:
- 可用服务的注册
- 查找特定服务的单个实例
- 服务实例更改通知
Curator Service Discovery
ServiceInstance
服务实例由类ServiceInstance表示。 ServiceInstance具有名称,ID,地址,端口和/或SSL端口,以及可选的有效负载(用户定义)。 ServiceInstance以以下方式序列化并存储在ZooKeeper中:
base path
|_______ service A name
|__________ instance 1 id --> (serialized ServiceInstance)
|__________ instance 2 id --> (serialized ServiceInstance)
|__________ ...
|_______ service B name
|__________ instance 1 id --> (serialized ServiceInstance)
|__________ instance 2 id --> (serialized ServiceInstance)
|__________ ...
|_______ ...
ServiceProvider
主要的抽象类是ServiceProvider。 它封装了特定命名服务的发现服务以及提供者策略。 提供者策略是一种用于为给定服务从一组实例中选择一个实例的方案。 共有三种策略:Round Robin,Random和Sticky(始终选择相同的策略)。
通过ServiceProviderBuilder实例化ServiceProvider。 您可以从ServiceDiscovery获得ServiceProviderBuilder(请参见下文)。 ServiceProviderBuilder允许您设置服务名称和其他几个可选值。必须通过调用start()来启动ServiceProvider。 完成后,您应该调用close()。 ServiceProvider中的唯一方法是:
/**
*
*返回单个可用的服务实例,请注意,不要在使用过程中一直持有返回的
*单个对象,而是重新获取新的服务实例。
**/
ServiceInstance<T> getInstance() throws Exception;
注意:使用Curator 2.x(Zookeeper 3.4.x)时,必须由应用程序缓存并重用服务提供者对象。
ServiceDiscovery
为了分配ServiceProvider,您必须具有ServiceDiscovery。 它由ServiceDiscoveryBuilder创建。您必须在对象上调用start(),并在完成后调用close()。
Instance Stability
如果特定实例发生I / O错误等,则应调用传入该实例的ServiceProvider.noteError()。 ServiceProvider将暂时认为有错误的实例为“关闭”。 停机实例的阈值和超时是通过DownInstancePolicy设置的,该实例可以传递给ServiceProviderBuilder(注意:如果您未指定默认实例,则使用默认的DownInstancePolicy)。
低级API
ServiceProvider API是您大多数用途所需的全部。 但是,对于更细粒度的控制,可以使用以下方法:
注册/注销服务
public void registerService(ServiceInstance<T> service)
throws Exception
public void unregisterService(ServiceInstance<T> service)
throws Exception
查询服务
/**
*返回所有已知服务的名称
**/
public Collection<String> queryForNames()
throws Exception
/**
*返回给定服务的所有已知实例
**/
public Collection<ServiceInstance<T>> queryForInstances(String name)
throws Exception
/**
**返回给定服务的ServiceInstance为id的
**/
public ServiceInstance<T> queryForInstance(String name,
String id)
服务缓存
以上每个查询方法均直接调用ZooKeeper。 如果您频繁调用查询服务,还可以使用ServiceCache。 它将特定服务的实例列表缓存在内存中。 它使用观察程序来使列表保持最新。
您可以通过ServiceDiscovery.serviceCacheBuilder()返回的构建器分配ServiceCache。 必须通过调用start()来启动ServiceCache对象,完成后,您应该调用close()。 您可以通过调用以下命令获取服务的当前已知实例列表:
/**
*返回当前实例列表。 注意:不能保证返回最新的列表。这仅仅是实例的最后已知列表。 但是,该列表是通过
*ZooKeeper监视程序更新的,因此它应该在一两秒钟的时间内刷新。
**/
public Collection<ServiceInstance<T>> getInstances()
ServiceCache支持一个侦听器,当Watcher更新实例列表时,该侦听器会收到通知:
/**
* Listener for changes to a service cache
*/
public interface ServiceCacheListener extends ConnectionStateListener
{
/**
* Called when the cache has changed (instances added/deleted, etc.)
*/
public void cacheChanged();