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();