etcd 和zookeeper 很像,都可以用来做配置管理。并且etcd可以在目前流行的Kubernetes中使用。

但是etcd 提供了v2版本合v3的版本的两种api。我们现在分别来介绍一下这两个版本api的使用。

一、Etcd V2版本API

1、java工程中使用maven引入 etcd v2的java api操作jar包

io.netty

netty-all

4.1.21.Final

org.mousio

etcd4j

2.15.0

2、etcd的链接

importmousio.etcd4j.EtcdClient;importjava.io.InputStream;importjava.net.URI;importjava.util.Properties;public classEtcdUtil {//etcd客户端链接

private static EtcdClient client = null;//链接初始化

public static synchronizedEtcdClient getClient(){if (null ==client){

client= new EtcdClient (URI.create(properties.getProperty("http://127.0.0.1:2379")));

}returnclient;

}

}

3、如何获取etcd的配置并且对配置进行监听

//初始化获取etcd配置并且进行配置监听

private voidinitEtcdConfig() {

EtcdKeysResponse dataTree ;try{final EtcdClient etcdClient =EtcdUtil.getClient();//获取etcd中名称叫ETCD文件夹下的配置

EtcdKeyGetRequest etcdKeyGetRequest = etcdClient.getDir("ETCD").consistent();

dataTree=etcdKeyGetRequest.send().get();//获取etcd的版本

System.out.println("ETCD's version:"+etcdClient.getVersion());

getConfig("/ETCD/example.config",dataTree); //加载配置项//启动一个线程进行监听

startListenerThread(etcdClient);

}catch(Exception e) {

System.out.println("EtcdClient init cause Exception:"+e.getMessage());

e.printStackTrace();

}

}privateString getConfig(String configFile,EtcdKeysResponse dataTree){if(null != dataTree && dataTree.getNode().getNodes().size()>0){for(EtcdKeysResponse.EtcdNode node:dataTree.getNode().getNodes()){if(node.getKey().equals(configFile)){returnnode.getValue();

}

}

}

System.out.println("Etcd configFile"+ configFile+"is not exist,Please Check");return null;

}public voidstartListenerThread(EtcdClient etcdClient){new Thread(()->{

startListener(etcdClient);

}).start();

}public voidstartListener(EtcdClient etcdClient){

ResponsePromise promise=null;try{

promise=etcdClient.getDir(SYSTEM_NAME).recursive().waitForChange().consistent().send();

promise.addListener(promisea->{

System.out.println("found ETCD's config cause change");try{

getConfig("/ETCD/example.config", etcdClient.getDir("ETCD").consistent().send().get()); //加载配置项

} catch(Exception e) {

e.printStackTrace();

System.out.println("listen etcd 's config change cause exception:{}"+e.getMessage());

}

startListener(etcdClient);

});

}catch(Exception e) {

startListener(etcdClient);

System.out.println("listen etcd 's config change cause exception:"+e.getMessage());

e.printStackTrace();

}

}

4、使用dcmp管理 etcd的配置项

dcmp 是一个使用go语言开发的etcd配置界面,不足的时,这个只支持v2的API,项目的地址:

二、Etcd V3版本API

1、在工程引入如下依赖

io.netty

netty-all

4.1.15.Final

com.coreos

jetcd-core

0.0.2

2、v3 api操作工具类

public classEtcdUtil {//etcl客户端链接

private static Client client = null;//链接初始化

public static synchronizedClient getEtclClient(){if(null ==client){

client= Client.builder().endpoints(props.getProperty("http://127.0.0.1:2379")).build();

}returnclient;

}/*** 根据指定的配置名称获取对应的value

*@paramkey 配置项

*@return*@throwsException*/

public static String getEtcdValueByKey(String key) throwsException {

List kvs =EtcdUtil.getEtclClient().getKVClient().get(ByteSequence.fromString(key)).get().getKvs();if(kvs.size()>0){

String value= kvs.get(0).getValue().toStringUtf8();returnvalue;

}else{return null;

}

}/*** 新增或者修改指定的配置

*@paramkey

*@paramvalue

*@return

*/

public static void putEtcdValueByKey(String key,String value) throwsException{

EtcdUtil.getEtclClient().getKVClient().put(ByteSequence.fromString(key),ByteSequence.fromBytes(value.getBytes("utf-8")));

}/*** 删除指定的配置

*@paramkey

*@return

*/

public static voiddeleteEtcdValueByKey(String key){

EtcdUtil.getEtclClient().getKVClient().delete(ByteSequence.fromString(key));

}

}//V3 api配置初始化和监听

public voidinit(){try{//加载配置

getConfig(EtcdUtil.getEtclClient().getKVClient().get(ByteSequence.fromString(ETCD_CONFIG_FILE_NAME)).get().getKvs());//启动监听线程

new Thread(() ->{//对某一个配置进行监听

Watch.Watcher watcher = EtcdUtil.getEtclClient().getWatchClient().watch(ByteSequence.fromString("etcd_key"));try{while(true) {

watcher.listen().getEvents().stream().forEach(watchEvent->{

KeyValue kv=watchEvent.getKeyValue();//获取事件变化类型

System.out.println(watchEvent.getEventType());//获取发生变化的key

System.out.println(kv.getKey().toStringUtf8());//获取变化后的value

String afterChangeValue =kv.getValue().toStringUtf8();

});

}

}catch(InterruptedException e) {

e.printStackTrace();

}

}).start();

}catch(Exception e) {

e.printStackTrace();

}

}private String getConfig(Listkvs){if(kvs.size()>0){

String config= kvs.get(0).getValue().toStringUtf8();

System.out.println("etcd 's config 's configValue is :"+config);returnconfig;

}else{return null;

}

}

v3版本的正式版本代码(可以直接使用的工具类,并且加上了日志):

1 importcom.coreos.jetcd.Client;2 importcom.coreos.jetcd.Watch;3 importcom.coreos.jetcd.data.ByteSequence;4 importcom.coreos.jetcd.data.KeyValue;5 importorg.slf4j.Logger;6 importorg.slf4j.LoggerFactory;7 importjava.util.List;8 /**

9 * etcd 链接和操作工具,包括启动监听 操作etcd v3 版本协议,此操作不支持v2 版本协议。10 * v2版本的协议可以参考https://www.cnblogs.com/laoqing/p/8967549.html

11 */

12 public classEtcdUtil {13 public static Logger log = LoggerFactory.getLogger(EtcdUtil.class);14 //etcl客户端链接

15 private static Client client = null;16

17 //链接初始化 单例模式

18 public static synchronizedClient getEtclClient(){19 if(null ==client){20 client = Client.builder().endpoints("http://xxx.xxx.xxx.xxx:2379").build();21 }22 returnclient;23 }24 /**

25 * 根据指定的配置名称获取对应的value26 *@paramkey 配置项27 *@return

28 *@throwsException29 */

30 public static String getEtcdValueByKey(String key) throwsException {31 List kvs =EtcdUtil.getEtclClient().getKVClient().get(ByteSequence.fromString(key)).get().getKvs();32 if(kvs.size()>0){33 String value = kvs.get(0).getValue().toStringUtf8();34 returnvalue;35 }36 else{37 return null;38 }39 }40 /**

41 * 新增或者修改指定的配置42 *@paramkey43 *@paramvalue44 *@return

45 */

46 public static void putEtcdValueByKey(String key,String value) throwsException{47 EtcdUtil.getEtclClient().getKVClient().put(ByteSequence.fromString(key),ByteSequence.fromBytes(value.getBytes("utf-8")));48 }49 /**

50 * 删除指定的配置51 *@paramkey52 *@return

53 */

54 public static voiddeleteEtcdValueByKey(String key){55 EtcdUtil.getEtclClient().getKVClient().delete(ByteSequence.fromString(key));56 }57 /**

58 * etcd的监听,监听指定的key,当key 发生变化后,监听自动感知到变化。59 *@paramkey 指定需要监听的key60 */

61 public static voidinitListen(String key){62 try{63 //加载配置

64 getConfig(EtcdUtil.getEtclClient().getKVClient().get(ByteSequence.fromString(key)).get().getKvs());65 new Thread(() ->{66 Watch.Watcher watcher =EtcdUtil.getEtclClient().getWatchClient().watch(ByteSequence.fromString(key));67 try{68 while(true) {69 watcher.listen().getEvents().stream().forEach(watchEvent ->{70 KeyValue kv =watchEvent.getKeyValue();71 log.info("etcd event:{} ,change key is:{},afterChangeValue:{}",watchEvent.getEventType(),kv.getKey().toStringUtf8(),kv.getValue().toStringUtf8());72 });73 }74 } catch(InterruptedException e) {75 log.info("etcd listen start cause Exception:{}",e);76 }77 }).start();78 } catch(Exception e) {79 log.info("etcd listen start cause Exception:{}",e);80 }81 }82 private static String getConfig(Listkvs){83 if(kvs.size()>0){84 String config = kvs.get(0).getKey().toStringUtf8();85 String value = kvs.get(0).getValue().toStringUtf8();86 log.info("etcd 's config 's config key is :{},value is:{}",config,value);87 returnvalue;88 }89 else{90 return null;91 }92 }93 }

运行后的效果:

另外v3 版本api 的管理界面,可以参考如下开源项目

【原文归作者所有,欢迎转载,但是保留版权,并且转载时,需要注明出处】

