# kratos_etcd_watch **Repository Path**: huoyingwhw/kratos_etcd_watch ## Basic Information - **Project Name**: kratos_etcd_watch - **Description**: kratos_etcd_watch - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2023-06-04 - **Last Updated**: 2024-04-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 博客地址 [kratos中使用etcdWatch介绍](https://www.cnblogs.com/paulwhw/p/17463183.html) ## 在kratos中使用EtcdWatch etcd是一个分布式的键值存储系统,用于在分布式系统中保存和管理数据。etcd提供了一种机制,称为"watch" ,它允许客户端监视指定的键空间,并在键的值发生更改时接收通知。以下是一些etcd watch在实际中使用的例子: 配置管理:在分布式系统中,可以使用etcd作为配置存储。多个服务可以监视相同的配置键,当配置更改时,etcd会发送通知给所有监视该键的服务,以便它们可以重新加载配置并应用更改。 服务发现:etcd可以用作服务发现机制。当新的服务实例加入系统或现有服务实例从系统中移除时,etcd可以发送通知给订阅了相应键的客户端。这样,客户端可以动态地更新服务的可用列表,以便进行负载均衡或其他相关操作。 分布式锁:etcd可以用于实现分布式锁。多个进程可以监视同一个键,并尝试创建临时顺序节点。只有成功创建节点的进程才能获得锁。其他进程可以通过监视节点的变化来等待锁的释放,并在锁可用时再次尝试创建节点。 配置更新:某些应用程序可能需要动态更改其行为。通过使用etcd watch机制,应用程序可以监视特定的配置键,并在其值更改时接收通知。这样,应用程序可以即时更新自身的配置,而无需重新启动。 负载均衡:在负载均衡方案中,etcd可以用于存储服务实例的健康状态。负载均衡器可以监视这些键,并根据服务实例的可用性进行流量分发。当服务实例的健康状态发生变化时,etcd会发送通知给负载均衡器,以便它可以相应地调整流量分发策略。 这些只是etcd watch在实际中的一些例子,实际应用场景非常广泛。etcd watch机制提供了一种强大的方式来实时监视和响应键值存储中的变化,使得分布式系统更加灵活和可靠。 ## 包含功能 - 使用带cancel的ctx初始化etcdWatcher,wire依赖注入的时候返回clean函数,clean函数中执行取消ctx的cancel方法 - tests目录中有etcd的增删改查以及一个简单的etcdWatch监视器的实现 - tests目录中有kratos封装好的etcd操作的例子 - 初始化:MySQL、Redis、rockscache、etcdRegistry - **使用原生etcd的API实现watch功能,并且使用sync.Map将数据存到本地** - **使用kratos封装的etcdAPI实现watch功能,并且使用atomic.Value将数据存到本地** ### 注意防止goroutine泄漏 #### 使用kratos封装好的API需要自己手动监听ctx.Done() - 在**biz/etcdWatchKratos.go**中开启新的协程去watch,需要注意如果项目停掉了要cancel掉etcdWatch的ctx不让子协程继续watch了! - etcdWatch使用自己的ctx,注意在biz层New的时候使用自己的ctx,并且需要返回一个cleanFunc,当程序结束的时候cancel掉ctx,select语句中`return nil` ,子协程中的死循环退出,保证不再继续Watch了 #### 使用原生的那个API不需要手动监听ctx.Done() - 在**biz/etcdWatchOrigin.go**中,e.watcher.Watch方法内部自己维护了ctx,如果项目停掉的话在封装好的方法内部会自动捕获到ctx.Done(),监听的协程也已经停止了 ### 使用原生etcd并用sync.Map存储的方式 项目中既有使用原生方法封装的watch也有使用kratos自带的watch,但是实际能运行的是使用了kratos自带的watch,如果想要用原生封装的查看一下使用sync.Map存储的方式,可以注释掉biz/lottery.go中的92到105行并打开81到89行。同时记得注释掉biz/etcdWatchKratos.go中的76到81行,打开biz/etcdWatchOrigin.go中的48到53行,注释掉data/lottery.go中UpsertLottery方法的第155行并打开158行。