基于consul实现watch机制

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

基于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 {
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天一个秃顶小技巧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值