基于consul实现watch机制
原文链接:基于consul实现watch机制
前言
consul常常被用来作服务注册与服务发现,而它的watch机制则可被用来监控一些数据的更新,实时获取最新的数据。另外,在监控到数据变化后,还可以调用外部处理程序,此处理程序可以是任何可执行文件或HTTP调用,具体说明可见官网。
当前consul支持以下watch类型如下所示:
- key 监听一个consul kv中的key
- keyprefix 监听consul kv中的key的前缀
- services 监听有效服务的变化
- nodes 监听节点的变化
- service 监听服务的变化
- checks 监听check的变化
- event 监听自定义事件的变化
从以上可以看出consul提供非常丰富的监听类型,通过这些类型我们可以实时观测到consul整个集群中的变化,从而实现一些特别的需求,比如:实时更新、服务告警等功能。
基于Golang 实现watch 对服务变化的监控
consul官方提供了Golang版的watch包。其实际上也是对watch机制进行了一层封装,最终代码实现的只是对consul HTTP API 的 endpoints的使用,不涉及数据变化后的相关处理,封装程度不够。
接下来我将基于封装了的相关处理函数的工具包进行解决,详细代码可通过工具库 consul-tool 进行下载查看。
1.客户端client.go 用于初始consul相关配置以及封装consul的api库的基础操作
package backends
import (
"encoding/json"
"fmt"
"github.com/hashicorp/consul/api"
errors "github.com/longpi1/consul-tool/pkg/error"
"github.com/longpi1/consul-tool/pkg/log"
"strings"
"sync"
"time"
)
// Option ...
type Option func(opt *Config)
// NewConfig 初始化consul配置
func NewConfig(opts ...Option) *Config {
c := &Config{
conf: api.DefaultConfig(),
watchers: make(map[string]*watcher),
logger: log.NewLogger(),
}
for _, o := range opts {
o(c)
}
return c
}
// Config 相关配置的结构体
type Config struct {
sync.RWMutex
logger log.Logger
kv *api.KV
conf *api.Config
watchers map[string]*watcher
prefix string
}
// 循环监听
func (c *Config) watcherLoop(path string) {
c.logger.Info("watcher start...", "path", path)
w := c.getWatcher(path)
if w == nil {
c.logger.Error("watcher not found", "path", path)
return
}
for {
if err := w.run(c.conf.Address, c.conf); err != nil {

本文介绍如何使用 Consul 的 Watch 机制来监控服务变化及数据更新,并提供了 Golang 实现的具体代码示例。
最低0.47元/天 解锁文章
1002

被折叠的 条评论
为什么被折叠?



