`
fruwei
  • 浏览: 14356 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

zookeeper &curator 服务注册

阅读更多
Zookeeper & Curator 服务注册
curator是最简单的Zookeeper客户端

Curator主要组件
Recipes   (扩展:包括分布式锁、队列、选举等)
Framework  (框架)
Utilities  (工具)
Client (客户端)
Errors  (错误处理)
另外Curator提供了一些扩展库,比如用于服务注册的curator-x-discovery

服务定义  ServiceInstance
Curator 中使用可以使用ServiceInstance作为服务定义对象
通常一个服务对象具有服务名、服务id、地址、端口和有效数据等属性,
下面就是ServiceInstance类的变量定义。
public class ServiceInstance<T> {
    private final String name;
    private final String id;
    private final String address;
    private final Integer port;
    private final Integer sslPort;
    private final T payload;
    private final long registrationTimeUTC;
    private final ServiceType serviceType;
    private final UriSpec uriSpec;
    ...
}

服务注册过程就是将ServiceInstance实例写到Zookeeper层次结构中,服务名name会生成一个ZkNode,id会生成这个name下孩子节点,在注册的时候会指定根路径,所以注册之后的服务在zookeeper中如下图所示

根路径(注册时指定)
|_____name1 //服务名1
|        |______id1->序列化ServiceInstance1
| |______id2->序列化ServiceInstance2
|
|_____name2 //服务名2
|        |______id1->序列化ServiceInstance1
| |______id2->序列化ServiceInstance2
|
可以先通过客户端连接到本地zookeeper查看下具体的服务注册情况,其注册在/###/services/路径下,会发现有很多服务,再进服务查看可以看到这个服务下有多少个实例,其节点为其id(如果服务未设置id,使用的是默认随机生成的字符串)。
要注意到是服务在注册时生成的name服务名节点是持久的节点,而服务名下面的实例id节点是临时节点,正常服务结束,可以通过提供的相关api来删除对应的节点,临时节点能保证注册服务的程序异常退出或失去连接后也能做到将服务节点摘除。


构造服务实例的方法很简单,可以通过ServiceInstance的build方法进行建造。
在练习中定义了一个简单的服务业务类XServInstance
public class XServInstance implements Serializable{
    private  String id;
    private  String name;
    private  String path;
    get&set()...
}

建造ServiceInstance的代码如下:
ServiceInstance<XServInstance> serviceInstance= ServiceInstance.<XServInstance>builder()
                .id(instance.getId())
                .name(instance.getName())
                .payload(instance).build();

服务注册  ServiceDiscovery
Curator使用ServiceDiscovery进行服务注册,可以把它认为是服务管理中心,通过它也能查找我们的服务。ServiceDiscovery同样采用建造者方式,由ServiceDiscoveryBuilder进行构造,在构造完成之后需要调用start方法!SERV_PAHT指定我们服务需要注册在zookeeper的哪个目录
JsonInstanceSerializer<XServInstance> serializer=new JsonInstanceSerializer<XServInstance>(XServInstance.class);
serviceDiscovery= ServiceDiscoveryBuilder.builder(XServInstance.class)
                .basePath(SERV_PATH)
                .client(client)
                .serializer(serializer)
                .build();
serviceDiscovery.start();

client是curator的zookeeper客户端,通过下面方式构造:
RetryPolicy retryPolicy=new RetryOneTime(1000);
//CONNECT_STR : "127.0.0.1:2181"
client= CuratorFrameworkFactory.newClient(CONNECT_STR,retryPolicy);
client.start()//必须调用

注册服务的代码就一行:
serviceDiscovery.registerService(serviceInstance);

此时服务已注册,在程序未退出时查看SERV_PATH下的内容即注册服务serviceInstance的name,再下一层就是id了,如果同一个服务注册了多个,则会有多个id(注册id相同只会有一个)。退出程序之后,由其注册的id也就没了。
ServiceDiscovery除了注册服务,同时也能查询服务,其三个主要的查询方法如下:



    +  Collection<String> queryForNames()  //查询所有服务名
    +  Collection<ServiceInstance<T>>  queryForInstances(String name)  //查询指定服务名下的所有服务实例
    +  ServiceInstance<T> queryForInstance(String name, String id)      //根据服务名和id查询服务实例

服务提供  ServiceProvider
这一步是Curator自带的服务提供方式,也可以不采用自带的服务提供者,而是通过ServiceDiscovery查询(queryForInstances)到服务之后,通过自己的策略进行服务选择(后期待续)。这里直接使用curator现成的服务提供者。


服务提供者的构造通过serviceDiscovery内部的建造者方法进行构造,同样必须先start
需要注意的是providerStrategy提供策略,对服务提供者设置一个服务选择策略,因为同一个服务名下有很多具体服务实例,具体选择哪一个可以由该策略决定:
常用的有RoundRobinStrategy 轮询,RandomStrategy 随机选择 ,StickyStrategy 粘性策略(总是选择同一个,没试过比较特殊,可能适用于某些服务调用者和提供者需要记录什么调用记录的情况下吧)
ServiceProvider servPro = serviceDiscovery.serviceProviderBuilder()
		.serviceName(servName)
		.providerStrategy(new RoundRobinStrategy<XServInstance>())
		.build();
servPro.start();

获取一个服务通过以下方式进行获取
ServiceInstance<XServInstance> serviceInstance=servPro.getInstance();

.

最后附上本练习简单的服务注册中心代码和测试代码
public class XServCenter {
    public  static final  String SERV_PATH="/myServices";
    ServiceDiscovery<XServInstance> serviceDiscovery ;
    Map<String,ServiceProvider> providerMap=new HashMap<String, ServiceProvider>();

    public  void init(CuratorFramework client) throws Exception {
        JsonInstanceSerializer<XServInstance> serializer=new JsonInstanceSerializer<XServInstance>(XServInstance.class);
        serviceDiscovery= ServiceDiscoveryBuilder.builder(XServInstance.class)
                .basePath(SERV_PATH)
                .client(client)
                .serializer(serializer)
                .build();
        serviceDiscovery.start();
    }

    public  void regist(XServInstance instance) throws Exception {
        ServiceInstance<XServInstance> serviceInstance= ServiceInstance.<XServInstance>builder()
                .id(instance.getId())
                .name(instance.getName())
                .payload(instance).build();
        serviceDiscovery.registerService(serviceInstance);

    }

    public  void list() throws Exception {
        Collection<String> servNames=serviceDiscovery.queryForNames();
        for(String servName:servNames){
            Collection<ServiceInstance<XServInstance>> instances=serviceDiscovery.queryForInstances("/"+servName);
            System.out.println(servName);
            for(ServiceInstance<XServInstance> instance:instances){
                System.out.println("------- : "+instance.getId());
            }

        }
    }

    public  void getServiceByName(String servName) throws Exception {
        ServiceProvider servPro =providerMap.get(servName);
        if (servPro==null) {
            servPro = serviceDiscovery.serviceProviderBuilder()
                    .serviceName(servName) //RandomStrategy StickyStrategy
                    .providerStrategy(new RoundRobinStrategy<XServInstance>())  
                    .build();
            servPro.start();
            providerMap.put(servName,servPro);
        }
        ServiceInstance<XServInstance> serviceInstance=servPro.getInstance();
        System.out.println("getServiceByName  "+serviceInstance.getId());
    }


Test
public class ServTest {
    public  static  final String CONNECT_STR="127.0.0.1:2181";
    public static CuratorFramework client;
    public  static  void main(String args[]) throws Exception {
        RetryPolicy retryPolicy=new RetryOneTime(1000);
        client= CuratorFrameworkFactory.newClient(CONNECT_STR,retryPolicy);
        if(client==null) return;
        client.start();
        XServCenter xServCenter=new XServCenter();
        xServCenter.init(client);
        Runtime.getRuntime().addShutdownHook(new Thread(){
            public void run() {
                CloseableUtils.closeQuietly(client);
            }
        });
        for(int i=0;i<10;i++) {
            for(int j=0;j<10;j++) {
                XServInstance xServInstance = new XServInstance();
                xServInstance.setId("serv_id_" + i+"_"+j);
                xServInstance.setName("serv_name_" + i);
                xServCenter.regist(xServInstance);
            }
        }
        System.out.println("#####list######");
        xServCenter.list();

        for(int i=0;i<1000;i++) {
            xServCenter.getServiceByName("serv_name_1");
            Thread.sleep(500);
        }

        Thread.sleep(600000);


    }
}
分享到:
评论

相关推荐

    5、zookeeper的java -Curator(服务注册与发现)

    在Java环境中,Curator是一个优秀的Zookeeper客户端库,简化了与Zookeeper的交互,包括服务注册与发现。本文将深入探讨如何利用Curator实现这一功能。 首先,Curator提供了一套完整的API来抽象服务注册与发现,包括...

    zookeeper 使用 Curator 示例监听、分布式锁

    Curator 提供了事件监听器,可以注册到 ZooKeeper 路径上,当该路径下发生创建、删除、数据改变等事件时,监听器会被触发。这在分布式系统中非常有用,例如监控配置变化、节点状态变更等。 四、Curator 实现分布式...

    zookeeper客户端curator操作示例

    可以注册监听器来接收ZooKeeper的各种事件,如节点创建、删除、数据更改等,这使得实时监控和响应ZooKeeper状态变化变得简单。 3. **数据和节点操作**: Curator提供了创建、读取、更新、删除(CRUD)ZooKeeper...

    项目加入zookeeper的依赖包(Curator框架)

    - 服务发现:通过`CuratorServiceDiscovery`和`CuratorServiceDiscoveryBuilder`实现服务注册和发现。 - 分布式锁:使用`InterProcessMutex`或`InterProcessSemaphoreMutex`来实现分布式锁。 - 监听器:注册`...

    springboot-zookeeper-curator.rar

    在分布式系统中,协调服务是至关重要的,Apache ZooKeeper和Curator作为其中的佼佼者,被广泛应用于配置管理、服务发现、分布式锁等场景。本教程将深入讲解如何在SpringBoot项目中集成Zookeeper Curator,帮助你更好...

    curator zookeeper 3.4.6 2.9.1

    这些库的组合表明,这个项目或者应用可能是在使用Curator和Zookeeper构建一个分布式服务系统,涉及数据存储、服务发现、故障恢复、测试等多个方面。开发者可以通过这些库和工具实现复杂而可靠的分布式协调解决方案。

    Zookeeper客户端Curator Framework使用代码

    Zookeeper是一个分布式协调服务,常用于管理配置信息、命名服务、集群状态同步、分布式锁等场景。它采用的是主从复制的架构,数据存储在内存中,确保高可用性和一致性。 2. **Curator Framework概述** Curator ...

    Zookeeper开源客户端框架Curator简介与示例

    Apache ZooKeeper 是一个分布式协调服务,它为分布式应用程序提供了一个简单一致的接口,用于管理命名空间、配置和服务发现。Zookeeper 的设计目标是高可用、高性能以及简单的操作。Curator 是一个基于 ZooKeeper 的...

    curator zookeeper

    curator zookeeper 3.4.6 2.9.1

    ZooKeeper-Curator:zookeeper的curator客户端

    ZooKeeper-Curator是Apache ZooKeeper的一个高级客户端,它提供了许多实用工具和抽象,使得与ZooKeeper交互变得更加简单和可靠。ZooKeeper是一个分布式协调服务,广泛用于管理分布式应用程序的状态,实现一致性、...

    zookeeper开源客户端Curator

    Curator是Netflix公司开源的一套ZooKeeper客户端框架,Curator解决了很多ZooKeeper客户端非常底层的细节开发工作,包括连接重连、反复注册Watcher和NodeExistsException异常等,实现了Fluent风格的API接口,目前已经...

    zookeeper学习之三(Curator客户端)

    在IT行业中,ZooKeeper是一个广泛使用的分布式协调服务,它为分布式应用提供了高效且可靠的命名服务、配置管理、集群同步等。本篇文章将专注于ZooKeeper的客户端——Curator,这是一个由Apache提供的Java库,旨在...

    Zookeeper 原生api zkClient Curator操作

    Zookeeper是一款分布式协调服务,广泛应用于分布式环境中的数据一致性管理,如配置管理、命名服务、分布式锁、集群管理等场景。在Java开发中,我们通常使用三种方式来操作Zookeeper:原生API、zkClient和Curator。接...

    zookeeper_demo maven项目:包含原生API、zkclient、Curator操作

    Curator是Apache的一个顶级项目,它是对Zookeeper客户端API的进一步封装,提供了更高的抽象层次和更多的实用工具,如recipes(配方),如分布式锁、领导选举、队列和命名服务等。Curator的出现降低了使用Zookeeper...

    zookeeper Java api - curator 5.6.0

    9. ** recipes**:Curator 提供了许多预定义的 recipes,如队列、栈、分布式开关、服务发现等,它们都是基于 ZooKeeper 原生特性的高级抽象。 10. **故障恢复策略**:Curator 提供了多种重试策略(如 `RetryOneTime...

    分布式框架Zookeeper之服务注册与订阅

    本篇文章将深入探讨Zookeeper在服务注册与订阅中的核心概念和实现机制。 一、Zookeeper服务注册 1. Zookeeper节点模型:Zookeeper的数据结构是一棵树,由节点(ZNode)组成。每个ZNode可以存储数据,并且可以有子...

    curator_zookeeper需要的jar

    这个版本的Zookeeper提供了分布式协调服务的基础,如节点创建、读写操作、watcher监听等。 接下来是Curator相关的JAR文件: 1. `curator-client-2.8.0.jar`:这是Curator的基本客户端库,提供了连接Zookeeper服务器...

    curator-example:ZooKeeper 客户端 Curator 示例

    1. **命名服务**:ZooKeeper 可以用来注册和查找服务,实现服务发现。 2. **配置管理**:分布式系统中的配置更新可以集中管理,并确保所有节点看到的是同一份最新的配置。 3. **集群管理**:ZooKeeper 可以用于监控...

    curator-test单元测试zookeeper

    使用apache curator-test单元测试zookeeper

    Zookeeper-Java客户端Curator

    Zookeeper_Java客户端Curator

Global site tag (gtag.js) - Google Analytics