remove etcd facade, added for testing purpose (#447)
This commit is contained in:
@@ -1,47 +0,0 @@
|
|||||||
package discov
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/tal-tech/go-zero/core/discov/internal"
|
|
||||||
"github.com/tal-tech/go-zero/core/logx"
|
|
||||||
)
|
|
||||||
|
|
||||||
type (
|
|
||||||
Facade struct {
|
|
||||||
endpoints []string
|
|
||||||
registry *internal.Registry
|
|
||||||
}
|
|
||||||
|
|
||||||
FacadeListener interface {
|
|
||||||
OnAdd(key, val string)
|
|
||||||
OnDelete(key string)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
func NewFacade(endpoints []string) Facade {
|
|
||||||
return Facade{
|
|
||||||
endpoints: endpoints,
|
|
||||||
registry: internal.GetRegistry(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f Facade) Client() internal.EtcdClient {
|
|
||||||
conn, err := f.registry.GetConn(f.endpoints)
|
|
||||||
logx.Must(err)
|
|
||||||
return conn
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f Facade) Monitor(key string, l FacadeListener) {
|
|
||||||
f.registry.Monitor(f.endpoints, key, listenerAdapter{l})
|
|
||||||
}
|
|
||||||
|
|
||||||
type listenerAdapter struct {
|
|
||||||
l FacadeListener
|
|
||||||
}
|
|
||||||
|
|
||||||
func (la listenerAdapter) OnAdd(kv internal.KV) {
|
|
||||||
la.l.OnAdd(kv.Key, kv.Val)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (la listenerAdapter) OnDelete(kv internal.KV) {
|
|
||||||
la.l.OnDelete(kv.Key)
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
FROM golang:alpine AS builder
|
|
||||||
|
|
||||||
LABEL stage=gobuilder
|
|
||||||
|
|
||||||
ENV CGO_ENABLED 0
|
|
||||||
ENV GOOS linux
|
|
||||||
ENV GOPROXY https://goproxy.cn,direct
|
|
||||||
|
|
||||||
RUN apk add upx
|
|
||||||
|
|
||||||
WORKDIR $GOPATH/src/zero
|
|
||||||
COPY . .
|
|
||||||
RUN go build -ldflags="-s -w" -o /app/etcdmon example/etcd/demo/etcdmon.go
|
|
||||||
RUN upx -q /app/etcdmon
|
|
||||||
|
|
||||||
|
|
||||||
FROM alpine
|
|
||||||
|
|
||||||
RUN apk update --no-cache
|
|
||||||
RUN apk add --no-cache ca-certificates
|
|
||||||
RUN apk add --no-cache tzdata
|
|
||||||
ENV TZ Asia/Shanghai
|
|
||||||
|
|
||||||
WORKDIR /app
|
|
||||||
COPY --from=builder /app/etcdmon /app/etcdmon
|
|
||||||
|
|
||||||
CMD ["./etcdmon"]
|
|
||||||
@@ -1,165 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/tal-tech/go-zero/core/discov"
|
|
||||||
"github.com/tal-tech/go-zero/core/logx"
|
|
||||||
"github.com/tal-tech/go-zero/core/proc"
|
|
||||||
"github.com/tal-tech/go-zero/core/syncx"
|
|
||||||
"go.etcd.io/etcd/clientv3"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
endpoints []string
|
|
||||||
keys = []string{
|
|
||||||
"user.rpc",
|
|
||||||
"classroom.rpc",
|
|
||||||
}
|
|
||||||
vals = make(map[string]map[string]string)
|
|
||||||
barrier syncx.Barrier
|
|
||||||
)
|
|
||||||
|
|
||||||
type listener struct {
|
|
||||||
key string
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
cluster := proc.Env("ETCD_CLUSTER")
|
|
||||||
if len(cluster) > 0 {
|
|
||||||
endpoints = strings.Split(cluster, ",")
|
|
||||||
} else {
|
|
||||||
endpoints = []string{"localhost:2379"}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l listener) OnAdd(key, val string) {
|
|
||||||
fmt.Printf("add, key: %s, val: %s\n", key, val)
|
|
||||||
barrier.Guard(func() {
|
|
||||||
if m, ok := vals[l.key]; ok {
|
|
||||||
m[key] = val
|
|
||||||
} else {
|
|
||||||
vals[l.key] = map[string]string{key: val}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l listener) OnDelete(key string) {
|
|
||||||
fmt.Printf("del, key: %s\n", key)
|
|
||||||
barrier.Guard(func() {
|
|
||||||
if m, ok := vals[l.key]; ok {
|
|
||||||
delete(m, key)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func load(cli *clientv3.Client, key string) (map[string]string, error) {
|
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
|
|
||||||
resp, err := cli.Get(ctx, key, clientv3.WithPrefix())
|
|
||||||
cancel()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
ret := make(map[string]string)
|
|
||||||
for _, ev := range resp.Kvs {
|
|
||||||
ret[string(ev.Key)] = string(ev.Value)
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func loadAll(cli *clientv3.Client) (map[string]map[string]string, error) {
|
|
||||||
ret := make(map[string]map[string]string)
|
|
||||||
for _, key := range keys {
|
|
||||||
m, err := load(cli, key)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
ret[key] = m
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func compare(a, b map[string]map[string]string) bool {
|
|
||||||
if len(a) != len(b) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
for k := range a {
|
|
||||||
av := a[k]
|
|
||||||
bv := b[k]
|
|
||||||
if len(av) != len(bv) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
for kk := range av {
|
|
||||||
if av[kk] != bv[kk] {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func serializeMap(m map[string]map[string]string, prefix string) string {
|
|
||||||
var builder strings.Builder
|
|
||||||
for k, v := range m {
|
|
||||||
fmt.Fprintf(&builder, "%s%s:\n", prefix, k)
|
|
||||||
for kk, vv := range v {
|
|
||||||
fmt.Fprintf(&builder, "%s\t%s: %s\n", prefix, kk, vv)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return builder.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
registry := discov.NewFacade(endpoints)
|
|
||||||
for _, key := range keys {
|
|
||||||
registry.Monitor(key, listener{key: key})
|
|
||||||
}
|
|
||||||
|
|
||||||
ticker := time.NewTicker(time.Minute)
|
|
||||||
defer ticker.Stop()
|
|
||||||
|
|
||||||
for range ticker.C {
|
|
||||||
expect, err := loadAll(registry.Client().(*clientv3.Client))
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println("[ETCD-test] can't load current keys")
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
check := func() bool {
|
|
||||||
var match bool
|
|
||||||
barrier.Guard(func() {
|
|
||||||
match = compare(expect, vals)
|
|
||||||
})
|
|
||||||
if match {
|
|
||||||
logx.Info("match")
|
|
||||||
}
|
|
||||||
return match
|
|
||||||
}
|
|
||||||
if check() {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
time.AfterFunc(time.Second*5, func() {
|
|
||||||
if check() {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var builder strings.Builder
|
|
||||||
builder.WriteString(fmt.Sprintf("expect:\n%s\n", serializeMap(expect, "\t")))
|
|
||||||
barrier.Guard(func() {
|
|
||||||
builder.WriteString(fmt.Sprintf("actual:\n%s\n", serializeMap(vals, "\t")))
|
|
||||||
})
|
|
||||||
fmt.Println(builder.String())
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user