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方法没有执行,这个执行后代码是一直运行的,持续监控想要监控的数据,当数据出现变化事可以获取变化的事件,例如这样
在后台操作一组数据

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

etcd简单测试类java版的更多相关文章
- 【线性表基础】基于线性表的简单算法【Java版】
本文描述了基于线性表的简单算法及其代码[Java实现] 1-1 删除单链表中所有重复元素 // Example 1-1 删除单链表中所有重复元素 private static void removeR ...
- 简单聊天室(java版)
这是本人从其他地方学习到的关于聊天室的一个模本,我从中截取了一部分关于客户端和服务端通信的Socket的内容.希望对大家对socket有个了解,我写的这些代码可以实现两人或多人在多台电脑上实现简单的对 ...
- RAS算法简单示例(Java版)
RSA算法——由三位发明者Ronald Rivest.Adi Shamir 和 Leonard Adleman 姓氏的首字母拼在一起组成. RSA算法属于“公开密钥加密技术”,其加密和解密的秘钥不同. ...
- MongoDB简单操作(java版)
新建maven项目,添加依赖: <dependency> <groupId>org.mongodb</groupId> <artifactId>mong ...
- 菜鸟学Java(六)——简单验证码生成(Java版)
验证码大家都知道,它的作用也不用我多说了吧.如果不太清楚请参见百度百科中的解释,一般验证码的生成就是随机产生字符(数字.字母或者汉字等),然后将这些生成的字符绘制成一张图片,再在图片上加上一些干扰元素 ...
- 二维码生成工具类java版
注意:这里我不提供所需jar包的路径,我会把所有引用的jar包显示出来,大家自行Google package com.net.util; import java.awt.BasicStroke; im ...
- Spring Boot超简单的测试类demo
1 概述 Spring Boot结合Junit的简单测试类demo,流程是先引入依赖,接着编写测试类测试运行即可. 2 依赖 <dependency> <groupId>org ...
- 第三篇 :微信公众平台开发实战Java版之请求消息,响应消息以及事件消息类的封装
微信服务器和第三方服务器之间究竟是通过什么方式进行对话的? 下面,我们先看下图: 其实我们可以简单的理解: (1)首先,用户向微信服务器发送消息: (2)微信服务器接收到用户的消息处理之后,通过开发者 ...
- struts2+hibernate+spring注解版框架搭建以及简单测试(方便脑补)
为了之后学习的日子里加深对框架的理解和使用,这里将搭建步奏简单写一下,目的主要是方便以后自己回来脑补: 1:File--->New--->Other--->Maven--->M ...
随机推荐
- js时间戳转为日期函数
js时间戳转为日期函数 function add0(m){ return m<10?'0'+m:m; } //timestamp参数示例:1501234567 function format(t ...
- JKD1.8新特性
1.Optional类 Optional是jdk1.8引入的类型,Optional是一个容器对象,它包括了我们需要的对象,使用isPresent方法判断所包 含对象是否为空,isPresent方法返回 ...
- Unity和Android交互学习
这段时间学习Unity和Android互调,从基础开始. 网上的教程有很多,浏览了一圈教程,发现目前有两种方式:一种是直接把 .aar文件导入Unity/Plugins/Android文件夹,另一种是 ...
- redis分布式锁,面试官请随便问,我都会
目录 前言 实现要点 错误解锁方式 正确加锁释放锁方式 前言 现在的业务场景越来越复杂,使用的架构也就越来越复杂,分布式.高并发已经是业务要求的常态.像腾讯系的不少服务,还有CDN优化.异地多备份等处 ...
- 信用卡分销系统源码、分销系统定制贴牌、信用卡三级分销系统源码、信用卡返佣系统OEM
信用卡返佣分销系统贴牌,全套源码,可定制UI界面 这一整套绝对是市场上最完善最好的一套系统:里面的特色功能: 1.合伙人功能,解决你前期的资金以及资源问题 2.推广素材库,全方位增加推广效率 3.红包 ...
- ffmpeg学习笔记-编译脚本
之前已经用他人的编译脚本对ffmpeg进行了成功编译,那么在裁剪ffmpeg的时候需要指定文件,这时候应该怎么编写编译脚本呢?本文目的在于说明ffmpeg编译脚本的编写 首先在ffmpeg的目录下新建 ...
- Object类的equals方法 常用API
boolean equals (Object obj)(return this==obj): p1.equals(p2): 基本数据类型比较的是值 引用数据类型:默认比较的是两个对象的地址 ...
- RestTemplate实践(及遇到的问题)
在微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLConnection.Apache的Http Client.Netty的异步 ...
- JDBC:数据库连接技术
JDBC :带它再爱你一次 (一) JDBC 入门 (1) 概述 Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问 ...
- kafka producer consumer demo(三)
我们在前面把集群搭建起来了,也设置了kafka broker的配置,下面我们用代码来实现一下客户端向kafka发送消息,consumer端从kafka消费数据.大家先不要着急着了解 各种参数的配置,先 ...