[Golang] ETCD键值监听器
0x0 需求
我们所有的服务启动后都以lease形式注册入ETCD,现要把这些服务监控起来。
0x1 ETCD key监听器实现
可动态增删要监听的键值对
https://github.com/bailu1901/pkg/blob/master/etcd_watcher/watcher.go
// Package etcd_watcher ETCD键值监听器
package etcd_watcher import (
"context"
"sync"
"time" "github.com/coreos/etcd/clientv3"
"github.com/coreos/etcd/mvcc/mvccpb"
) var (
timeOut = time.Duration() * time.Second // 超时
) // Listener 对外通知
type Listener interface {
Set([]byte, []byte)
Create([]byte, []byte)
Modify([]byte, []byte)
Delete([]byte)
} // EtcdWatcher ETCD key监视器
type EtcdWatcher struct {
cli *clientv3.Client // etcd client
wg sync.WaitGroup
listener Listener
mu sync.Mutex
closeHandler map[string]func()
} // NewEtcdWatcher 构造
func NewEtcdWatcher(servers []string) (*EtcdWatcher, error) {
cli, err := clientv3.New(clientv3.Config{
Endpoints: servers,
DialTimeout: timeOut,
})
if err != nil {
return nil, err
} ew := &EtcdWatcher{
cli: cli,
closeHandler: make(map[string]func()),
} return ew, nil
} // AddWatch 添加监视
func (mgr *EtcdWatcher) AddWatch(key string, prefix bool, listener Listener) bool {
mgr.mu.Lock()
defer mgr.mu.Unlock()
if _, ok := mgr.closeHandler[key]; ok {
return false
}
ctx, cancel := context.WithCancel(context.Background())
mgr.closeHandler[key] = cancel mgr.wg.Add()
go mgr.watch(ctx, key, prefix, listener) return true
} // RemoveWatch 删除监视
func (mgr *EtcdWatcher) RemoveWatch(key string) bool {
mgr.mu.Lock()
defer mgr.mu.Unlock()
cancel, ok := mgr.closeHandler[key]
if !ok {
return false
}
cancel()
delete(mgr.closeHandler, key) return true
} // ClearWatch 清除所有监视
func (mgr *EtcdWatcher) ClearWatch() {
mgr.mu.Lock()
defer mgr.mu.Unlock()
for k := range mgr.closeHandler {
mgr.closeHandler[k]()
}
mgr.closeHandler = make(map[string]func())
} // Close 关闭
func (mgr *EtcdWatcher) Close(wait bool) {
mgr.ClearWatch() if wait {
mgr.wg.Wait()
} mgr.cli.Close()
mgr.cli = nil
} func (mgr *EtcdWatcher) watch(ctx context.Context, key string, prefix bool, listener Listener) error {
defer mgr.wg.Done() ctx1, cancel := context.WithTimeout(context.Background(), timeOut)
defer cancel()
var getResp *clientv3.GetResponse
var err error
if prefix {
getResp, err = mgr.cli.Get(ctx1, key, clientv3.WithPrefix())
} else {
getResp, err = mgr.cli.Get(ctx1, key)
}
if err != nil {
return err
} for _, ev := range getResp.Kvs {
listener.Set(ev.Key, ev.Value)
} var watchChan clientv3.WatchChan
if prefix {
watchChan = mgr.cli.Watch(context.Background(), key, clientv3.WithPrefix(), clientv3.WithRev(getResp.Header.Revision+))
} else {
watchChan = mgr.cli.Watch(context.Background(), key, clientv3.WithRev(getResp.Header.Revision+))
}
for {
select {
case <-ctx.Done():
return nil
case resp := <-watchChan:
err := resp.Err()
if err != nil {
return err
}
for _, ev := range resp.Events {
if ev.IsCreate() {
listener.Create(ev.Kv.Key, ev.Kv.Value)
} else if ev.IsModify() {
listener.Modify(ev.Kv.Key, ev.Kv.Value)
} else if ev.Type == mvccpb.DELETE {
listener.Delete(ev.Kv.Key)
} else {
}
}
}
}
}
0x3 配合发送邮件做报警
https://github.com/bailu1901/pkg/tree/master/mailbox
[Golang] ETCD键值监听器的更多相关文章
- etcd:用于服务发现的键值存储系统
etcd是一个高可用的键值存储系统,主要用于共享配置和服务发现.etcd是由CoreOS开发并维护的,灵感来自于 ZooKeeper 和 Doozer,它使用Go语言编写,并通过Raft一致性算法处理 ...
- 分布式键值存储系统ETCD调研
分布式键值存储系统ETCD调研 简介 etcd是一个开源的分布式键值存储工具--为CoreOS集群提供配置服务.发现服务和协同调度.Etcd运行在集群的每个coreos节点上,可以保证coreos集群 ...
- docker——Etcd高可用键值对数据库
一.简介 Etcd按照官方介绍: Etcd is a distributed, consistent key-value store for shared configuration and serv ...
- 探索etcd,Zookeeper和Consul一致键值数据存储的性能
这篇博文是探索三个分布式.一致性键值数据存储软件性能的系列文章中的第一篇:etcd.Zookeeper和Consul,由etcd团队所写,可以让我们全面地了解如何评估三个分布式一致存储软件的性能.翻译 ...
- PowerDotNet平台化软件架构设计与实现系列(05):ETCD分布式键值存储平台
ETCD目前在PowerDotNet已经被用于注册中心和配置管理(常见的配置中心在PowerDotNet中仅仅是一个小小的模块而已)中,作为基础设施的重要组成部分,ETCD的重要性不言而喻. 本文简单 ...
- KVO 键值观察者
KVO(键值观察者) //监听的创建 -(id)initChildren:(Person *)person { self = [super init]; if (self != nil) { //拥有 ...
- ios中键值编码kvc和键值监听kvo的特性及详解
总结: kvc键值编码 1.就是在oc中可以对属性进行动态读写(以往都是自己赋值属性) 2. 如果方法属性的关键字和需要数据中的关键字相同的话 ...
- xcode KVC:Key Value Coding 键值编码
赋值 // 能修改私有成员变量 - (void)setValue:(id)value forKey:(NSString *)key; - (void)setValue:(id)value forKey ...
- iOS监听模式系列之键值编码KVC、键值监听KVO的简单介绍和应用
键值编码KVC 我们知道在C#中可以通过反射读写一个对象的属性,有时候这种方式特别方便,因为你可以利用字符串的方式去动态控制一个对象.其实由于ObjC的语言特性,你根部不必进行任何操作就可以进行属性的 ...
随机推荐
- python笔记44-HTTP对外接口sign签名
前言 一般公司对外的接口都会用到sign签名,对不同的客户提供不同的apikey ,这样可以提高接口请求的安全性,避免被人抓包后乱请求. sign签名是一种很常见的方式 sign签名 签名参数sign ...
- flask实战-个人博客-程序骨架、创建数据库模型、临接列表关系 --
编写程序骨架 personalBlog的功能主要分为三部分:博客前台.用户认证.博客后台,其中包含的功能点如下图所示: 数据库 personalBlog一共需要使用四张表,分别存储管理员(Admin) ...
- python基础语法1 用户交互,基本数据类型,格式化输出,运算符
与用户交互: 输入: python2: input一定要声明你输入的类型 >>> input(">>:") >>:sean Traceba ...
- [Algorithm] 21. Merge Two Sorted Lists
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...
- 2019牛客国庆集训派对day3 买一送一
题目链接: 题意:有n个点,n-1条单向边,每个点都销售一类商品 问从点1开始走,买第一样商品类型为x,买第二样商品类型为y,问不同有序对<x,y>的数量 解法: col[i]表示这个点的 ...
- Windows上使用Linux命令
WSL Windows Subsystem for Linux(简称WSL)是一个在Windows 10上能够运行原生Linux二进制可执行文件(ELF格式)的兼容层.它是由微软与Canonical公 ...
- 【luogu 5395】 【模板】第二类斯特林数·行
code: #include <bits/stdc++.h> #define ll long long #define setIO(s) freopen(s".in", ...
- ent 基本使用十四 edge
edge 在ent 中属于比较核心,同时也是功能最强大的,ent 提供了比较强大的关系模型 快速使用 参考图 以上包含了两个通过边定义的关系 pets/owner: user package sc ...
- Traefik 2.0 发布了
Traefik 2.0 发布了,包含了很多不错的行特性 tcp 路由(同时也支持sni 路由) 参考配置 tcp: routers: to-db-1: entrypoints: - web-secur ...
- 什么是JSON Web Token
JSON Web Token(JWT)是一个基于 RFC 7519 的开放数据标准,它定义了一种宽松且紧凑的数据组合方式,使用 JSON 对象在各应用之间传输加密信息.该 JSON 对象可以通过数字 ...