這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
原文出處:個人部落格地址: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 errorcommon.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.DomainEtcdfor _, 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.ContainerEtcdfor _, 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.Valuereturn}for node := range rootNode.Nodes {getAllNode(rootNode.Nodes[node], nodesInfo)}}
附 etcd儲存的資料結構資訊:
//the container info in etcdtype ContainerEtcd struct {HostIp stringHostPort int64Domain stringContainerId stringContainerIp stringContainerPort int64Action string}//domain info in etcdtype DomainEtcd struct {Port int64Host stringDomain stringAction string}type HaproxyConfigration struct {DomainEtcd *DomainEtcdContainers map[string]*ContainerEtcd}type HaproxyTemplateCache struct {Data map[string]*HaproxyConfigrationLock sync.RWMutex}
本文只是想提供一些代碼參考,業務內容就不細講了。。