java etcd api_在java中如何使用etcd的v2 和v3 api获取配置,并且对配置的变化进行监控和监听...相关推荐

  1. java 工具类-去除字符串中特殊字符、全角转为半脚、获取字符串中姓名/电话、姓名重复后追加a.b.c...aa,ab..

    java 工具类-去除字符串中特殊字符.全角转为半脚.获取字符串中姓名/电话.姓名重复后追加a.b.c-aa,ab- public class NameUtil {/*** 姓名重复后追加a.b.c. ...

  2. java数组最大值索引_java中的权限修饰符有哪些?怎么获取数组最大值?

    java作为一门编程语言,由于它的优秀,现在已经成为很多人的首选编程语言.java中关于修饰符和数组的知识点也是十分多的,今天就来为大家介绍一下,java中的权限修饰符有哪些?怎么获取数组最大值?一起 ...

  3. java 排序api_用java api进行sort

    Sun授权刊登 本节中所描述的多态算法 (polymorphic algorithms)是由 JDK 所提供的可重复使用的功能性片段.它们均取自Collections类,并都采用静态方法(它的第一个参 ...

  4. java读取微信证书_Java中的微信支付(2):API V3 微信平台证书的获取与刷新

    1. 前言 在Java中的微信支付(1):API V3版本签名详解一文中胖哥讲解了微信支付V3版本API的签名,当我方(你自己的服务器)请求微信支付服务器时需要根据我方的API证书对参数进行加签,微信 ...

  5. java 微信https 证书_Java中的微信支付(2):API V3 微信平台证书的获取与刷新

    1. 前言 在Java中的微信支付(1):API V3版本签名详解一文中胖哥讲解了微信支付V3版本API的签名,当我方(你自己的服务器)请求微信支付服务器时需要根据我方的API证书对参数进行加签,微信 ...

  6. java 计算器api_用JAVA编写一个简单的计算器~要使用接口的~急啊~

    展开全部 简单写的 可以有不对的地方 import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.sw ...

  7. java 封装api_关于java 封装某个功能为api形式供其他用户调用的问题

    利用泛型定义一个返回对象 public class ServiceResult { private String msg="";//消息说明 private int resultC ...

  8. Java中事件监听机制

    Java中事件监听机制 一.事件监听机制的定义 要想了解Java中的事件监听机制,首先就要去了解一下在Java中事件是怎样去定义的呢!在使用Java编写好一个界面后,我们就会对界面进行一些操作,比如, ...

  9. java怎么设置不同事件_activiti 全局流程监听ActivitiEventListener,实现监听不同类型事件,不需要在acitivit中配置任务监听,非常方便...

    如果我们像给任务配置监听,按照常规的做法是这样的 一个个配置,比较麻烦. 现在利用ActivitiEventListener,监听全局事件,并且可以判断不同的事件类型,进而执行不同的业务逻辑. 1.定 ...

最新文章

  1. 关闭浏览器网页触发事件_浅析浏览器渲染和 script 加载
  2. 3分钟让你轻松了解CRM
  3. CCF201712-5 商路(60分题解链接)
  4. 第十五章笔记 虚拟机管理
  5. 题目 1097: 蛇行矩阵
  6. Android 保存图片到系统图库并通知相册刷新在部分手机的相册里无法查看的问题
  7. w ndows7启动项怎么关,win7如何关闭启动项Windows Security notification icon
  8. 程序员思维僵化_僵化趋势
  9. Redis应用---Redis可以用来做什么?
  10. Windows 7(Win7)下Visual Studio 2012(VS2012)编译jrtplib与MinGW编译jrtplib
  11. Zotero6.0来了,内容丰富,适合初学者(插件安装,翻译器更新)
  12. 引入video.js并使用
  13. 工程师如何学习机器学习算法
  14. 树莓派 安装 Syncthing 自建私有云盘 照片备份 备份手机相册
  15. java build failed_java - maven build failed:无法在jre或jdk issu中找到Javac编译器
  16. 新手淘宝卖家不知道如何运营店铺,精细化运营让你走的更远
  17. ubuntu 禁用透明大页_禁用 Transparent Huge Pages (THP) 透明巨大页面
  18. 0基础学会 守护进程(内附C语言源码)
  19. 了解公司各印章的作用并加强印章保护工作
  20. [置顶]Lapland 建站日记

热门文章

  1. 今日登陆sourceforge后发现的灵异现象
  2. C语言课后习题(11)
  3. 这两个小技巧,让SQL语句不仅躲了坑,还提升了1000倍
  4. 切记!节前给数据库做个巡检
  5. 权威可信 | 华为云云测通过中国电子技术标准院软件测试工具能力评价
  6. 一文带你从零认识什么是XLA
  7. 带你学会区分Scheduled Thread Pool Executor 与Timer
  8. 跨湖跨仓场景下如何实现海量数据分钟级分析
  9. 【DevCloud·敏捷智库】如何利用用户故事了解需求
  10. 数字化时代,规模不再是优势