项目上有一些配置文件,不想放在数据库中,就搭建了一个etcd服务器配置这块东西。
前提
1.使用etcd肯定要etcd服务器
我是用docker搭建的,方便测试
docker命令
docker run -d --name etcd-server --publish 2379:2379 --publish 2380:2380 --env ALLOW_NONE_AUTHENTICATION=yes --env ETCD_ADVERTISE_CLIENT_URLS=http://etcd-server:2379 bitnami/etcd:3
2.关键pom
<dependency>
<groupId>io.etcd</groupId>
<artifactId>jetcd-core</artifactId>
<version>0.5.3</version>
</dependency>
实际代码
@Slf4j
public class EtcdUtils {
private static final int maxEvents = Integer.MAX_VALUE;
//etcl客户端链接
private static Client client = null;
/**
* 根据指定的配置名称获取对应的value
* @param key 配置项
* @return
* @throws Exception
*/
public static String getEtcdValueByKey(String key) throws Exception {
List<KeyValue> kvs = EtcdUtils.getEtclClient().getKVClient().get(ByteSequence.from(key,StandardCharsets.UTF_8)).get().getKvs();
if(kvs.size()>0){
return kvs.get(0).getValue().toString(StandardCharsets.UTF_8);
}
else {
return null;
}
}
/**
* 新增或者修改指定的配置
* @param key
* @param value
* @return
*/
public static void putEtcdValueByKey(String key,String value){
EtcdUtils.getEtclClient().getKVClient().put(ByteSequence.from(key,StandardCharsets.UTF_8),ByteSequence.from(value.getBytes(StandardCharsets.UTF_8)));
}
/**
* 删除指定的配置
* @param key key
* @return
*/
public static void deleteEtcdValueByKey(String key){
EtcdUtils.getEtclClient().getKVClient().delete(ByteSequence.from(key,StandardCharsets.UTF_8));
}
/**
* 监听指定key的变化
* @param keyString key
*/
public static void watchKey(String keyString){
CountDownLatch latch = new CountDownLatch(maxEvents);
ByteSequence key = ByteSequence.from(keyString, StandardCharsets.UTF_8);
Watch.Listener listener = Watch.listener(response -> {
log.info("Watching for key={}", key);
for (WatchEvent event : response.getEvents()) {
log.info("type={}, key={}, value={}", event.getEventType(),
Optional.ofNullable(event.getKeyValue().getKey()).map(bs -> bs.toString(StandardCharsets.UTF_8)).orElse(""),
Optional.ofNullable(event.getKeyValue().getValue()).map(bs -> bs.toString(StandardCharsets.UTF_8)).orElse(""));
}
latch.countDown();
});
try (Watch watch = getEtclClient().getWatchClient();
Watch.Watcher watcher = watch.watch(key, listener)) {
latch.await();
} catch (Exception e) {
log.error("Watching Error {}", e);
System.exit(1);
}
}
//链接初始化 单例模式
private static synchronized Client getEtclClient(){
if(null == client){
client = Client.builder().endpoints("http://127.0.0.1:2379").build();
}
return client;
}
private static String getConfig(List<KeyValue> kvs){
if(kvs.size()>0){
String config = kvs.get(0).getKey().toString(StandardCharsets.UTF_8);
String value = kvs.get(0).getValue().toString(StandardCharsets.UTF_8);
log.info("etcd 's config 's config key is :{},value is:{}",config,value);
return value;
}
else {
return null;
}
}
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(()->{
watchKey("test");
});
putEtcdValueByKey("test","aaa");
String test = getEtcdValueByKey("test");
System.out.println(test);;
}
}
github地址
https://github.com/jrd77/etcddemo
参考:
https://www.cnblogs.com/laoqing/p/8967549.html
网友评论