大佬教程收集整理的这篇文章主要介绍了Golang 读取写入Etcd数据库,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
原文出处:个人博客地址:http://www.damonyi.cc/?p=194
项目中用到Etcd数据库来存储容器的信息和应用的域名信息,将操作Etcd的golang代码整理了一下
1、将Container信息写入到指定目录
c,err := common.GetEtcdClient() if err != nil { beego.Error("get etcd client @R_403_1488@") 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 @R_403_1488@") 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 @R_403_1488@") 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 }
以上是大佬教程为你收集整理的Golang 读取写入Etcd数据库全部内容,希望文章能够帮你解决Golang 读取写入Etcd数据库所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。