[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的语言特性,你根部不必进行任何操作就可以进行属性的 ...
随机推荐
- JS定时器实现函数节流和防抖 -简单实现对比 -适用地方
如题 (总结要点) 防止重复点击! 最近项目中遇见这个"函数抖动"的问题!快速点击前端xx按钮,造成数据多次加载进页面里,正常只显示10条数据,结果显示了20条数据,异常! 出现原 ...
- hive中删除表的错误Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException
hive使用drop table 表名删除表时报错,return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException 刚 ...
- Flutter在iOS上的表现就是一坨屎
Flutter在iOS上的表现就是一坨屎: 用户体验差到了极点: 目前来说不值得投入大量精力去研究: 了解一下原理可以.
- 理解serverless无服务架构原理(一)
阅读目录 一:什么是serverless无服务? 二:与传统模式架构区别? 三:serverless优缺点? 四:使用serverless的应用场景有哪些? 回到顶部 一:什么是serverless无 ...
- OpenCV 学习笔记(2) 使用鼠标绘制矩形并截取和保存矩形区域图像
http://www.cnblogs.com/lidabo/p/3437587.html 0 效果展示 1工程源码 #include <opencv2/core/core.hpp> # ...
- 【C/C++】变量
变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储.变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表. 变量声明向编译器保证变量以给定的类型和名称存在,这样编译器在不需要 ...
- ABP 03 解决 编辑User报错
1.编辑用户时,报错.后面有跟解决方案. 解决方案1: 2.导致出错的原因是这样的,这里的功能是请求服务端的html页面,渲染后显示编辑页面. 关键点是默认参数那儿 路径:\aspnet-core\s ...
- cogs 944. [東方S3] 藤原妹红
二次联通门 : cogs 944. [東方S3] 藤原妹红 /* cogs 944. [東方S3] 藤原妹红 最小生成树 + 树形dp 首先对原图跑最下生成树 后建出一棵树 在树上进行dp 先走到叶子 ...
- mark一下咕掉的题目
蒟蒻才普及组呀~ 大佬别D我 等集中补一下 CF980F:咋说捏,我觉得要联赛了做这题有点浪费时间,等想颓废了再来写写叭qwq 215E/279D/288E/331C3/431D/433E/750G/ ...
- python 操作es
Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上. Lucene 可能是目前存在的,不论开源还是私有的,拥有最先进,高性能和全功能搜索 ...