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 ...
随机推荐
- 使用jquery 动态创建form 并提交
$(document).ready(function(){ $("a.delete").click(function(event){ action = this ...
- HTTPS工作原理 HTTP协议数据结构分析 HTTP和HTTPS协议的不同之处
HTTP有以下三个缺点:无加密,无身份认证,无完整性保护,因此所谓的HTTPS,它其实就是HTTP+加密+身份认证+完整性保护.HTTPS并不是一种新的协议,在通信接口使用了SSL和TLS协议而已.H ...
- SpringBean的工作原理
在 Spring 中,那些组成应用程序的主体及由 Spring IOC 容器所管理的对象,被称之为 bean.简单地讲,bean 就是由 IOC 容器初始化.装配及管理的对象,除此之外,bean 就与 ...
- localstack环境搭建
前置 Python Docker Desktop 安装 1.使用pip安装aws-cli,则可以在cmd中使用aws命令: $pip install awscli 2.从dockerhub拉取kine ...
- beSTORM之网络协议Fuzz入门教程
转载自FreeBuf.COM 本文将以SNMP协议为例介绍如何使用beSTORM进行网络协议Fuzz. 实验环境 Windows 7 X64 (IP:192.168.0.123) beSTORM 3. ...
- 《剑指offer》Q01-12 (牛客10.11)
目录 T1 二维部分有序数组查找 ☆ T2 字符串字符不等长替换 - 从后往前 T3 返回链表的反序 vector T4 重建二叉树 T5 两个栈模拟队列 T6 旋转数组中的最小元素 - 二分或暴力 ...
- 从Odds:比值比推导出Logtic分类的算法
在从概率模型推导出逻辑回归算法模型的博文中,我试着从李宏毅老师的课程中讲到的概率模型去推导逻辑分类的算法模型.有幸看到另外一篇博文01 分类算法 - Logistic回归 - Logit函数,我了解到 ...
- JS之ajax实现注册页,小文件传输
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- redis设置密码和其它服务器连接
在cenos中 vim /etc/redis.conf 中 /输入 requirepass enter件一下 小写 n 一下 吧 # requirepass #去掉,后面写你的密码 #其它机器连接 v ...
- lua介绍及环境搭建(一)
一.介绍 1.简介 Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能. 其设计目的是为了嵌入应用程序中,从 ...