简介

Etcd 是 CoreOS 基于 Raft 协议开发的分布式键值对存储 (key-value peer store) ,设计用来可靠而快速的保存关键数据并提供访问。

核心功能

  • KV数据库
  • 服务发现
  • 共享配置
  • 协调分布式
  • 分布式锁

概念

  • ByteSepqence: 基础数据类型, 即实际存储为二进制数据
  • 租约: 用于生成有效期的记录类型, 返回值为long类型ID, 可将kv或lock绑定租约, 在租约到期时, 关联数据将被清理
  • kv: 键值对, k/v均为ByteSepqence类型
  • lock: 分布式锁
  • watch监听, 事件类型如下
    • PUT
    • DELETE
    • UNRECOGNIZED
  • Option 选项, 例如 GetOption PutOption, 用于模糊查询、绑定租约的新增等

Java连接

pom依赖

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/io.etcd/jetcd-core -->
<dependency>
<groupId>io.etcd</groupId>
<artifactId>jetcd-core</artifactId>
<version>0.7.7</version>
</dependency>

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Client client = Client.builder()
.endpoints("http://127.0.0.1:2379")
.build();
KV kvClient = client.getKVClient();

String key = "user";
String value = "Jamie";
ByteSequence keySequence = ByteSequence.from(key, StandardCharsets.UTF_8);
ByteSequence valueSequence = ByteSequence.from(value, StandardCharsets.UTF_8);

Lease leaseClient = client.getLeaseClient();
// 30秒 租约
long leaseId = leaseClient.grant(30).get().getID();
// 存
PutOption putOption = PutOption.builder().withLeaseId(leaseId).build();
PutResponse putResponse = kvClient.put(keySequence, valueSequence, putOption).get();


// 前缀匹配
GetOption getOption = GetOption.builder().isPrefix(true).build();
// 查询
List<KeyValue> kvs = kvClient.get(keySequence).get().getKvs();
System.out.println(kvs.size());
if (!kvs.isEmpty()) {
String keyStr = kvs.get(0).getKey().toString(StandardCharsets.UTF_8);
String valueStr = kvs.get(0).getValue().toString(StandardCharsets.UTF_8);
System.out.println(keyStr);
System.out.println(valueStr);
}

// 监听事件
Watch watchClient = client.getWatchClient();
WatchOption watchOption = WatchOption.builder().build();

watchClient.watch(keySequence, (response) -> {
for (WatchEvent event : response.getEvents()) {
switch (event.getEventType()) {
case DELETE:
KeyValue prevKV = event.getPrevKV();
KeyValue keyValue = event.getKeyValue();
// 略
break;
case PUT:
case UNRECOGNIZED:
default:
break;
}
}
});

文档链接

__END__