etcd启动和测试

趁着失业看点没看过的东西,先在本机上启动etcd的环境再跟着文档看看一些具体的实现。首先可以再docker上pull一个最新的镜像并启动,用docker启动一个容器会比较方便的得到一个干净隔离的环境,需要删除的时候也更彻底一些。

官方文档: https://etcd.io/docs/v3.5/tutorials/

本地环境的配置

// 拉取镜像
docker pull bitnami/etcd

// 根据镜像启动一个新的容器
docker run -d --name myetcd \
    --publish 2379:2379 \
    --publish 2380:2380 \
    --env ALLOW_NONE_AUTHENTICATION=yes \
    --env ETCD_ADVERTISE_CLIENT_URLS=http://0.0.0.0:2379 \
    bitnami/etcd:latest
    
// 进入容器使用etcdctl命令验证功能
docker exec -it myetcd /bin/sh

//执行一些基础命令看看效果
$ etcdctl put name yugu
OK
$ etcdctl get name
name
yugu
$ etcdctl del name
1
$ etcdctl get name
$

http请求遇到的base64编码问题

之前在启动容器的时候指定了etcd暴露的服务端地址,可以尝试一下使用http请求操作etcd。因为使用了grpc通信,在代码中找到对应的proto文件查看服务路径。

api/etcdserverpb/rpc.proto

  rpc Put(PutRequest) returns (PutResponse) {
      option (google.api.http) = {
        post: "/v3/kv/put"
        body: "*"
    };
  }

curl接口的时候却返回错误,通过返回的信息推断是和payload的内容不是base64编码格式有关。通过代码可以看到Key和Value的类型是[]byte而不string,因此为了请求的字符串能够表示完整的二进制内容, 需要对二进制内容进行base64编码后作为字符串传递。而这部分工作是grpc-gateway自动完成的。

curl -L http://localhost:2379/v3/kv/put \
  -X POST \
  -d '{"key": "name", "value": "czl"}'

{"error":"illegal base64 data at input byte 4","code":3,"message":"illegal base64 data at input byte 4"}%

grpc-gateway 通过 protoc 编译器插件生成用于将 gRPC 服务映射到 RESTful API 的代码。生成的代码会处理 HTTP 请求和响应的转换,包括将 gRPC 消息序列化为 JSON 格式或将 JSON 格式反序列化为 gRPC 消息。在这个转换过程中,bytes 类型的字段会被自动编码或解码为 Base64。

在对请求内容进行base64编码后重试成功能够拿到返回结果, 再获取key的值发现已经被成功更新了。从返回结果的各个字段可以看到etcd集群和节点的ID以及当前字段修改的次数,当我再次更新同一个key的值并获取的话,可以看到revision字段也被更新了(累加1),最后raft_term应该是与raft选举的任期有关,如果我重启容器的话,这个值应该也会改变。具体raft的实现后面在看...

curl -L http://localhost:2379/v3/kv/put \
  -X POST \
  -d '{"key": "bmFtZQ==", "value": "Y3ps"}'

{"header":{"cluster_id":"14841639068965178418","member_id":"10276657743932975437","revision":"5","raft_term":"4"}}%

$ etcdctl get name
name
czl
相关推荐
beifengtz9 小时前
推荐一款ETCD桌面客户端——Etcd Workbench
etcd·etcd客户端
ZHOU西口9 小时前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac
ZHOU西口5 天前
微服务实战系列之玩转Docker(十六)
分布式·docker·云原生·架构·etcd·配置中心
forestqq9 天前
构建后端为etcd的CoreDNS的容器集群(七)、编写适合阅读的域名管理脚本
运维·数据库·etcd
华东设计之美9 天前
etcd多实例配置
linux·服务器·etcd
24203011 天前
etcd之etcd分布式锁及事务(四)
golang·etcd
alden_ygq14 天前
docker 部署单节点的etcd以及 常用使用命令
docker·容器·etcd
forestqq14 天前
构建后端为etcd的CoreDNS的容器集群(六)、编写自动维护域名记录的代码脚本
数据库·etcd·coredns
观测云14 天前
Etcd 可观测最佳实践
etcd
suoyue_zhan15 天前
ETCD未授权访问风险基于角色认证和启用https的ca证书修复方案
数据库·postgresql·etcd·1024程序员节·patroni