Golang 讀取寫入Etcd資料庫

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

原文出處:個人部落格地址: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}

本文只是想提供一些代碼參考,業務內容就不細講了。。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.