Go   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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,请注明来意。