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匿名函数确实是个好东西
<body onload="alert('http://www.baidu.com/');"> <script type="text/javascrip ...
- android studio 开发中启动android项目报错sdk版本不一致解决方案
安卓项目开发中新建项目后再run'的时候发现报错com.android.support:appcompat-v7依赖报错 查看下build.gredle所配置的参数: 打开项目的build.gradl ...
- Flutter之切换导航TabBar组件
TabController 这是Tab页的控制器,用于定义Tab标签和内容页的坐标,还可配置标签页的切换动画效果等. TabController的创建有两种形式,一种是使用系统的DefaultTabC ...
- JAVA数据结构和算法 3-简单排序
排序中的两种基本操作是比较和交换.在插入排序中还有移动. 冒泡排序:两两比较相邻元素,如果较大数位于较小数前面,则交换: 每一趟遍历将一个最大的数移到序列末尾,共遍历N-1趟. 如果执行完一趟之后没有 ...
- Intel GPA + 夜神模拟器
环境:Win10,Intel GPA 2019R2,Nox(夜神模拟器)6.2.8.3 记录下注意的事项 1. 夜神模拟器下载地址建议 : https://www.bignox.com/ 2. 先运行 ...
- C语言--单层循环结构
一.PTA实验作业 题目1:最佳情侣身高 1.实验代码 int N, i; float height; char sex; printf("输入用户个数:\n"); scanf(& ...
- Connect4 Game
How this game is playe can be found at here. public class Connect4 { ][]; public Connect4(char[][] b ...
- Jquery中数组转字符串,c:foreach自动将带","字符串进行拆分赋值
1.数组转字符串,逗号分割 a.push()将元素依次添加至数组: b.join()将数组转换成字符串,里面可以带参数分隔符,默认[,] <script type = text/javascri ...
- HDU 1811 并查集+拓扑排序
Rank of Tetris 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1811 Problem Description 自从Lele开发了Rati ...
- php源码安装执行configure报错error: off_t undefined; check your library configuration
php安装执行configure报错error: off_t undefined; check your library configuration vim /etc/ld.so.conf 添加如下几 ...