美文网首页
源码时代Java干货分享|带你认识Zookeeper 分布式服务

源码时代Java干货分享|带你认识Zookeeper 分布式服务

作者: 源码时代官方 | 来源:发表于2019-12-14 23:28 被阅读0次
    image.png

    本质

    它是一个分布式服务框架,是Apache Hadoop 的一个子项目
    提供一种集中式信息存储服务,用于解决分布式应用中的一些数据管理问题
    简单来说 zookeeper = 文件系统 + 监听通知机制。

    特点

    数据存在内存中
    类似文件系统的树形结构(文件和目录)
    高吞吐量和低延迟
    集群高可靠

    作用

    实现分布式统一配置中心
    服务注册中心
    分布式锁等功能
    用于分布式应用程序的高性能协调

    ZK实现配置中心操作

    ZK 配置节点信息
    我们通过 zkui 添加一个节点,并存放一些数据信息


    image.png

    Java 实现

    1. pom 引入
      <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.0.5.RELEASE</version>
      </parent>

      <dependencies>
      <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      </dependency>

      <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-configuration-processor</artifactId>
      <optional>true</optional>
      </dependency>

      <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      </dependency>

      <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      </dependency>

      <dependency>
      <groupId>org.apache.curator</groupId>
      <artifactId>curator-recipes</artifactId>
      <version>4.0.0</version>
      </dependency>
      </dependencies>

      <properties>
      <java.version>1.8</java.version>
      </properties>

    2. 配置中心

    本地配置文件 application.properties 中,需要配置关于Zookeeper配置中心的信息
    config.zookeeper.url=127.0.0.1:2181
    config.zookeeper.nodename=pay-server-config

    3. 监听配置修改

    当配置中心的数据发生修改,我们需要实时的更新到各个站点去
    Zookeeper的订阅发布
    zk的发布订阅也就是watch机制,是一个轻量级的设计。
    它采用了一种推拉模式。
    一旦服务端感知数据发生了变化,那么会发送一个事件类型和节点信息给关注的客户端,而不会包括具体的变更内容,所以事件本身是轻量级的,这就是所谓的“推”部分。然后,收到变更通知的客户端需要自己去拉变更的数据,这就是“拉”部分。


    image.png
    1. Java客户端实现
      @Configuration
      public class ZkConfig {

      @Value("{config.zookeeper.url}") String zkUrl; // 配置文件读取zk的地址 @Value("{config.zookeeper.nodename}")
      String nodename; // 配置所在的节点名

      private Properties properties = new Properties();

      public String getProperty(String key) {
      String value = properties.getProperty(key);

       if (StringUtils.isEmpty(value)) {
           throw new RuntimeException("配置信息不存在");
       }
       return value;
      

      }

      @PostConstruct
      public void init() {
      CuratorFramework zkclient = CuratorFrameworkFactory.newClient(zkUrl,
      new RetryOneTime(1000));
      zkclient.start();// 启动Zookeeper的连接

       try {
           // 1. 读取zookeeper数据
           HashMap<String, String> configMap = new HashMap<>();
           List<String> configKeys = zkclient.getChildren().forPath("/" + nodename);
           for (String configKey : configKeys) {
               byte[] data = zkclient.getData().forPath("/" + nodename + "/" + configKey);
               configMap.put(configKey, new String(data));
           }
      
           // 2. 把数据存储到 properties中
           properties.putAll(configMap);
      
           // 3. 配置发生修改  -->  watch监听机制
           TreeCache treeCache = new TreeCache(zkclient, "/" + nodename);
           treeCache.start(); // 监听整个节点内的数据变化
      
           treeCache.getListenable().addListener(new TreeCacheListener() {
               @Override
               public void childEvent(CuratorFramework curatorFramework, 
      

      TreeCacheEvent treeCacheEvent) throws Exception {
      // 如果zk中有数据变化,执行相应的代码
      switch (treeCacheEvent.getType()) {
      case NODE_UPDATED:
      System.out.println("数据发生了变化: "+treeCacheEvent.getData());

                      String key = treeCacheEvent.getData().getPath().replace("/"+nodename+"/","");
                      String value = new String(treeCacheEvent.getData().getData());
                      properties.setProperty(key, value);
                        break;
                      default:
                        break;// 其他情况不做处理
       }
                }
            });
         } catch (Exception e) {
             e.printStackTrace();
         }
      

      }
      }


      image.png

    相关文章

      网友评论

          本文标题:源码时代Java干货分享|带你认识Zookeeper 分布式服务

          本文链接:https://www.haomeiwen.com/subject/exzhnctx.html