加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Golang 读取写入Etcd数据库

发布时间:2020-12-16 19:17:26 所属栏目:大数据 来源:网络整理
导读:原文出处:个人博客地址:http://www.damonyi.cc/?p=194 项目中用到Etcd数据库来存储容器的信息和应用的域名信息,将操作Etcd的golang代码整理了一下 1、将Container信息写入到指定目录 c,err := common.GetEtcdClient()if err != nil {beego.Error("get etc

原文出处:个人博客地址:http://www.damonyi.cc/?p=194

项目中用到Etcd数据库来存储容器的信息和应用的域名信息,将操作Etcd的golang代码整理了一下

1、将Container信息写入到指定目录

c,err := common.GetEtcdClient()
	if err != nil {
		beego.Error("get etcd client failed")
		return
	}
	kapi := client.NewKeysAPI(c)
	key := getSkyDnsDomain(domainEtcd.Domain)
	value,_ := json.Marshal(domainEtcd)
	var etcderr error
	common.HaproxyTemplateCache.Lock.Lock()
	defer common.HaproxyTemplateCache.Lock.Unlock()

	switch domainEtcd.Action {
	case "add":
		_,etcderr = kapi.Create(context.Background(),key,string(value))
		common.HaproxyTemplateCache.Data[domainEtcd.Domain] = &models.HaproxyConfigration{
			DomainEtcd: domainEtcd,}
	case "delete":
		_,etcderr = kapi.Delete(context.Background(),&client.DeleteOptions{})
		delete(common.HaproxyTemplateCache.Data,domainEtcd.Domain)
	}
	if etcderr != nil {
		beego.Error("updatecontainer event erro",etcderr)
	}

2、读取Etcd的缓存数据 example,只获取其中的非目录信息

func loadHaproxyTemplateCache() { HaproxyTemplateCache.Lock.Lock() defer HaproxyTemplateCache.Lock.Unlock() HaproxyTemplateCache.Data = make(map[string]*models.HaproxyConfigration) client1,_ := GetEtcdClient() api := client.NewKeysAPI(client1) /*set skydns domain info*/ res,err1 := api.Get(context.Background(),"/skydns/local",&client.GetOptions{Recursive: true}) if err1 != nil { beego.Error("get /dockerstack info failed") return } skydnsNodesInfo := make(map[string]string) getAllNode(res.Node,skydnsNodesInfo) var domain models.DomainEtcd for _,domainStr := range skydnsNodesInfo { json.Unmarshal([]byte(domainStr),&domain) HaproxyTemplateCache.Data[domain.Domain].DomainEtcd = &domain } /*set dockerstack container info*/ res,err1 = api.Get(context.Background(),"/dockerstack",&client.GetOptions{Recursive: true}) if err1 != nil { beego.Error("get /dockerstack info failed") return } dockerstackNodesInfo := make(map[string]string) getAllNode(res.Node,dockerstackNodesInfo) var container models.ContainerEtcd for _,containerStr := range skydnsNodesInfo { json.Unmarshal([]byte(containerStr),&container) HaproxyTemplateCache.Data[domain.Domain].Containers[container.ContainerId] = &container } } func getAllNode(rootNode *client.Node,nodesInfo map[string]string) { if !rootNode.Dir { nodesInfo[rootNode.Key] = rootNode.Value return } for node := range rootNode.Nodes { getAllNode(rootNode.Nodes[node],nodesInfo) } }

附 etcd存储的数据结构信息:

//the container info in etcd type ContainerEtcd struct { HostIp string HostPort int64 Domain string ContainerId string ContainerIp string ContainerPort int64 Action string } //domain info in etcd type DomainEtcd struct { Port int64 Host string Domain string Action string } type HaproxyConfigration struct { DomainEtcd *DomainEtcd Containers map[string]*ContainerEtcd } type HaproxyTemplateCache struct { Data map[string]*HaproxyConfigration Lock sync.RWMutex }

本文只是想提供一些代码参考,业务内容就不细讲了。。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读