首页 > 其他分享 >中间件 ZK分布式专题与Dubbo微服务入门 6-3 同步异步创建zk节点

中间件 ZK分布式专题与Dubbo微服务入门 6-3 同步异步创建zk节点

时间:2024-03-30 17:55:53浏览次数:18  
标签:Dubbo String ZK 创建 zookeeper 中间件 节点 path public

0    课程地址

https://coding.imooc.com/lesson/201.html#mid=12719

 

1    重点关注

1.1    本节内容

java api客户端新增临时节点和永久节点

 

1.2    java api 新增节点同步调用

            /**
             * 同步或者异步创建节点,都不支持子节点的递归创建,异步有一个callback函数
             * 参数:
             * path:创建的路径
             * data:存储的数据的byte[]
             * acl:控制权限策略
             *             Ids.OPEN_ACL_UNSAFE --> world:anyone:cdrwa
             *             CREATOR_ALL_ACL --> auth:user:password:cdrwa
             * createMode:节点类型, 是一个枚举
             *             PERSISTENT:持久节点
             *             PERSISTENT_SEQUENTIAL:持久顺序节点
             *             EPHEMERAL:临时节点
             *             EPHEMERAL_SEQUENTIAL:临时顺序节点
             */
            result = zookeeper.create(path, data, acls, CreateMode.EPHEMERAL);


//使用部分
        zkServer.createZKNode("/testnode", "testnode".getBytes(), Ids.OPEN_ACL_UNSAFE);

 

 

1.3    java api 新增节点异步调用(回调函数)

            /**
             * 同步或者异步创建节点,都不支持子节点的递归创建,异步有一个callback函数
             * 参数:
             * path:创建的路径
             * data:存储的数据的byte[]
             * acl:控制权限策略
             *             Ids.OPEN_ACL_UNSAFE --> world:anyone:cdrwa
             *             CREATOR_ALL_ACL --> auth:user:password:cdrwa
             * createMode:节点类型, 是一个枚举
             *             PERSISTENT:持久节点
             *             PERSISTENT_SEQUENTIAL:持久顺序节点
             *             EPHEMERAL:临时节点
             *             EPHEMERAL_SEQUENTIAL:临时顺序节点
             */
            result = zookeeper.create(path, data, acls, CreateMode.EPHEMERAL);
            
            String ctx = "{'create':'success'}";
            zookeeper.create(path, data, acls, CreateMode.PERSISTENT, new CreateCallBack(), ctx);





package com.imooc.zk.demo;


import org.apache.zookeeper.AsyncCallback.StringCallback;

public class CreateCallBack implements StringCallback {

    @Override
    public void processResult(int rc, String path, Object ctx, String name) {
        System.out.println("创建节点: " + path);
        System.out.println((String)ctx);
    }

}

 

 

2    课程内容

 

 

3    Coding

3.1    java api 新增节点同步调用Demo

  • 启动服务端
    进入到
cd /usr/local/zookeeper/bin

 
    重启zookeeper服务端
./zkServer.sh restart

 

  • 运行java类,创建临时节点
package com.imooc.zk.demo;

import java.io.IOException;
import java.util.List;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.ACL;

/**
 * 
 * @Title: ZKConnectDemo.java
 * @Description: zookeeper 操作demo演示
 */
public class ZKNodeOperator implements Watcher {

    private ZooKeeper zookeeper = null;
    
    public static final String zkServerPath = "172.26.139.4:2181";
    public static final Integer timeout = 5000;
    
    public ZKNodeOperator() {}
    
