initial import

This commit is contained in:
kevin
2020-07-26 17:09:05 +08:00
commit 7e3a369a8f
647 changed files with 54754 additions and 0 deletions

View File

@@ -0,0 +1,27 @@
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"]

View File

@@ -0,0 +1,13 @@
version := v$(shell /bin/date "+%y%m%d%H%M%S")
build:
#docker pull alpine
#docker pull golang:alpine
cd $(GOPATH)/src/zero && docker build -t registry.cn-hangzhou.aliyuncs.com/xapp/etcdmon:$(version) . -f example/etcd/demo/Dockerfile
#docker image prune --filter label=stage=gobuilder -f
push: build
docker push registry.cn-hangzhou.aliyuncs.com/xapp/etcdmon:$(version)
deploy: push
kubectl -n xx-xiaoheiban set image deployment/etcdmon-deployment etcdmon=registry-vpc.cn-hangzhou.aliyuncs.com/xapp/etcdmon:$(version)

View File

@@ -0,0 +1,169 @@
package main
import (
"context"
"fmt"
"strings"
"time"
"zero/core/discov"
"zero/core/logx"
"zero/core/proc"
"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 {
select {
case <-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())
})
}
}
}

View File

@@ -0,0 +1,15 @@
apiVersion: v1
kind: Pod
metadata:
name: etcdmon
namespace: discov
spec:
containers:
- name: etcdmon
image: registry-vpc.cn-hangzhou.aliyuncs.com/xapp/etcdmon:v200620093045
imagePullPolicy: Always
env:
- name: ETCD_CLUSTER
value: etcd.discov:2379
imagePullSecrets:
- name: aliyun

View File

@@ -0,0 +1,4 @@
apiVersion: v1
kind: Namespace
metadata:
name: discovery

378
example/etcd/etcd.yaml Normal file
View File

