etcd (ローカルでPUT,GETする)
etcdをdokerで起動
Ref: Run etcd clusters inside containers
└─> export NODE1=192.168.1.21 └─> docker volume create --name etcd-data etcd-data └─> export DATA_DIR="etcd-data" └─> REGISTRY=gcr.io/etcd-development/etcd └─> docker run \ -p 2379:2379 \ -p 2380:2380 \ --volume=${DATA_DIR}:/etcd-data \ --name etcd ${REGISTRY}:latest \ /usr/local/bin/etcd \ --data-dir=/etcd-data --name node1 \ --initial-advertise-peer-urls http://${NODE1}:2380 --listen-peer-urls http://0.0.0.0:2380 \ --advertise-client-urls http://${NODE1}:2379 --listen-client-urls http://0.0.0.0:2379 \ --initial-cluster node1=http://${NODE1}:2380
clientを実装
Ref: example code
package main import ( "context" "fmt" "log" "os" "time" "github.com/coreos/etcd/clientv3" "google.golang.org/grpc/grpclog" ) var ( dialTimeout = 5 * time.Second endpoints = []string{"localhost:2379"} ) func main() { clientv3.SetLogger(grpclog.NewLoggerV2(os.Stderr, os.Stderr, os.Stderr)) cli, err := clientv3.New(clientv3.Config{ Endpoints: endpoints, DialTimeout: dialTimeout, }) if err != nil { log.Fatal(err) } defer cli.Close() _, err = cli.Put(context.TODO(), "foo", "bar") if err != nil { log.Fatal(err) } output, err := cli.Get(context.TODO(), "foo") if err != nil { log.Fatal(err) } fmt.Printf("%+v\n", *output) }
実行
go mod tidyが失敗する
- bboltのインストールパスが違う
└─> go mod tidy . . . github.com/coreos/etcd/clientv3 tested by github.com/coreos/etcd/clientv3.test imports github.com/coreos/etcd/auth imports github.com/coreos/etcd/mvcc/backend imports github.com/coreos/bbolt: github.com/coreos/bbolt@v1.3.6: parsing go.mod: module declares its path as: go.etcd.io/bbolt but was required as: github.com/coreos/bbolt
go.modでインストールパスをfix (issue)
// go.mod replace github.com/coreos/bbolt v1.3.6 => go.etcd.io/bbolt v1.3.6 replace go.etcd.io/bbolt v1.3.6 => github.com/coreos/bbolt v1.3.6
- 最新のgrpcライブラリに
google.golang.org/grpc/naming
がない?
└─> go mod tidy . . . google.golang.org/grpc/naming: module google.golang.org/grpc@latest found (v1.40.0), but does not contain package google.golang.org/grpc/naming
ひとまず、grpcをダウングレード (issue)
// go.mod replace google.golang.org/grpc v1.40.0 => google.golang.org/grpc v1.26.0
解決!
└─> go mod tidy go: finding module for package github.com/coreos/etcd/clientv3 go: found github.com/coreos/etcd/clientv3 in github.com/coreos/etcd v3.3.25+incompatible . . . └─> go run main.go INFO: 2021/09/05 14:00:31 parsed scheme: "endpoint" INFO: 2021/09/05 14:00:31 ccResolverWrapper: sending new addresses to cc: [{localhost:2379 <nil> 0 <nil>}] {Header:cluster_id:12743156124158006367 member_id:16536637930688536249 revision:4 raft_term:2 Kvs:[key:"foo" create_revision:2 mod_revision:4 version:3 value:"bar" ] More:false Count:1 XXX_NoUnkeyedLiteral:{} XXX_unrecognized:[] XXX_sizecache:0}