    public ZKNodeOperator(String connectString) {
        try {
            zookeeper = new ZooKeeper(connectString, timeout, new ZKNodeOperator());
        } catch (IOException e) {
            e.printStackTrace();
            if (zookeeper != null) {
                try {
                    zookeeper.close();
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
            }
        }
    }
    
    /**
     * 
     * @Title: ZKOperatorDemo.java
     * @Description: 创建zk节点
     */
    public void createZKNode(String path, byte[] data, List<ACL> acls) {
        
        String result = "";
        try {
            /**
             * 同步或者异步创建节点,都不支持子节点的递归创建,异步有一个callback函数
             * 参数:
             * path:创建的路径
             * data:存储的数据的byte[]
             * acl:控制权限策略
             *             Ids.OPEN_ACL_UNSAFE --> world:anyone:cdrwa
             *             CREATOR_ALL_ACL --> auth:user:password:cdrwa
             * createMode:节点类型, 是一个枚举
             *             PERSISTENT:持久节点
             *             PERSISTENT_SEQUENTIAL:持久顺序节点
             *             EPHEMERAL:临时节点
             *             EPHEMERAL_SEQUENTIAL:临时顺序节点
             */
            result = zookeeper.create(path, data, acls, CreateMode.EPHEMERAL);
            
//            String ctx = "{'create':'success'}";
//            zookeeper.create(path, data, acls, CreateMode.PERSISTENT, new CreateCallBack(), ctx);
            
            System.out.println("创建节点:\t" + result + "\t成功...");
            //new Thread().sleep(2000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) throws Exception {
        ZKNodeOperator zkServer = new ZKNodeOperator(zkServerPath);
        
        // 创建zk节点
        zkServer.createZKNode("/testnode", "testnode".getBytes(), Ids.OPEN_ACL_UNSAFE);
        
        /**
         * 参数:
         * path:节点路径
         * data:数据
         * version:数据状态
         */
//        Stat status  = zkServer.getZookeeper().setData("/testnode", "xyz".getBytes(), 2);
//        System.out.println(status.getVersion());
        
        /**
         * 参数:
         * path:节点路径
         * version:数据状态
         */
//        zkServer.createZKNode("/test-delete-node", "123".getBytes(), Ids.OPEN_ACL_UNSAFE);
//        zkServer.getZookeeper().delete("/test-delete-node", 2);
        
//        String ctx = "{'delete':'success'}";
//        zkServer.getZookeeper().delete("/test-delete-node", 0, new DeleteCallBack(), ctx);
//        Thread.sleep(2000);
    }

    public ZooKeeper getZookeeper() {
        return zookeeper;
    }
    public void setZookeeper(ZooKeeper zookeeper) {
        this.zookeeper = zookeeper;
    }

    @Override
    public void process(WatchedEvent event) {
    }
}

 

  • 打印日志:
创建节点:    /testnode    成功...

 

  •  linux 连接zk客户端,验证临时节点已创建
--连接服务端
zkCli.sh -server localhost:2181

--查看节点是否创建
ls /

--output:
[imooc2, names, zookeeper, imooc3, imooc, testnode, imooc5]

 

 

  • 过了心跳检测时间之后,再次用linux客户端,验证临时节点已不存在(java api客户端执行完代码,java api客户端session就关了,详见代码 )
--查看节点是否创建
ls /

--output:
[imooc2, names, zookeeper, imooc3, imooc, imooc5]

 

 

 

3.2    java api 新增永久节点回调 Demo

  • 启动服务端
    进入到
cd /usr/local/zookeeper/bin

 
    重启zookeeper服务端
./zkServer.sh restart

 

  • 运行java类,创建永久节点
package com.imooc.zk.demo;

import java.io.IOException;
import java.util.List;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.ACL;

/**
 * 
 * @Title: ZKConnectDemo.java
 * @Description: zookeeper 操作demo演示
 */
public class ZKNodeOperator implements Watcher {

    private ZooKeeper zookeeper = null;
    
    public static final String zkServerPath = "172.26.139.4:2181";
    public static final Integer timeout = 5000;
    
    public ZKNodeOperator() {}
    
    public ZKNodeOperator(String connectString) {
        try {
            zookeeper = new ZooKeeper(connectString, timeout, new ZKNodeOperator());
        } catch (IOException e) {
            e.printStackTrace();
            if (zookeeper != null) {
                try {
                    zookeeper.close();
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
            }
        }
    }
    
    /**
     * 
     * @Title: ZKOperatorDemo.java
     * @Description: 创建zk节点
     */
    public void createZKNode(String path, byte[] data, List<ACL> acls) {
        
        String result = "";
        try {
            /**
             * 同步或者异步创建节点,都不支持子节点的递归创建,异步有一个callback函数
             * 参数:
             * path:创建的路径
             * data:存储的数据的byte[]
             * acl:控制权限策略
             *             Ids.OPEN_ACL_UNSAFE --> world:anyone:cdrwa
             *             CREATOR_ALL_ACL --> auth:user:password:cdrwa
             * createMode:节点类型, 是一个枚举
             *             PERSISTENT:持久节点
             *             PERSISTENT_SEQUENTIAL:持久顺序节点
             *             EPHEMERAL:临时节点
             *             EPHEMERAL_SEQUENTIAL:临时顺序节点
             */
//            result = zookeeper.create(path, data, acls, CreateMode.EPHEMERAL);
            
            String ctx = "{'create':'success'}";
            zookeeper.create(path, data, acls, CreateMode.PERSISTENT, new CreateCallBack(), ctx);
            
            System.out.println("创建节点:\t" + result + "\t成功...");
            new Thread().sleep(2000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) throws Exception {
        ZKNodeOperator zkServer = new ZKNodeOperator(zkServerPath);
        
        // 创建zk节点
        zkServer.createZKNode("/testnode", "testnode".getBytes(), Ids.OPEN_ACL_UNSAFE);
        
        /**
         * 参数:
         * path:节点路径
         * data:数据
         * version:数据状态
         */
//        Stat status  = zkServer.getZookeeper().setData("/testnode", "xyz".getBytes(), 2);
//        System.out.println(status.getVersion());
        
        /**
         * 参数:
         * path:节点路径
         * version:数据状态
         */
//        zkServer.createZKNode("/test-delete-node", "123".getBytes(), Ids.OPEN_ACL_UNSAFE);
//        zkServer.getZookeeper().delete("/test-delete-node", 2);
        
//        String ctx = "{'delete':'success'}";
//        zkServer.getZookeeper().delete("/test-delete-node", 0, new DeleteCallBack(), ctx);
//        Thread.sleep(2000);
    }

    public ZooKeeper getZookeeper() {
        return zookeeper;
    }
    public void setZookeeper(ZooKeeper zookeeper) {
        this.zookeeper = zookeeper;
    }

    @Override
    public void process(WatchedEvent event) {
    }
}

 

  • 回调类:
package com.imooc.zk.demo;


import org.apache.zookeeper.AsyncCallback.StringCallback;

public class CreateCallBack implements StringCallback {

    @Override
    public void processResult(int rc, String path, Object ctx, String name) {
        System.out.println("创建节点: " + path);
        System.out.println((String)ctx);
    }

}

 

  • 打印日志:
创建节点:        成功...
创建节点: /testnode
{'create':'success'}

 

 

  •  linux 连接zk客户端,验证永久节点已创建
--连接服务端
zkCli.sh -server localhost:2181

--查看节点是否创建
ls /

--output:
[imooc2, names, zookeeper, imooc3, imooc, testnode, imooc5]

 

标签:Dubbo,String,ZK,创建,zookeeper,中间件,节点,path,public
From: https://www.cnblogs.com/1446358788-qq/p/18105792

相关文章

  • 中间件 ZK分布式专题与Dubbo微服务入门 6-2 zk会话重连机制
    0课程地址https://coding.imooc.com/lesson/201.html#mid=12718 1重点关注1.1本节内容验证了使用sessionid和sessionPassword重连的session和之前的session一致,详见3.1   2课程内容2.1扩展之:echodump|nclocalhost2181......
  • 客快物流大数据项目(六十八):工作流调度 azkaban介绍及用法 一般有用 图片偏多 看1
    工作流调度一、工作流产生背景工作流(Workflow),指“业务过程的部分或整体在计算机应用环境下的自动化”。是对工作流程及其各操作步骤之间业务规则的抽象、概括描述。工作流解决的主要问题是:为了实现某个业务目标,利用计算机软件在多个参与者之间按某种预定规则自动传递文档、信息......
  • 中间件 ZK分布式专题与Dubbo微服务入门 6-1 建立客户端与zk服务端的连接
    0课程地址https://coding.imooc.com/lesson/201.html#mid=12717 1重点关注1.1本节内容使用STS开发工具作为客户端连接zk服务端,详见3.1  1.2连接方式参数说明如下段zk原生class标注:connectString:连接zk服务端的ip和端口(比如案例......
  • SpringCloud 和 Dubbo 区别: 比较微服务框架的差异
    1.1SpringCloud简介SpringCloud是一个用于构建云原生应用的框架集合,它为开发者提供了一套完整的工具链,用于快速搭建分布式系统。SpringCloud基于 SpringBoot 开发,具有如下特点:提供了丰富的组件,如配置管理、服务注册与发现、断路器等采用声明式的编程模型,易于上手与Spr......
  • 中间件和Auth模块
    中间件1.Django中间件介绍【1】什么是Django中间件Django中间件是一个轻量级、可重用的组件,用于处理Django请求和响应的过程。它提供了对请求和响应进行全局处理的机制,可以在请求达到视图之前进行预处理或在响应返回给客户端之前进行后处理。中间件是按照顺序依次执行的,每......
  • dubbo3.2注册中心注册逻辑
    一介绍Dubbo支持多种服务调用方法,包括远程过程调用、负载均衡和容错等,并且提供可视化的服务管理和监控功能。Dubbo的核心组件之一就是注册中心。在Dubbo的体系架构中,服务提供者在启动时向注册中心注册其提供的服务,并且服务消费者在启动时向注册中心订阅其需要的服务。而......
  • SpringCloud微服务集成Dubbo
    1、Dubbo介绍ApacheDubbo是一款易用、高性能的WEB和RPC框架,同时为构建企业级微服务提供服务发现、流量治理、可观测、认证鉴权等能力、工具与最佳实践。用于解决微服务架构下的服务治理与通信问题,官方提供了Java、Golang等多语言SDK实现。使用Dubbo开发的微服务原生......
  • vivo 消息中间件测试环境项目多版本实践
    作者:vivo互联网中间件团队-LiuTao在开源RocketMQ基础之上,关于【测试环境项目多版本隔离】业务诉求的落地与实践。一、背景在2022年8月份vivo互联网中间件团队完成了互联网在线业务的MQ引擎升级,从RabbitMQ到RocketMQ的平滑升级替换。在业务使用消息中间件的过程中......
  • CYarp:力压frp的C#高性能http内网反代中间件
    https://www.cnblogs.com/kewei/p/18095638 我以前开发过HttpMouse的http内网反代中间件,但由于当时的知识点与设计水平受限,所以把它下马了。随着自身又遇到http内网反代的需求,在frp不能满足我需求情况下,我又启动了一个叫CYarp的http内网反代项目,这次它的设计完成度是相当高的。......
  • Dubbo23_解决Dubbo无法发布被事务代理的Service问题7
    一、问题展示前面我们已经完成了Dubbo的入门案例,通过入门案例我们可以看到通过Dubbo提供的标签配置就可以进行包扫描,扫描到@Service注解的类就可以被发布为服务。但是我们如果在服务提供者类上加入@Transactional事务控制注解后,服务就发布不成功了。原因是事务控制的底层原......