@@ -0,0 +1,378 @@
apiVersion: v1
kind: Service
metadata:
name: discov
namespace: discovery
spec:
ports:
- name: discov-port
port: 2379
protocol: TCP
targetPort: 2379
selector:
app: discov
---
apiVersion: v1
kind: Pod
metadata:
labels:
app: discov
discov_node: discov0
name: discov0
namespace: discovery
spec:
containers:
- command:
- /usr/local/bin/etcd
- --name
- discov0
- --initial-advertise-peer-urls
- http://discov0:2380
- --listen-peer-urls
- http://0.0.0.0:2380
- --listen-client-urls
- http://0.0.0.0:2379
- --advertise-client-urls
- http://discov0:2379
- --initial-cluster
- discov0=http://discov0:2380,discov1=http://discov1:2380,discov2=http://discov2:2380,discov3=http://discov3:2380,discov4=http://discov4:2380
- --initial-cluster-state
- new
image: registry-vpc.cn-hangzhou.aliyuncs.com/xapp/etcd:latest
name: discov0
ports:
- containerPort: 2379
name: client
protocol: TCP
- containerPort: 2380
name: server
protocol: TCP
imagePullSecrets:
- name: aliyun
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- discov
topologyKey: "kubernetes.io/hostname"
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
labels:
discov_node: discov0
name: discov0
namespace: discovery
spec:
ports:
- name: client
port: 2379
protocol: TCP
targetPort: 2379
- name: server
port: 2380
protocol: TCP
targetPort: 2380
selector:
discov_node: discov0
---
apiVersion: v1
kind: Pod
metadata:
labels:
app: discov
discov_node: discov1
name: discov1
namespace: discovery
spec:
containers:
- command:
- /usr/local/bin/etcd
- --name
- discov1
- --initial-advertise-peer-urls
- http://discov1:2380
- --listen-peer-urls
- http://0.0.0.0:2380
- --listen-client-urls
- http://0.0.0.0:2379
- --advertise-client-urls
- http://discov1:2379
- --initial-cluster
- discov0=http://discov0:2380,discov1=http://discov1:2380,discov2=http://discov2:2380,discov3=http://discov3:2380,discov4=http://discov4:2380
- --initial-cluster-state
- new
image: registry-vpc.cn-hangzhou.aliyuncs.com/xapp/etcd:latest
name: discov1
ports:
- containerPort: 2379
name: client
protocol: TCP
- containerPort: 2380
name: server
protocol: TCP
imagePullSecrets:
- name: aliyun
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- discov
topologyKey: "kubernetes.io/hostname"
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
labels:
discov_node: discov1
name: discov1
namespace: discovery
spec:
ports:
- name: client
port: 2379
protocol: TCP
targetPort: 2379
- name: server
port: 2380
protocol: TCP
targetPort: 2380
selector:
discov_node: discov1
---
apiVersion: v1
kind: Pod
metadata:
labels:
app: discov
discov_node: discov2
name: discov2
namespace: discovery
spec:
containers:
- command:
- /usr/local/bin/etcd
- --name
- discov2
- --initial-advertise-peer-urls
- http://discov2:2380
- --listen-peer-urls
- http://0.0.0.0:2380
- --listen-client-urls
- http://0.0.0.0:2379
- --advertise-client-urls
- http://discov2:2379
- --initial-cluster
- discov0=http://discov0:2380,discov1=http://discov1:2380,discov2=http://discov2:2380,discov3=http://discov3:2380,discov4=http://discov4:2380
- --initial-cluster-state
- new
image: registry-vpc.cn-hangzhou.aliyuncs.com/xapp/etcd:latest
name: discov2
ports:
- containerPort: 2379
name: client
protocol: TCP
- containerPort: 2380
name: server
protocol: TCP
imagePullSecrets:
- name: aliyun
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- discov
topologyKey: "kubernetes.io/hostname"
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
labels:
discov_node: discov2
name: discov2
namespace: discovery
spec:
ports:
- name: client
port: 2379
protocol: TCP
targetPort: 2379
- name: server
port: 2380
protocol: TCP
targetPort: 2380
selector:
discov_node: discov2
---
apiVersion: v1
kind: Pod
metadata:
labels:
app: discov
discov_node: discov3
name: discov3
namespace: discovery
spec:
containers:
- command:
- /usr/local/bin/etcd
- --name
- discov3
- --initial-advertise-peer-urls
- http://discov3:2380
- --listen-peer-urls
- http://0.0.0.0:2380
- --listen-client-urls
- http://0.0.0.0:2379
- --advertise-client-urls
- http://discov3:2379
- --initial-cluster
- discov0=http://discov0:2380,discov1=http://discov1:2380,discov2=http://discov2:2380,discov3=http://discov3:2380,discov4=http://discov4:2380
- --initial-cluster-state
- new
image: registry-vpc.cn-hangzhou.aliyuncs.com/xapp/etcd:latest
name: discov3
ports:
- containerPort: 2379
name: client
protocol: TCP
- containerPort: 2380
name: server
protocol: TCP
imagePullSecrets:
- name: aliyun
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- discov
topologyKey: "kubernetes.io/hostname"
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
labels:
discov_node: discov3
name: discov3
namespace: discovery
spec:
ports:
- name: client
port: 2379
protocol: TCP
targetPort: 2379
- name: server
port: 2380
protocol: TCP
targetPort: 2380
selector:
discov_node: discov3
---
apiVersion: v1
kind: Pod
metadata:
labels:
app: discov
discov_node: discov4
name: discov4
namespace: discovery
spec:
containers:
- command:
- /usr/local/bin/etcd
- --name
- discov4
- --initial-advertise-peer-urls
- http://discov4:2380
- --listen-peer-urls
- http://0.0.0.0:2380
- --listen-client-urls
- http://0.0.0.0:2379
- --advertise-client-urls
- http://discov4:2379
- --initial-cluster
- discov0=http://discov0:2380,discov1=http://discov1:2380,discov2=http://discov2:2380,discov3=http://discov3:2380,discov4=http://discov4:2380
- --initial-cluster-state
- new
image: registry-vpc.cn-hangzhou.aliyuncs.com/xapp/etcd:latest
name: discov4
ports:
- containerPort: 2379
name: client
protocol: TCP
- containerPort: 2380
name: server
protocol: TCP
imagePullSecrets:
- name: aliyun
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- discov
topologyKey: "kubernetes.io/hostname"
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
labels:
discov_node: discov4
name: discov4
namespace: discovery
spec:
ports:
- name: client
port: 2379
protocol: TCP
targetPort: 2379
- name: server
port: 2380
protocol: TCP
targetPort: 2380
selector:
discov_node: discov4

View File

