添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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。