Consul 是用于分布式系统服务发现与配置,内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案。Consul是使用Go语言编写的,使用很方便。有个需求,配置文件里面的参数经常会调整,变动后需要实时获取,今天来实现监听consul中key/value 数据的变化。
在ubuntu安装consul并配置启动服务,
$ wget https://releases.hashicorp.com/consul/1.2.0/consul_1.2.0_linux_amd64.zip
$ yum install unzip
$ unzip consul_0.7.2_linux_amd64.zip
$ mv consul /usr/local/bin/consul
配置好后,控制台可以输出consul,可以看到有输出。
因为是监控配置文件,所以搭配的是一台服务器。拉取consul 镜像后,通过docker来启动:
sudo docker run -d -p 8500:8500 --restart=always --name=consul consul:latest agent -server -bootstrap -ui -node=1 -client=‘0.0.0.0’
命令说明
-p8500:8500 端口映射:前表示主机部分,:后表示容器部分。
-restart=always 重启方式:表示docker会自动重启该容器
–name=consulconsul:latest 指定该容器名称,查看和进行操作都比较方便。
agent 启动 Agent 进程
-server启动 Consul Server 模式
-bootstrap表示这个节点是 Server-Leader 。
-ui启动 Web UI 管理器 可访问8500查看
-node 节点名称集群中必须是唯一的,默认是该节点的主机名。
-client启动 Consul Cilent 模式consul服务侦听地址 提供HTTP、DNS、RPC等服务默认是127.0.0.1对外提供服务改成0.0.0.0
成功启动后,浏览器输入 http://192.168.x.xxx:8500/ui查看
可以在Key/Value中添加所需要的配置,这里创建格式为yaml
接下来需要代码去监听consul配置的数据变化,在做出更改时,能够及时返回最新的数据。
package main
import (
"bytes"
"fmt"
"log"
"time"
consulapi "github.com/hashicorp/consul/api"
"github.com/hashicorp/consul/api/watch"
"github.com/spf13/viper"
_ "github.com/spf13/viper/remote"
var (
defaultConfig *viper.Viper
consulAddress string
consulPath string
func initConfig() *viper.Viper {
consulAddress = "http://192.168.2.xxx:8500"
consulPath = "config/local"
defaultConfig = viper.New()
defaultConfig.SetConfigType("yaml")
consulClient, err := consulapi.NewClient(&consulapi.Config{Address: consulAddress})
if err != nil {
log.Fatalln("consul连接失败:", err)
kv, _, err := consulClient.KV().Get(consulPath, nil)
if err != nil {
log.Fatalln("consul获取配置失败:", err)
err = defaultConfig.ReadConfig(bytes.NewBuffer(kv.Value))
if err != nil {
log.Fatalln("Viper解析配置失败:", err)
go watchConfig()
return defaultConfig
func watchConfig() {
time.Sleep(time.Second * 10)
params := make(map[string]interface{})
params["type"] = "key"
params["key"] = consulPath
w, err := watch.Parse(params)
if err != nil {
log.Fatalln(err)
w.Handler = func(u uint64, i interface{}) {
kv := i.(*consulapi.KVPair)
hotconfig := viper.New()
hotconfig.SetConfigType("yaml")
err = hotconfig.ReadConfig(bytes.NewBuffer(kv.Value))
if err != nil {
log.Fatalln("Viper解析配置失败:", err)
defaultConfig = hotconfig
err = w.Run(consulAddress)
if err != nil {
log.Fatalln("监听consul错误:", err)
func GetConfig() *viper.Viper {
if defaultConfig == nil {
defaultConfig = initConfig()
return defaultConfig
func main() {
ReadOne()
go func() {
for {
color := GetConfig().GetString("config.color")
fmt.Println("color===", color)
time.Sleep(time.Second * 10)
}()
select {}
func ReadOne() {
runtimeConfig := viper.New()
runtimeConfig.AddRemoteProvider("consul", "http://192.168.2.xxx:8500", "config/local")
runtimeConfig.SetConfigType("yaml")
err := runtimeConfig.ReadRemoteConfig()
if err != nil {
log.Fatalln("viper read:", err)
err = runtimeConfig.WatchRemoteConfigOnChannel()
if err != nil {
log.Fatalln("viper watch err:", err)
go func() {
for {
price := runtimeConfig.GetString("config.price")
fmt.Println("price:", price)
time.Sleep(time.Second * 10)
}()
执行打印出来可以看到,成功获取到consul中配置的数据。
Consul 是用于分布式系统服务发现与配置,内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案。Consul是使用Go语言编写的,使用很方便。有个需求,配置文件里面的参数经常会调整,变动后需要实时获取,今天来实现监听consul中key/value 数据的变化。在ubuntu安装consul并配置启动服务,$ wget https://releases.hashicorp.com/consul/1.2.0/consul_1.2.0_linux_amd64.z
golang服务发现
这是将golang服务集成到Consul的简单示例。 此回购涵盖了golang服务如何向Consul注册其自身,如何在服务需要调用另一个服务时发现服务,提供Consul将要使用的运行状况检查api以及获取我们在Consul UI中填充并由Consul使用的键值(KV)存储区golang服务。
确保docker已经安装在您的机器上
更改目录以进行部署
docker-compose-build
码头工人组成
领事-kv
已弃用请改用。 该软件包的 Godocs。
这个包提供了consulkv包,它是 Consul 的键/值客户端。 它支持 Consul 0.1 的所有命令,并且有一个非常简单的 API。
完整的文档可在上
以下是使用 Consul KV 客户端的示例:
client , _ := consulkv . NewClient ( consulkv . DefaultConfig ())
key := "foo"
value := [] byte ( "test" )
client . Put ( key , value , 42 )
meta , pair , err := client . Get ( key )
fmt . Printf ( "Got %s (%d): %s" , pair . Key , pair . Flags , pair . Valu
删除nodejs和git运行时依赖项
配置是从本地获取的,而不是从Consul K / V获取的
事务原子性意味着密钥集完全或根本不存储。 除原子性外,KV API调用的数量也受到限制。 但是,由于Consul事务终结点只能处理有效负载中的64个项目,因此存在未决。 事务以64个元素的块执行。
git2consul-go有两个变体:
作为单个二进制文件,下载后可以放置在任何工作目录中-可以在工作站上(将从中执行git2consul)或在Consul节点上(取决于是否可以从Consul节点访问git存储库)
作为可以在用户工作站上构建的源代码( )
简单示例用法。
$ git2consul -config config.json -basic -user mygituser -passw
继1年前的系列文章《GO语言实现redis客户端》之后,几乎就没怎么碰过Golang这门语言了,在云原生时代,go语言无疑是无可替代的。近期,我们顺手把go语言重新捡起来,边写边学,手撸一个数据配置中心玩玩。笔者的习惯是,不喜欢在自己文章中赘述别人已经讲的很好的东西了,所以关于什么是数据配置中心?配置中心的作用和意义、以及当下热门的产品等话题,请移步这里(文章讲的很好):https://developer.51cto.com/art/202102/645471.htm
直接上代码,先考虑一下初步的设计..
MangoConfig配置管理包
github地址:https://github.com/gly-hub/mangoconfig
mangoconfig配置服务用于服务器配置修改,在服务器启动或部署中可能存在配置信息更新情况,
某些情况需要重启服务从而重新初始化某些服务,例如mysql初始化、redis初始化等。mangoconfig包
提供了修改内存配置及重启初始化方法等功能。能够满足小部分需求,相较于现有的配置中心,功能更
golang
server端
将存储在 consul 的 kv 存储中的数据用于需要比每次执行 HTTP 往返都更快的操作是很常见的。
对于那些时候,有 Consul KV 缓存。
它的 BackgroundUpdate 功能使用监视功能自动保持本地数据地图同步。
现在,对于在前缀下仍然存在其他条目的已删除键,consul 不会触发递归监视。
为了解决这个限制,KV 缓存使用一个叫做__sync的特殊键。 如果 watch 为基本名称为__sync的键触发,那么缓存将完全从 consul 重新填充。
此外,在缓存上使用 Delete 函数将设置__sync以便其他地方的其他缓存知道执行数据的完整重新读取。
params := map[string]interface{}{}
params["type"] = "key"
params["key"] = "path/to/leader/key"
plan, err := watch.Parse(params)
if err != nil {
// 错误处理
// 当所监视的key发生任何更改时调用该handler函数
plan.Handler = handler
// 阻塞调用,因此这
首先,你需要连接到 MySQL 数据库,可以使用 Go 语言标准库中的 `database/sql` 包来连接数据库。然后,可以使用 MySQL 的 binlog 来监听数据库的变化。这可以通过使用 Go 语言的 MySQL 驱动来实现,例如 `go-mysql-driver` 包。
具体来说,你可以使用 `SHOW BINARY LOGS` 命令查询 MySQL 服务器上的 binlog 文件列表。然后,可以使用 `START SLAVE` 命令启动 MySQL 复制,并使用 `SHOW SLAVE STATUS` 命令查询复制的状态。这样就可以监听到 MySQL 数据库的变化了。
需要注意的是,这种方法只能监听到数据库的 DML(数据操纵语言)操作,例如 INSERT、UPDATE 和 DELETE,不能监听到 DDL(数据定义语言)操作,例如 CREATE TABLE 和 ALTER TABLE。