zoukankan      html  css  js  c++  java
  • etcd简单测试类java版

    为了方便现场安装完了etcd集群后确认集群是否好用,简单写了个测试类,网上搜的有点乱还有些不能运行,在这里再整理一个能够直接运行的

    1、我把etcd的API设成3版本了,调用使用的jetcd,功能挺多,这里只用了最简单的数据增删查操作,再Maven配置文件中增加依赖

            <dependency>
                <groupId>io.etcd</groupId>
                <artifactId>jetcd-core</artifactId>
                <version>0.3.0</version>
            </dependency>

    2、直接贴代码了,代码很简单没什么好解释的,要想用复杂功能还需要再去研究jetcd的各种API了

    /**
     * 
     */
    package com.zyh.etcd;
    
    import static com.google.common.base.Charsets.UTF_8;
    
    import java.util.Optional;
    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.ExecutionException;
    
    import io.etcd.jetcd.ByteSequence;
    import io.etcd.jetcd.Client;
    import io.etcd.jetcd.Watch.Watcher;
    import io.etcd.jetcd.kv.GetResponse;
    import io.etcd.jetcd.options.GetOption;
    import io.etcd.jetcd.options.WatchOption;
    import io.etcd.jetcd.watch.WatchEvent;
    
    /**
     * etcd 操作工具,包括启动监听和操作etcd v3 版本协议,只测试功能,未添加log
     * 
     * @version 1.0
     * @author zhangyanhua
     * @date 2019年10月29日 下午4:30:57
     */
    public class EtcdUtil
    {
        // etcl客户端链接
        private static Client etcdClient = null;
    
        // 链接初始化
        public static synchronized Client getEtclClient()
        {
            if (etcdClient == null)
            {
                //String[] urls = PropertiesUtil.getValue("etcd_node_url").split(",");
                String[] urls = "http://10.110.30.210:2379,http://10.110.30.212:2379,http://10.110.30.213:2379".split(",");
                etcdClient = Client.builder().endpoints(urls).build();
            }
            return etcdClient;
        }
    
        /**
         * 新增或者修改指定的配置
         * 
         * @param key
         * @param value
         * @throws Exception
         * @author zhangyanhua
         * @date 2019年10月29日 下午4:41:06
         */
        public static void putEtcdValueByKey(String key, String value) throws Exception
        {
            Client client = EtcdUtil.getEtclClient();
            client.getKVClient().put(ByteSequence.from(key, UTF_8), ByteSequence.from(value, UTF_8)).get();
            //System.out.println("put etcd key:value "" + key + ":" + value + "" success");
            client.close();
            etcdClient = null;
        }
    
        /**
         * 查询指定的key名称对应的value
         * 
         * @param key
         * @return value值
         * @throws Exception
         * @author zhangyanhua
         * @date 2019年10月29日 下午4:35:44
         */
        public static String getEtcdValueByKey(String key) throws Exception
        {
            Client client = EtcdUtil.getEtclClient();
            GetResponse getResponse = client.getKVClient()
                    .get(ByteSequence.from(key, UTF_8), GetOption.newBuilder().build()).get();
            client.close();
            etcdClient = null;
    
            // key does not exist
            if (getResponse.getKvs().isEmpty())
            {
                return null;
            }
    
            return getResponse.getKvs().get(0).getValue().toString(UTF_8);
        }
    
        /**
         * 删除指定的配置
         * 
         * @param key
         * @throws InterruptedException
         * @throws ExecutionException
         * @author zhangyanhua
         * @date 2019年10月29日 下午4:53:24
         */
        public static void deleteEtcdValueByKey(String key) throws InterruptedException, ExecutionException
        {
            Client client = EtcdUtil.getEtclClient();
            client.getKVClient().delete(ByteSequence.from(key, UTF_8)).get();
            //System.out.println("delete etcd key "" + key + "" success");
            client.close();
            etcdClient = null;
        }
    
        /**
         * 持续监控某个key变化的方法,执行后如果key有变化会被监控到,输入结果如下
         *  watch type= "PUT", key= "zyh1", value= "zyh1-value" 
         *  watch type= "PUT", key= "zyh1", value= "zyh1-value111" 
         *  watch type= "DELETE", key= "zyh1", value= ""
         * 
         * @param key
         * @throws Exception
         * @author zhangyanhua
         * @date 2019年10月29日 下午5:26:09
         */
        public static void watchEtcdKey(String key) throws Exception
        {
            Client client = EtcdUtil.getEtclClient();
            // 最大事件数量
            Integer maxEvents = Integer.MAX_VALUE;
            CountDownLatch latch = new CountDownLatch(maxEvents);
            Watcher watcher = null;
            try
            {
                ByteSequence watchKey = ByteSequence.from(key, UTF_8);
                WatchOption watchOpts = WatchOption.newBuilder().build();
    
                watcher = client.getWatchClient().watch(watchKey, watchOpts, response -> {
                    for (WatchEvent event : response.getEvents())
                    {
                        System.out.println("watch type= "" + event.getEventType().toString() + "",  key= ""
                                + Optional.ofNullable(event.getKeyValue().getKey()).map(bs -> bs.toString(UTF_8)).orElse("")
                                + "",  value= "" + Optional.ofNullable(event.getKeyValue().getValue())
                                        .map(bs -> bs.toString(UTF_8)).orElse("")
                                + """);
                    }
    
                    latch.countDown();
                });
    
                latch.await();
            }
            catch (Exception e)
            {
                if (watcher != null)
                {
                    watcher.close();
                    client.close();
                    etcdClient = null;
                }
                throw e;
            }
        }
    
        /**
         * TODO
         * 
         * @param args
         * @throws Exception
         * @author zhangyanhua
         * @date 2019年10月29日 下午6:01:54
         */
        public static void main(String[] args) throws Exception
        {
            boolean success = true;
    
            String key = "zyh";
            String value = "zyh-value";
            String newValue = "zyh-value-new";
    
            System.out.println("**** 测试方法开始 ****");
            EtcdUtil.putEtcdValueByKey(key, value);
            String retValue = EtcdUtil.getEtcdValueByKey(key);
            // System.out.println("查询key " + key + " 对应的值是 " + retValue);
            if (value.equals(retValue))
            {
                System.out.println("数据插入成功。");
                System.out.println("数据查询成功。");
            }
            else
            {
                success = false;
                System.out.println("数据插入或查询失败!");
            }
    
            EtcdUtil.putEtcdValueByKey(key, newValue);
            retValue = EtcdUtil.getEtcdValueByKey(key);
            // System.out.println("查询key " + key + " 对应的值是 " + retValue);
            if (newValue.equals(retValue))
            {
                System.out.println("数据更新成功。");
            }
            else
            {
                success = false;
                System.out.println("数据更新失败!");
            }
    
            EtcdUtil.deleteEtcdValueByKey(key);
            retValue = EtcdUtil.getEtcdValueByKey(key);
            // System.out.println("查询key " + key + " 对应的值是 " + retValue);
            if (retValue == null)
            {
                System.out.println("数据删除成功。");
            }
            else
            {
                success = false;
                System.out.println("数据删除失败!");
            }
    
            // EtcdUtil.watchEtcdKey(key);
    
            if (success)
            {
                System.out.println("**** 测试方法全部通过。 ****");
            }
            else
            {
                System.out.println("**** 测试失败! ****");
            }
        }
    }

    上面代码运行结果如下

    还有个监控数据的watchEtcdKey方法没有执行,这个执行后代码是一直运行的,持续监控想要监控的数据,当数据出现变化事可以获取变化的事件,例如这样

    在后台操作一组数据

     监控端可以检测到数据变化

  • 相关阅读:
    Jmeter常用脚本开发之JDBC请求
    Jmeter常用脚本开发之Java请求
    Jmeter常用脚本开发之FTP请求
    Jmeter常用脚本开发之Debug Sampler
    Jmeter常用脚本开发之Beanshell Sampler
    Jenkins构建.net项目
    Charles基本使用
    [daily] emacs显示file name buffer的全路径
    [dev] 刷HHKP的一般流程及常见错误(多图慎点)
    [dev][go] 入门Golang都需要了解什么
  • 原文地址:https://www.cnblogs.com/yanh0606/p/11765691.html
Copyright © 2011-2022 走看看