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 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 } 本文只是想提供一些代码参考,业务内容就不细讲了。。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |