为了方便现场安装完了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方法没有执行,这个执行后代码是一直运行的,持续监控想要监控的数据,当数据出现变化事可以获取变化的事件,例如这样

在后台操作一组数据

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

etcd简单测试类java版的更多相关文章

  1. 【线性表基础】基于线性表的简单算法【Java版】

    本文描述了基于线性表的简单算法及其代码[Java实现] 1-1 删除单链表中所有重复元素 // Example 1-1 删除单链表中所有重复元素 private static void removeR ...

  2. 简单聊天室(java版)

    这是本人从其他地方学习到的关于聊天室的一个模本,我从中截取了一部分关于客户端和服务端通信的Socket的内容.希望对大家对socket有个了解,我写的这些代码可以实现两人或多人在多台电脑上实现简单的对 ...

  3. RAS算法简单示例(Java版)

    RSA算法——由三位发明者Ronald Rivest.Adi Shamir 和 Leonard Adleman 姓氏的首字母拼在一起组成. RSA算法属于“公开密钥加密技术”,其加密和解密的秘钥不同. ...

  4. MongoDB简单操作(java版)

    新建maven项目,添加依赖: <dependency> <groupId>org.mongodb</groupId> <artifactId>mong ...

  5. 菜鸟学Java(六)——简单验证码生成(Java版)

    验证码大家都知道,它的作用也不用我多说了吧.如果不太清楚请参见百度百科中的解释,一般验证码的生成就是随机产生字符(数字.字母或者汉字等),然后将这些生成的字符绘制成一张图片,再在图片上加上一些干扰元素 ...

  6. 二维码生成工具类java版

    注意:这里我不提供所需jar包的路径,我会把所有引用的jar包显示出来,大家自行Google package com.net.util; import java.awt.BasicStroke; im ...

  7. Spring Boot超简单的测试类demo

    1 概述 Spring Boot结合Junit的简单测试类demo,流程是先引入依赖,接着编写测试类测试运行即可. 2 依赖 <dependency> <groupId>org ...

  8. 第三篇 :微信公众平台开发实战Java版之请求消息,响应消息以及事件消息类的封装

    微信服务器和第三方服务器之间究竟是通过什么方式进行对话的? 下面,我们先看下图: 其实我们可以简单的理解: (1)首先,用户向微信服务器发送消息: (2)微信服务器接收到用户的消息处理之后,通过开发者 ...

  9. struts2+hibernate+spring注解版框架搭建以及简单测试(方便脑补)

    为了之后学习的日子里加深对框架的理解和使用,这里将搭建步奏简单写一下,目的主要是方便以后自己回来脑补: 1:File--->New--->Other--->Maven--->M ...

随机推荐

  1. css解决fixed布局不会出现滚动条的问题

  2. 插件之一:Epplus

    从策划配置文件导入项目实际使用,为提高效率总会使用一些转换工具,据同事介绍Epplus更强大一些,我自己试了下,发现api非常全面且强大.记录下所学. 一.插件来源 https://github.co ...

  3. Linear regression with one variable - Model representation

    摘要: 本文是吴恩达 (Andrew Ng)老师<机器学习>课程,第二章<单变量线性回归>中第6课时<模型概述>的视频原文字幕.为本人在视频学习过程中逐字逐句记录下 ...

  4. Go语言中defer语句使用小结

    defer是Go语言中的延迟执行语句,用来添加函数结束时执行的代码,常用于释放某些已分配的资源.关闭数据库连接.断开socket连接.解锁一个加锁的资源.Go语言机制担保一定会执行defer语句中的代 ...

  5. IOS div上下滑动效果

    内容放在div中 div加样式:width: 100%;height: 100%;z-index: 70;overflow: auto;

  6. 浪潮服务器NF84260M3安装Windows server 2012 R2 RAID配置

    这里是已经做了RAID6,再做系统 浪潮服务器NF84260M3 U盘启动,光盘刻录 Windows server 2012 R2 镜像,地址:迅雷下载,ed2k://|file|cn_windows ...

  7. 【洛谷】P5348 密码解锁

    [洛谷]P5348 密码解锁 很显然我们可以推导出这个式子 设\(a(m)\)为\(m\)位置的值 \[ \mu(m) = \sum_{m | d} a(d) \\ a(m) = \sum_{m|d} ...

  8. javaweb中关于转发与重定向的写法

    转发: RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/main.jsp"); rd.forward(r ...

  9. 以太坊再爆高危漏洞!黑客增发ATN 1100万枚token事件始末

    事情发生在5月中旬,ATN技术人员发现Token合约由于存在漏洞受到攻击.不过ATN基金会随后透露,将销毁1100万个ATN,并恢复ATN总量,同时将在主链上线映射时对黑客地址内的资产予以剔除,确保原 ...

  10. .net core 根据数据库生成实体类

    微软最近几年在跨平台上不断发力,很多.net程序员也摩拳擦掌,对微软寄以厚望.就在最近,微软还推出了asp .net core2.0预览版. 通过对.net core的简单尝试,我发现以往我们开发MV ...