Go consul获取KV

1.简单实现

package main

import (
        "encoding/json"
        "fmt"
        consulapi "github.com/hashicorp/consul/api"
        "log"
        //_ "github.com/spf13/viper/remote"
)

var (
        cloudEntryURL =  "cloud_entry/openstack/"
        resourceURL   =  "cmp/resource/yacmp:cloudentry:type:openstack/iaas.machine/"
)

type cloudEntryValue struct {
        authInfo     map[string]string
        resourceInfo map[string]map[string]string
}

func translate(m map[string]interface{}) map[string]string {
        ret := make(map[string]string, len(m))
        for k, v := range m {
                ret[k] = fmt.Sprint(v)
        }
        return ret
}

func listResources(address string) (cloudEntry, cloudResource consulapi.KVPairs) {
        config := consulapi.DefaultConfig()
        config.Address = address
        client, err := consulapi.NewClient(config)
        if err != nil {
                log.Fatal("consul client error : ", err)
        }
        cloudEntry, _, _ = client.KV().List(cloudEntryURL, nil)
        cloudResource, _, _ = client.KV().List(resourceURL, nil)
        return
}

func getResourceCollection(address string) map[string]*cloudEntryValue {
        resourceCollection := make(map[string]*cloudEntryValue)
        cloudEntry, cloudResource := listResources(address)
        for _, value := range cloudEntry {
                var cloudEntryValue = new(cloudEntryValue)
                var entryInfos = make(map[string]string)
                if value.Value == nil {
                        continue
                }
                err := json.Unmarshal(value.Value, &entryInfos)
                if err != nil {
                        log.Fatal("unmarshal json from consul error : ", err)
                }
                if _, ok := resourceCollection[entryInfos["cloud_entry_id"]]; ok {
                        continue
                }
                fmt.Println(resourceCollection,"resourceCollection")
                cloudEntryValue.authInfo = entryInfos
                cloudEntryValue.resourceInfo = make(map[string]map[string]string)
                resourceCollection[entryInfos["cloud_entry_id"]] = cloudEntryValue
        }
        for _, value := range cloudResource {
                var resources map[string]interface{}
                if value.Value == nil {
                        continue
                }
                err := json.Unmarshal(value.Value, &resources)
                if err != nil {
                        log.Fatal("unmarshal json from consul error : ", err)
                }
                if _, ok := resourceCollection[resources["cloud_entry_id"].(string)]; ok {
                        if cmpInfos, ok := resources["resources"]; ok {
                                cmpInfo := cmpInfos.([]interface{})[0].(map[string]interface{})
                                if instanceInfo, ok := cmpInfo["cmp_info"]; ok {
                                        key := instanceInfo.(map[string]interface{})["external_name"].(string)
                                        value := translate(instanceInfo.(map[string]interface{}))
                                        cloudEntry := resourceCollection[resources["cloud_entry_id"].(string)]
                                        cloudEntry.resourceInfo[key] = value
                                }
                        }
                }
        }
        return resourceCollection
}


func main(){
        consulAddress := "http://47.98.136.126:8500"
        res:=getResourceCollection(consulAddress)
        for k,v:=range res{
                fmt.Println(k,v)
                fmt.Println("id",v.authInfo["cloud_entry_id"])
                for k,v:=range v.resourceInfo{
                        fmt.Println("k",k)
                        fmt.Println("v",v["zone"])
                }
        }


}