原文出处:个人博客地址: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(), key, &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
}
本文只是想提供一些代码参考,业务内容就不细讲了。。