【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"`
}