@@ -0,0 +1,22 @@
FROM golang:1.13-alpine AS builder
LABEL stage=gobuilder
ENV CGO_ENABLED 0
ENV GOOS linux
ENV GOPROXY https://goproxy.cn,direct
WORKDIR $GOPATH/src/zero
COPY . .
RUN go build -ldflags="-s -w" -o /app/pub example/etcd/pub/pub.go
FROM alpine
RUN apk add --no-cache tzdata
ENV TZ Asia/Shanghai
WORKDIR /app
COPY --from=builder /app/pub /app/pub
CMD ["./pub"]

11
example/etcd/pub/Makefile Normal file
View File

@@ -0,0 +1,11 @@
version := v$(shell /bin/date "+%y%m%d%H%M%S")
build:
cd $(GOPATH)/src/zero && docker build -t registry.cn-hangzhou.aliyuncs.com/xapp/pub:$(version) . -f example/etcd/pub/Dockerfile
docker image prune --filter label=stage=gobuilder -f
push: build
docker push registry.cn-hangzhou.aliyuncs.com/xapp/pub:$(version)
deploy: push
kubectl -n adhoc set image deployment/pub-deployment pub=registry-vpc.cn-hangzhou.aliyuncs.com/xapp/pub:$(version)

27
example/etcd/pub/pub.go Normal file
View File

@@ -0,0 +1,27 @@
package main
import (
"flag"
"fmt"
"log"
"time"
"zero/core/discov"
)
var value = flag.String("v", "value", "the value")
func main() {
flag.Parse()
client := discov.NewPublisher([]string{"etcd.discovery:2379"}, "028F2C35852D", *value)
if err := client.KeepAlive(); err != nil {
log.Fatal(err)
}
defer client.Stop()
for {
time.Sleep(time.Second)
fmt.Println(*value)
}
}

26
example/etcd/pub/pub.yaml Normal file
View File

@@ -0,0 +1,26 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: pub-deployment
namespace: adhoc
labels:
app: pub
spec:
replicas: 1
selector:
matchLabels:
app: pub
template:
metadata:
labels:
app: pub
spec:
containers:
- name: pub
image: registry-vpc.cn-hangzhou.aliyuncs.com/xapp/pub:v200213172101
command:
- /app/pub
- -v
- ccc
imagePullSecrets:
- name: aliyun

View File

@@ -0,0 +1,22 @@
FROM golang:1.13-alpine AS builder
LABEL stage=gobuilder
ENV CGO_ENABLED 0
ENV GOOS linux
ENV GOPROXY https://goproxy.cn,direct
WORKDIR $GOPATH/src/zero
COPY . .
RUN go build -ldflags="-s -w" -o /app/sub example/etcd/sub/sub.go
FROM alpine
RUN apk add --no-cache tzdata
ENV TZ Asia/Shanghai
WORKDIR /app
COPY --from=builder /app/sub /app/sub
CMD ["./sub"]

11
example/etcd/sub/Makefile Normal file
View File

@@ -0,0 +1,11 @@
version := v$(shell /bin/date "+%y%m%d%H%M%S")
build:
cd $(GOPATH)/src/zero && docker build -t registry.cn-hangzhou.aliyuncs.com/xapp/sub:$(version) . -f example/etcd/sub/Dockerfile
docker image prune --filter label=stage=gobuilder -f
push: build
docker push registry.cn-hangzhou.aliyuncs.com/xapp/sub:$(version)
deploy: push
kubectl -n adhoc set image deployment/sub-deployment sub=registry-vpc.cn-hangzhou.aliyuncs.com/xapp/sub:$(version)

21
example/etcd/sub/sub.go Normal file
View File

@@ -0,0 +1,21 @@
package main
import (
"fmt"
"time"
"zero/core/discov"
)
func main() {
sub := discov.NewSubscriber([]string{"etcd.discovery:2379"}, "028F2C35852D", discov.Exclusive())
ticker := time.NewTicker(time.Second * 3)
defer ticker.Stop()
for {
select {
case <-ticker.C:
fmt.Println("values:", sub.Values())
}
}
}

16
example/etcd/sub/sub.yaml Normal file
View File

@@ -0,0 +1,16 @@
apiVersion: v1
kind: Pod
metadata:
labels:
app: sub
name: sub
namespace: adhoc
spec:
containers:
- command:
- /app/sub
image: registry-vpc.cn-hangzhou.aliyuncs.com/xapp/sub:v200213220509
name: sub
imagePullSecrets:
- name: aliyun
restartPolicy: Always