【Golang】Nacos用户名密码拉取所有配置
背景:项目模块太多,对应nacos配置yml太多,每次查找配置项登录nacos,一个一个点开查看太麻烦,干脆一次性把nacos帐号下所有配置都拉下来放到项目根目录下,借助idea搜索非常方便查看了;
# 为全局搜索nacos配置而生# 使用方法, 下载该工程, 执行以下命令就会生成./nacos nacos.xxx-company.com 用户名 密码# 会把该nacos下所有配置文件拉取下来
工具源码如下:
package mainimport ("encoding/json""fmt""io/ioutil""net/http""net/url""os")func main() {args := os.Argsfmt.Println(len(args), args[1], args[2], args[3])if len(args) != 4 {fmt.Println("输入参数不等于3, 请重新输入[./nacos 用户名 密码 域[nacos.xxx.com]] 返回.")return}fmt.Println("开始生成...")username := args[2]password := args[3]domain := args[1]fmt.Println("开始获取token...")token := getToken(domain, username, password)fmt.Println("获取token结束...")fmt.Println("开始获取ns...")namespace := getNss(token, domain)fmt.Println("结束获取ns...")fmt.Println("开始生成yml...")GenerateYml(namespace, token, domain)fmt.Println("结束生成yml...")}func GenerateYml(namespace []*NameSpaceData, token string, domain string) {for i := 0; i < len(namespace); i++ {tenant := namespace[i].NamespacenamespaceShowName := namespace[i].NamespaceShowNameconfigListNameDir := "./" + namespaceShowNameos.RemoveAll(configListNameDir)os.Mkdir(configListNameDir, os.ModePerm)pageItems := getYmlList(token, tenant, domain)for j := 0; j < len(pageItems); j++ {pageItem := pageItems[j]dataId := pageItem.DataIdyml := configListNameDir + "/" + dataIdcontent := pageItem.Contentf, _ := os.Create(yml)f.Write([]byte(content))f.Close()}}}func getYmlList(accessToken string, tenant string, domain string) []*PageItem {client := &http.Client{}resp, err := client.Get(domain + "/nacos/v1/cs/configs?dataId=&group=&appName=&config_tags=&pageNo=1&pageSize=10&tenant=" + tenant + "&search=accurate&accessToken=" + accessToken)defer resp.Body.Close()body, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Println(err)}var r ConfigListerrNS := json.Unmarshal([]byte(string(body)), &r)if errNS != nil {fmt.Println("parse ns json err")}return r.PageItems}func getToken(domain string, username string, password string) string {targetUrl := domain + "/nacos/v1/auth/login"payload := url.Values{"username": {username}, "password": {password}}resp, err := http.PostForm(targetUrl, payload)defer resp.Body.Close()body, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Println("get token err")}bodyStr := string(body)var r TokenerrJson := json.Unmarshal([]byte(bodyStr), &r)if errJson != nil {fmt.Println("parse token json err")}return r.AccessToken}func getNss(token string, domain string) []*NameSpaceData {client := &http.Client{}resp, err := client.Get(domain + "/nacos/v1/console/namespaces?accessToken=" + token)defer resp.Body.Close()body, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Println(err)}var r NameSpaceerrNS := json.Unmarshal([]byte(string(body)), &r)if errNS != nil {fmt.Println("parse ns json err")}return r.Data}type NameSpace struct {Code int `json:"code"`Message string `json:"message"`Data []*NameSpaceData `json:"data"`}type NameSpaceData struct {Namespace string `json:"namespace"`NamespaceShowName string `json:"namespaceShowName"`Quota int `json:"quota"`ConfigCount int `json:"configCount"`Type int `json:"type"`}type Token struct {AccessToken string `json:"accessToken"`TokenTtl int32 `json:"tokenTtl"`GlobalAdmin bool `json:"globalAdmin"`}type ConfigList struct {TotalCount int32 `json:"totalCount"`PageNumber int32 `json:"pageNumber"`PagesAvailable int32 `json:"pagesAvailable"`PageItems []*PageItem `json:"pageItems"`}type PageItem struct {Id string `json:"id"`DataId string `json:"dataId"`Group string `json:"group"`Content string `json:"content"`}
