12.Curator扩展库

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应用的扩展,本系列将不再介绍了。感兴趣的朋友可以看下面的文档。

Curator Service Discovery :http://curator.apache.org/curator-x-discovery-server/index.html

Curator RPC Proxy :http://curator.apache.org/curator-x-rpc/index.html

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

来自为知笔记(Wiz)

时间: 2024-08-10 02:09:29

12.Curator扩展库的相关文章

跟着实例学习ZooKeeper的用法: Curator扩展库

还记得Curator提供哪几个组件吗? 我们不妨回顾一下: Recipes Framework Utilities Client Errors Extensions 前面的例子其实前五个组件都涉及到了, 比如Utilities例子的TestServer, Client里的CuratorZookeeperClient, Errors里的ConnectionStateListener等. 还有最后一个组件我们还没有介绍,那就是Curator扩展组件. Recipes组件包含了丰富的Curator应用

树莓派安装opencv3及其扩展库

https://www.cnblogs.com/Pyrokine/p/8921285.html 目标编译针对python的opencv以及扩展库 环境树莓派4和3B+都可以python3.7.3 python2.7共存opencv3.4.8--------------------------------------------------------------------------------------------------------------------------------安装

开发者必备的 12 个 JavaScript 库

现在 web 设计是最有趣的了,做好 web 设计不仅要熟练使用 Javascript,css 和 html 等,还要有自己的创意设计.为了方便大家发挥自己的创意,就产生了很多 JS 框架,Node.js 扩展等等.有了这些工具,开发者们就能专注于创意设计了,而不用为某个功能而花费太多精力.这里我们介绍的是 12 个开发者们必备的 JavaScript 库,都是一些很基础功能很强大的库.有了这些库,开发者们可以节省很多时间,大大提高开发的效率,所以大家赶紧收藏起来吧:) 1) Headroom.

mysqli扩展库操作mysql数据库

配置环境 配置php.ini文件让php支持mysqli扩展库 extension=php_mysqli.dll 建库建表 详见博客 “mysql扩展库操作mysql数据库” 查询数据库 1 <?php 2 //mysqli扩展库操作mysql数据库,面向对象 3 $mysqli=new MySQLi("localhost","root","root","test"); 4 if($mysqli->connect_

php动态链接扩展库

文章来源:http://keping.me/php-call-so/ PHP调用C/C++动态链接库 David June 19, 2013 C++, Linux, Study 摘要 有时候,单纯依靠 PHP “本身”是不行的.尽管普通用户很少遇到这种情况,但一些专业性的应用则经常需要将 PHP 的性能发挥到极致(这里的性能是指速度或功能).由于受到 PHP 语言本身的限制,同时还可能不得不把庞大的库文件包含到每个脚本当中.因此,某些新功能并不是总能被顺利实现,所以我们必须另外寻找一些方法来克服

PHP mysqli 扩展库(面向对象/数据库操作封装/事务控制/预编译)

1.和mysql扩展库的区别: (1   安全性.稳定性更高 (2  提供了面向对象和面向过程两种风格 2.php.ini  中的  extension=php_mysqli.dll 解除封印 3.面向对象:查询列表 1 <?php 2 3 //mysqli 操作数据(面向对象风格) 4 5 #1.创建Mysql对象 6 7 $mysqli=new MySQLi("127.0.0.1","root","daomul","test&

1cocos2dx扩展库UI控件,CCControlSlider,CCScale9Sprite(九妹图),CCControlSwitch,CCControlButton

 UI控件来自cocos2dx的扩展库,完善了UI方面的元素,使cocos2dx更加丰富多彩.使用扩展库需包含: #include "cocos-ext.h" USING_NS_CC_EXT; CCControlSlider CCControlSlider * slider = CCControlSlider::create("sliderTrack.png","sliderProgress.png","sliderThumb.pn

关于lua扩展库lpack的使用指南

最近在研究luasocket,准备用全部用lua的扩展库来实现一套轻量级框架,用来做一些工具.简单的游戏服务器,以及作为网络库用在cocos2dx中. 完善的网络库必然会遇到粘包.半包的问题,luasocket也不例外,由于网络部分在lua,协议的制定和buff的解析都没有合适的方案,又不想在C++中来封装接口,后面在网上查了一些资料,发现lua也有一个二进制打包的扩展库--lpack,了解之后发现还是蛮好用的,就决定使用它来做buff解析,用以解决粘包.半包的问题. 首先需要下载lpack的源

PHP加密扩展库—Mcrypt扩展库

在本文开始正文开始之前,我们先来了解一下什么是PHP加密扩展库:PHP中不但几种加密函数(md5,crypt,sha1),在此之外,PHP中还有一些功能比较全面的加密扩展库!就好比php本来不支持操作某种功能 ,但在新版本想对它提供支持,就以扩展的方式来提供,这样,我们在配置php时,如果我们不用此功能,我们就可以让php不加载他.从而节省服务器资源.提供其性能.直线电机选型 在以前的三篇文章<PHP加密函数—crypt()函数加密>.<PHP加密函数—md5()函数加密>以及&l