码迷,mamicode.com
首页 > 其他好文 > 详细

12.Curator扩展库

时间:2015-11-02 00:10:21      阅读:357      评论:0      收藏:0      [点我收藏+]

标签:

    Recipes组件包含了丰富的Curator应用的组件。但是这些并不是ZooKeeper Recipe的全部。大量的分布式应用已经抽象出了许许多多的的Recipe,其中有些还是可以通过Curator来实现。
    如果不断都将这些Recipe都增加到Recipes中,Recipes会变得越来越大。为了避免这种状况,Curator把一些其它的Recipe放在单独的包中,命名方式就是curator-x-,比如curator-x-discovery, curator-x-rpc。本文就是主要介绍curator-x-discovery。

1.curator-x-discovery介绍

    curator-x-discovery是一个服务发现的解决方案。我们在介绍临时节点Ephemeral Node的时候就讲到,可以通过临时节点创建一个服务注册机制。服务启动后创建临时节点,服务断掉后临时节点就不存在了。这个扩展抽象了这种功能,通过一套API,可以实现服务发现机制。具体示例参考官网:http://curator.apache.org/curator-x-discovery/index.html
1.ServiceInstance类
    ServiceInstance是一个服务实例所代表的类。ServiceInstances有名称、id、地址、端口和/或ssl端口,和一个可选的payload属性(用户定义的)。 ServiceInstances序列化并存储在Zookeeper中的方式如下:
  1. base path
  2. |_______ service A name
  3. |__________ instance 1 id --> (serialized ServiceInstance)
  4. |__________ instance 2 id --> (serialized ServiceInstance)
  5. |__________ ...
  6. |_______ service B name
  7. |__________ instance 1 id --> (serialized ServiceInstance)
  8. |__________ instance 2 id --> (serialized ServiceInstance)
  9. |__________ ...
  10. |_______ ...
    ServiceInstances类的成员如下图:
技术分享
2.ServiceProvider
    ServiceProvider是主要的抽象类。它封装了发现服务为特定的命名服务和提供者策略。提供者策略方案选择一个实例从一组给定的服务实例。有三个捆绑策略:轮询调度、随机和粘性(总是选择相同的一个)。
    serviceprovider分配使用ServiceProviderBuilder。你获得一个ServiceProviderBuilder ServiceDiscovery(见下文)。 ServiceProviderBuilder允许您设置服务名称和其他几个可选值。
    ServiceProvider开始必须调用start()方法。当使用完成应该调用close()方法。ServiceProvider接口有以下两个重要的方法: 
  1. /**
  2. * Return an instance for a single use. <b>IMPORTANT: </b> users
  3. * should not hold on to the instance returned. They should always get a fresh instance.
  4. *
  5. * @return the instance to use
  6. * @throws Exception any errors
  7. */
  8. public ServiceInstance<T> getInstance() throws Exception;
  9. /**
  10. * Return the current available set of instances <b>IMPORTANT: </b> users
  11. * should not hold on to the instance returned. They should always get a fresh list.
  12. *
  13. * @return all known instances
  14. * @throws Exception any errors
  15. */
  16. public Collection<ServiceInstance<T>> getAllInstances() throws Exception;
getInstance()方法用于获取服务实例。getAllInstances()方法获取所有的服务实例。以下是ServiceProvider接口的所有成员。
技术分享
3.ServiceDiscovery
    为了创建ServiceProvider,你必须有一个ServiceDiscovery。它是由一个ServiceDiscoveryBuilder创建。开始必须调用start()方法。当使用完成应该调用close()方法。
 技术分享
实例的稳定性:如果一个特定的实例有一个错误(如:I/O错误),你应该调用ServiceProvider.noteError()。该ServiceProvider将暂时认为有错误的情况下,确定为“down”的实例。The thresholds and timeouts for down instances are set via the DownInstancePolicy which can be passed to ServiceProviderBuilder (note: a default DownInstancePolicy is used if you don‘t specify one).

2.低级别的API介绍

    ServiceProvider API都是你应该给最需要的目的。然而,对于更细粒度的控制,您可以使用这些方法: 
1.服务注册/取消注册
    通常,您将您的应用程序的服务描述符传递给ServiceDiscovery构造函数,它会自动注册/注销。不过,如果您需要手动做这个,使用这些方法:
  1. /**
  2. * Register/re-register a service 注册服务
  3. *
  4. * @param service service to add
  5. * @throws Exception errors
  6. */
  7. public void registerService(ServiceInstance<T> service) throws Exception;
  8. /**
  9. * Unregister/remove a service instance 取消注册服务
  10. *
  11. * @param service the service
  12. * @throws Exception errors
  13. */
  14. public void unregisterService(ServiceInstance<T> service) throws Exception;
2.查询服务
    您可以查询服务名称,特定服务的所有实例,或单一的服务实例。 
  1. /**
  2. * Return the names of all known services
  3. *
  4. * @return list of service names
  5. * @throws Exception errors
  6. */
  7. public Collection<String> queryForNames() throws Exception;
  8. /**
  9. * Return all known instances for the given service
  10. *
  11. * @param name name of the service
  12. * @return list of instances (or an empty list)
  13. * @throws Exception errors
  14. */
  15. public Collection<ServiceInstance<T>> queryForInstances(String name) throws Exception;
  16. /**
  17. * Return a service instance POJO
  18. *
  19. * @param name name of the service
  20. * @param id ID of the instance
  21. * @return the instance or <code>null</code> if not found
  22. * @throws Exception errors
  23. */
  24. public ServiceInstance<T> queryForInstance(String name, String id) throws Exception;
3.服务缓存
    上面的查询方法直接调用Zookeeper。 如果你需要经常查询的服务可以使用ServiceCache。它在内存中缓存实例的列表为特定的服务。它使用一个观察者保持最新的列表。
    你创建一个ServiceCache通过调用ServiceDiscovery.serviceCacheBuilder()方法。ServiceCache对象开始必须调用start()方法。当使用完成应该调用close()方法。你可以得到当前已知的实例列表服务通过调用:
  1. /**
  2. * Return the current list of instances. NOTE: there is no guarantee of freshness. This is
  3. * merely the last known list of instances. However, the list is updated via a ZooKeeper watcher
  4. * so it should be fresh within a window of a second or two.
  5. *
  6. * @return the list
  7. */
  8. public List<ServiceInstance<T>> getInstances();
    ServiceCache支持得到通知的侦听器,当观察者更新实例的列表(需要增加监听ServiceCacheListener):
  1. /**
  2. * Listener for changes to a service cache
  3. */
  4. public interface ServiceCacheListener extends ConnectionStateListener
  5. {
  6. /**
  7. * Called when the cache has changed (instances added/deleted, etc.)
  8. */
  9. public void cacheChanged();
  10. }

3.curator-x-discovery使用实例

1.定义服务基本信息的类

2.服务类

3.发现中心

4.测试结果及其分析

4.其他扩展介绍

    其它两个扩展Curator RPC Proxy(curator-x-rpc)扩展和Service Discovery Server(curator-x-discovery-server)是为了桥接非Java应用的扩展,本系列将不再介绍了。感兴趣的朋友可以看下面的文档。

-------------------------------------------------------------------------------------------------------------------------------



12.Curator扩展库

标签:

原文地址:http://www.cnblogs.com/LiZhiW/p/4928964.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!