vlambda博客
学习文章列表

【Golang】Nacos用户名密码拉取所有配置

背景:项目模块太多,对应nacos配置yml太多,每次查找配置项登录nacos,一个一个点开查看太麻烦,干脆一次性把nacos帐号下所有配置都拉下来放到项目根目录下,借助idea搜索非常方便查看了;

# 为全局搜索nacos配置而生
# 使用方法, 下载该工程, 执行以下命令就会生成./nacos nacos.xxx-company.com 用户名 密码
# 会把该nacos下所有配置文件拉取下来

工具源码如下:

package main
import ( "encoding/json" "fmt" "io/ioutil" "net/http" "net/url" "os")
func main() { args := os.Args fmt.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].Namespace namespaceShowName := namespace[i].NamespaceShowName configListNameDir := "./" + namespaceShowName os.RemoveAll(configListNameDir) os.Mkdir(configListNameDir, os.ModePerm) pageItems := getYmlList(token, tenant, domain) for j := 0; j < len(pageItems); j++ { pageItem := pageItems[j] dataId := pageItem.DataId yml := configListNameDir + "/" + dataId content := pageItem.Content f, _ := 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 ConfigList errNS := 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 Token errJson := 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 NameSpace errNS := 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"`}