本项目已添加对 etcd v3 API 的支持,允许使用 etcd 客户端与我们的分布式 KV 存储进行交互。
目前支持以下 etcd v3 API:
- Range - 用于获取键值对
- Put - 用于设置键值对
- Delete - 用于删除键值对
使用-eaddr参数指定 etcd API 的监听地址:
./hraftd -eaddr localhost:2379 ~/node0默认情况下,etcd API 将在localhost:2379上监听。
您可以使用任何支持 etcd v3 API 的客户端与服务器进行交互。以下是一些示例:
我们提供了一个简单的命令行工具来测试 etcd API:
# 编译命令行工具
go build -o etcdclient cmd/etcdclient/main.go
# 设置键值对
./etcdclient -cmd put -key foo -value bar
# 获取键值对
./etcdclient -cmd get -key foo
# 删除键值对
./etcdclient -cmd delete -key foo您也可以使用官方的 etcdctl 工具:
# 设置键值对
ETCDCTL_API=3 etcdctl --endpoints=localhost:2379 put foo bar
# 获取键值对
ETCDCTL_API=3 etcdctl --endpoints=localhost:2379 get foo
# 删除键值对
ETCDCTL_API=3 etcdctl --endpoints=localhost:2379 del foopackage main
import (
"context"
"fmt"
"log"
"time"
clientv3 "go.etcd.io/etcd/client/v3"
)
func main() {
// 创建etcd客户端
cli, err := clientv3.New(clientv3.Config{
Endpoints: []string{"localhost:2379"},
DialTimeout: 5 * time.Second,
})
if err != nil {
log.Fatalf("failed to create etcd client: %v", err)
}
defer cli.Close()
// 设置键值对
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
_, err = cli.Put(ctx, "foo", "bar")
cancel()
if err != nil {
log.Fatalf("failed to put key: %v", err)
}
// 获取键值对
ctx, cancel = context.WithTimeout(context.Background(), 2*time.Second)
resp, err := cli.Get(ctx, "foo")
cancel()
if err != nil {
log.Fatalf("failed to get key: %v", err)
}
for _, ev := range resp.Kvs {
fmt.Printf("Key: %s, Value: %s\n", ev.Key, ev.Value)
}
// 删除键值对
ctx, cancel = context.WithTimeout(context.Background(), 2*time.Second)
_, err = cli.Delete(ctx, "foo")
cancel()
if err != nil {
log.Fatalf("failed to delete key: %v", err)
}
}当前实现有以下限制:
- 不支持 etcd v2 API
- 不支持事务(Txn)
- 不支持压缩(Compact)
- 不支持 Watch API
- 不支持 Lease API
- Range API 的前缀查询功能有限
- 不支持 DeleteRange 的范围删除功能
这些限制可能会在未来的版本中解决。