分布式学习十二:zookeeper实现数据订阅/发布

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 分布式学习十二:zookeeper实现数据订阅/发布

数据订阅/发布

在分布式集群中,假设数据库发生了改动,就得修改所有分布式服务的数据库配置

我们可以通过zookeeper来实现数据库配置的订阅发布

我们先初始化数据库配置项环境

在zookeeper配置以下数据

\[zk: localhost:2181(CONNECTED) 51\] get /config-server/app1/database
{"Host":"127.0.0.1:3300","User":"root","Password":"233274","Database":"test"}

go代码环境准备

引入

github.com/go-zookeeper/zk

go.mod内容为:

module zkStudy
go 1.17
require (
   github.com/go-sql-driver/mysql v1.6.0
   github.com/go-zookeeper/zk v1.0.2
   github.com/jmoiron/sqlx v1.3.4
)

发布数据库配置

我们只需要set path,在zk中将自动把数据发布到订阅此目录的客户端中

以下代码,每2秒更改一次数据库数据

func loopChangeDbConfig()  {
   var dbConfig = config.DatabaseConfig{Host: "127.0.0.1:3300",User: "root",Password: "123456",Database: "test"}
   t := time.NewTicker(2 * time.Second)
   for {
      select {
      case <-t.C:
         dbConfig.Password=strconv.Itoa(rand.Intn(999999)+100000)
         jsonByte,_ := json.Marshal(dbConfig)
         _,err := zkConnect.Set(databaseZKPath,jsonByte,-1)
         if err!=nil {
            fmt.Println("zk set dbConfig path err :", err)
            return
         }
      }
   }
}

订阅数据库配置

通过zk.getW方法,获取数据并返回一个event单向通道,通过此通道可监听获取一条事件更改数据:

func getDatabaseConfig() <-chan zk.Event {
   //listen mysql-config path
   jsonStrByte, _, event, err := zkConnect.GetW(databaseZKPath)
   if err != nil {
      panic(err)
   }
   _ = json.Unmarshal(jsonStrByte, &databaseConfig)
   fmt.Printf("%+v 123\\n", databaseConfig)
   return event
}

获取到event之后,新开协程,进行阻塞获取通道,当获取到数据后,重新获取配置并继续获取一个通道监听数据

func listenDBConfigChange(event <-chan zk.Event) {
   var e zk.Event
   for {
      e = <-event
      //if node data change,db reconnect
      if e.Type == zk.EventNodeDataChanged {
         fmt.Printf("node data changed: %s, \\n",e.Path)
         event = getDatabaseConfig()
         err := db.Close()
         if err != nil {
            panic(err)
         }
         connectDb()
         dbTest()
      }
   }
}

运行结果:

image.png

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
14天前
|
存储 SpringCloudAlibaba Java
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论。
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
|
2月前
|
存储 运维 NoSQL
分布式读写锁的奥义:上古世代 ZooKeeper 的进击
本文作者将介绍女娲对社区 ZooKeeper 在分布式读写锁实践细节上的思考,希望帮助大家理解分布式读写锁背后的原理。
|
2月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
46 5
|
3月前
|
存储 负载均衡 监控
dubbo学习一:zookeeper与dubbo的关系,下载安装启动zookeeper(解决启动中报错)
这篇文章是关于Apache Dubbo框架与Zookeeper的关系,以及如何下载、安装和启动Zookeeper的教程,包括解决启动过程中可能遇到的报错问题。
116 3
dubbo学习一:zookeeper与dubbo的关系,下载安装启动zookeeper(解决启动中报错)
|
2月前
|
存储 缓存 算法
分布式缓存有哪些常用的数据分片算法?
【10月更文挑战第25天】在实际应用中,需要根据具体的业务需求、数据特征以及系统的可扩展性要求等因素综合考虑,选择合适的数据分片算法,以实现分布式缓存的高效运行和数据的合理分布。
|
3月前
|
JSON 分布式计算 前端开发
前端的全栈之路Meteor篇(七):轻量的NoSql分布式数据协议同步协议DDP深度剖析
本文深入探讨了DDP(Distributed Data Protocol)协议,这是一种在Meteor框架中广泛使用的发布/订阅协议,支持实时数据同步。文章详细介绍了DDP的主要特点、消息类型、协议流程及其在Meteor中的应用,包括实时数据同步、用户界面响应、分布式计算、多客户端协作和离线支持等。通过学习DDP,开发者可以构建响应迅速、适应性强的现代Web应用。
|
3月前
|
监控 Dubbo Java
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
这篇文章详细介绍了如何将Spring Boot与Dubbo和Zookeeper整合,并通过Dubbo管理界面监控服务注册情况。
209 0
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
|
3月前
|
分布式计算 NoSQL Java
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
63 2
|
3月前
|
分布式计算 Java Hadoop
Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
81 1
|
3月前
|
分布式计算 Hadoop
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
64 1