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
}

etcd3安装和配置

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

etcd3集群部署

部署环境 主机名 IP 操作系统 node201 10.0.0.201 centos 7.3 64位 node202 10.0.0.202 centos 7.3 64位 node2...

分布式系统基石etcd

目录简介 分布式系统 为何选择go实现 优势 核心—-Raft协议 etcd3特性 安装使用简介     —-Distributed reliable key-value store fo...

利用ACE日志策略进行日志运行时配置管理

为什么要使用ACE日志策略?       因为使用ACE日志策略可以使我们以配置的方式对日志输出进行管理更为重要的是,其利用配置参数可以控制日志输出中的各种问题, 如:可以配置当应用的日志文件到达指定...

zookeeper学习-2(如何使用zookeeper进行配置管理-java版本)

如何使用zookeeper进行配置管理

结合Commons Configuration和Maven进行工程配置管理

本文源自目前公司中对一些项目的总结。 实际问题:每个工程都会包含多套配置环境,包括开发环境,测试环境,沙盒环境以及生产环境,而每一套环境都对应着不同的配置参数。 本文以一个非web工程举例...

TeamForge使用笔记3-配置管理

SCM配置管理TeamForge集成了Git,Svn , CVS三种版本控制系统,管理员可以设置版本控制系统的地址端口等信息。 其中 Publishing是TeamForge创建项目时自动创建的...

3GPP配置管理(Configuration Management,CM)概要

 1.网元管理(Element Manager ,EM): 为终端用户提供管理一系列类型相关网元功能,这些功能主要分为如下两个重要类别:(1).网元管理功能:管理单个网元,这种通过本地终端管理网元的功...

ZooKeeper 笔记(3) 实战应用之【统一配置管理】

原文出自:http://www.cnblogs.com/yjmyzz/p/4604947.html 大型应用通常会按业务拆分成一个个业务子系统,这些大大小小的子应用,往往会使用一些公用的资源...

LVS技术浅析-配置管理3

上一篇《配置管理2》,我们介绍了如何利用keepalived来部署LVS; 本文将介绍一些LVS配置的注意点,以及 性能相关的一些配置; 1. SH调度算法-尽量不要采用     一些业务为了...
  • VMA_LMA
  • VMA_LMA
  • 2014年09月19日 16:39
  • 430
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:etcd3进行配置管理
举报原因:
原因补充:

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