etcd3进行配置管理

原创 2016年08月30日 17:48:19

最近在用golang 做一个系统,里面有一个需求是可以随时暂停某项功能,这个涉及到运行时动态改变配置。首先配置写死在代码中,是绝对不可能实现这个需求的,每次从数据获取,虽说可以解决这个问题,但是耗时,每次请求都要去查数据库。有人会说引入缓存保存从数据库查询的值,定时去同步数据中的值到缓存。这是一个可行的办法,但是用etcd3的watcher会达到更加高效,优雅。etcd是一个高可用的键值存储系统,主要用于共享配置和服务发现.。 etcd 里面有个watcher 可以监视某个key, 如果key中的value有改变,会监听到这个改变事件,然后刷新etcd种的最新版本到本地缓存。下面上代码分析:

const(

    etcdKey = "/prod/xxx/config"  // 缓存的key,也是watcher监听的key
)

var (

    ....................................

   .....................................

    confVals     map[string]interface{} // 配置的本地缓存,防止etcd宕机,也不影响业务,当watcher监听的key的value变化,会刷新缓存到这个map中。
    lock         sync.RWMutex  // 读写锁
)
 
// 启动etcd
func start() {
    .............
    cli, err := clientv3.New(clientv3.Config{
        Endpoints:   parseEndpoints(*etcdEndpoints),
        DialTimeout: time.Duration(*etcdDialTimeout) * time.Second,
    })
    ...........
    defer cli.Close()

    if err := fetchConfig(cli); err != nil {
       glog.Errorf("Fail to fetchConfig from etcd3")
    }

    watchConfigChanges(cli)
}
 
// 解析etcd 配置

func parseEndpoints(csv string) []string {
    eps := []string{}
    for _, v := range strings.Split(csv, ",") {
        if v != "" {
            eps = append(eps, v)
        }
    }
 
   return eps
}
 

func fetchConfig(cli *clientv3.Client) error {
    ctx, cancel := context.WithTimeout(context.Background(), time.Duration(*etcdOpTimeout)*time.Millisecond)
    resp, err := cli.Get(ctx, etcdKey)
    cancel()
    if err != nil {
        return err
    }

    for _, kv := range resp.Kvs {
 
        if err := updateConfigVals(kv.Value); err != nil {
            return err
        }
 
    break
    }

    return nil
}
 
// watcher 监听指定的key, key 发送变化更新confVals

func watchConfigChanges(cli *clientv3.Client) {
    rch := cli.Watch(context.Background(), etcdKey)
    for wresp := range rch {
        for _, ev := range wresp.Events {
            if string(ev.Kv.Key) != etcdKey || ev.Type != mvccpb.PUT {
                continue
            }

            if err := updateConfigVals(ev.Kv.Value); err != nil {
                glog.Errorf("Failed to update config values, %+v", err)
            }
            break
        }
    }
}
 

func updateConfigVals(b []byte) error {

    m := map[string]interface{}{}
    '''''''''''
    '''''''''''
    更新confVals
    (&lock).Lock()
    confVals = m

    return nil
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Unsolicited response received on idle HTTP channel starting with "[]\n"; err=<nil>

最近在用 golang 开发一个项目, 项目用的是 iris 这个web框架。 我们的这个项目是用golang 实现的ADX (AD EXCHNAGE), 说白了就是一个广告的开关,说白了就是移动端请...

tomcat8 大量 http-nio 线程阻塞在waiting to lock <0x00000000feb52cf0> (a org.apache.coyote.AbstractProtocol$

最近线上应用发生了OOM , 该应用是部署在tomact8上, 发生OOM后,运维打印了线程dump和内存dump。 当时,第一反义就觉得都OOM了,打印的线程dump 和内存dump 应该不可靠,但...

etcd3安装和配置

etcd 是一个高可用的 Key/Value 存储系统,主要用于分享配置和服务发现。etcd 的灵感来自于 ZooKeeper 和 Doozer, 侧重于: 简单:支持 curl 方式的用户 AP...

史上最简单的SpringCloud教程 | 第十三篇: 断路器聚合监控(Hystrix Turbine)

上一篇文章讲述了如何利用Hystrix Dashboard去监控断路器的Hystrix command。当我们有很多个服务的时候,这就需要聚合所以服务的Hystrix Dashboard的数据了。这就...
  • forezp
  • forezp
  • 2017-04-18 21:54
  • 14016

史上最简单的SpringCloud教程 | 第七篇: 高可用的分布式配置中心(Spring Cloud Config)

当服务很多时,都需要同时从配置中心读取文件的时候,这时我们可以考虑将配置中心做成一个微服务,并且将其集群化,从而达到高可用,架构图如下:一、准备工作继续使用上一篇文章的工程,创建一个eureka-se...
  • forezp
  • forezp
  • 2017-04-10 21:24
  • 72251

史上最简单的SpringCloud教程 | 第十篇: 高可用的服务注册中心

文章 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka) 介绍了服务注册与发现,其中服务注册中心Eureka Server,是一个实例,当成千上万个服务向它注册...
  • forezp
  • forezp
  • 2017-04-15 11:55
  • 62055

史上最简单的SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)

Spring Cloud Bus 将分布式的节点和轻量的消息代理连接起来。这可以用于广播配置文件的更改或者其他的管理工作。一个关键的思想就是,消息总线可以为微服务做监控,也可以作为应用程序之间相互通讯...
  • forezp
  • forezp
  • 2017-04-12 22:15
  • 71875

史上最简单的SpringCloud教程 | 第十二篇: 断路器监控(Hystrix Dashboard)

在我的第四篇文章断路器讲述了如何使用断路器,并简单的介绍了下Hystrix Dashboard组件,这篇文章更加详细的介绍Hystrix Dashboard。一、Hystrix Dashboard简介...
  • forezp
  • forezp
  • 2017-04-17 23:01
  • 15424

史上最简单的 SpringCloud 教程 | 第十四篇: 服务注册(consul)

这篇文章主要介绍 spring cloud consul 组件,它是一个提供服务发现和配置的工具。consul具有分布式、高可用、高扩展性。一、consul 简介consul 具有以下性质:服务发现:...
  • forezp
  • forezp
  • 2017-04-19 21:37
  • 17860

etcd3集群部署

部署环境 主机名 IP 操作系统 node201 10.0.0.201 centos 7.3 64位 node202 10.0.0.202 centos 7.3 64位 node2...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)