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
  • 4907

etcd3集群部署

部署环境 主机名 IP 操作系统 node201 10.0.0.201 centos 7.3 64位 node202 10.0.0.202 centos 7.3 64位 node2...
  • chenhaifeng2016
  • chenhaifeng2016
  • 2017年05月03日 14:28
  • 2286

分布式系统基石etcd

目录简介 分布式系统 为何选择go实现 优势 核心—-Raft协议 etcd3特性 安装使用简介     —-Distributed reliable key-value store fo...
  • yeyincai
  • yeyincai
  • 2016年09月24日 18:35
  • 4243

ETCD3 和 ETCD2 性能比较

Server ETCD2 ETCD3 ETCD2 1.698331852s = 1698.331852ms error ETCD3 20.87944695s = 20879....
  • leftwukaixing
  • leftwukaixing
  • 2017年10月16日 18:24
  • 239

etcd3进行配置管理

最近在用golang 做一个广告竞价系统,里面有一个需求是可以随时暂停某些广告商的广告,这个涉及到运行时动态改变配置。首先配置写死在代码中,是绝对不可能实现这个需求的,每次从数据获取,虽说可以解决这个...
  • nature502
  • nature502
  • 2016年08月30日 17:48
  • 1727

Kubernetes系统常见运维技巧

本文节选自龚正等编著的《Kubernetes权威指南》,该节主要对常用的Kubernetes系统运维操作和技巧进行详细说明。...
  • horsefoot
  • horsefoot
  • 2016年06月06日 13:23
  • 6224

如何做好配置管理 配置管理的三大误区

随着软件系统的日益复杂化和用户需求、软件更新的频繁化,配置管理逐渐成为软件生命周期中的重要控制过程,在软件开发过程中扮演着越来越来重要的角色。一个好的配置管理过程能覆盖软件开发和维护的各个方面,同时对...
  • java211
  • java211
  • 2013年08月29日 15:05
  • 3854

svn配置管理

转自:http://www.cnblogs.com/MeteorSeed/archive/2012/08/14/2604185.html 目录 一 概述 二 变更控制 三 ...
  • u011391839
  • u011391839
  • 2014年03月12日 16:00
  • 2393

使用 etcdctl

http://www.phperz.com/article/15/0922/158727.html 发布于 2015-09-22 23:32:56 | 626 次阅读 | 评论: 0 | 来源: 网...
  • drcwr
  • drcwr
  • 2016年10月08日 11:38
  • 753

kubernetes 集群的安装部署

kubernetes 集群的安装部署 本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 首先kube...
  • u014642915
  • u014642915
  • 2017年05月27日 13:48
  • 764
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:etcd3进行配置管理
举报原因:
原因补充:

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