package register import ( "bytes" "fmt" "github.com/nacos-group/nacos-sdk-go/v2/clients" "github.com/nacos-group/nacos-sdk-go/v2/clients/config_client" "github.com/nacos-group/nacos-sdk-go/v2/common/constant" "github.com/nacos-group/nacos-sdk-go/v2/vo" "github.com/spf13/viper" "go.uber.org/zap" "strconv" "strings" ) var group = "" func InitNacos(configFileName string) *viper.Viper { v := parseAgentConfigFile(configFileName, nil) group = v.GetString("spring.cloud.nacos.config.group") // build the nacos connection configClient := startNacosConnection(v) // get all needed nacos config and merge allNacosConfig := getAllNacosConfig(v, group, configClient) for _, nacosConfigContent := range allNacosConfig { log.Debug(fmt.Sprintf("nacos config conetent is %s", nacosConfigContent)) parseNacosConfigContend(nacosConfigContent, v) } log.Info(fmt.Sprintf("%s config read result are %v", configFileName, v.AllSettings())) return v } func parseAgentConfigFile(configFileName string, v *viper.Viper) *viper.Viper { // 使用Viper框架读取 if v == nil { v = viper.New() } // 设置配置文件路径和名称 v.SetConfigName(configFileName) v.AddConfigPath(".") v.SetConfigType("yaml") // 读取默认的总配置文件 err := v.ReadInConfig() if err != nil { panic(fmt.Errorf("fatal error config file: %s", err)) } return v } func parseNacosConfigContend(configContent string, v *viper.Viper) *viper.Viper { v.SetConfigType("yaml") // use merge err := v.MergeConfig(bytes.NewBuffer([]byte(configContent))) if err != nil { log.Error("nacos config contend read error !", zap.Error(err)) } return v } func startNacosConnection(v *viper.Viper) config_client.IConfigClient { serverAddr := v.GetString("spring.cloud.nacos.config.server-addr") clientConfig := constant.ClientConfig{ //Endpoint: serverAddr, NamespaceId: "", TimeoutMs: v.GetUint64("spring.cloud.nacos.config.timeout"), NotLoadCacheAtStart: true, AppendToStdout: true, UpdateCacheWhenEmpty: true, //LogDir: "/tmp/nacos/log", //CacheDir: "/tmp/nacos/cache", Username: "nacos", Password: "Superwmm.23", } split := strings.Split(serverAddr, ":") if len(split) != 2 { log.Error("nacos server addr error!") } port, _ := strconv.ParseUint(split[1], 10, 64) serverConfigs := []constant.ServerConfig{ { IpAddr: split[0], Port: port, GrpcPort: port + 1000, }, } // Another way of create config client for dynamic configuration (recommend) configClient, err := clients.NewConfigClient( vo.NacosClientParam{ ClientConfig: &clientConfig, ServerConfigs: serverConfigs, }, ) if err != nil { panic(err) } return configClient } func getAllNacosConfig(v *viper.Viper, group string, configClient config_client.IConfigClient) []string { result := make([]string, 0) // main nacos configs mainNacosConfigFileName := v.GetString("spring.application.name") + "-" + v.GetString("spring.profiles.active") + "." + v.GetString("spring.cloud.nacos.config.file-extension") log.Debug(fmt.Sprintf("main nacos config file name is %s", mainNacosConfigFileName)) configContent := getConfig(mainNacosConfigFileName, group, configClient) result = append(result, configContent) // additional nacos config additionalNacosConfig := v.Get("spring.cloud.nacos.config.extension-configs") // 增加断言,判定map的类型 m, ok := additionalNacosConfig.([]interface{}) if !ok { fmt.Println("additionalNacosConfig is not a slice") return nil } for _, addConfigMap := range m { realMap, _ := addConfigMap.(map[string]interface{}) // 拿到配置的Key dataId := realMap["data-id"].(string) group := realMap["group"].(string) // 查询 config := getConfig(dataId, group, configClient) result = append(result, config) } return result } // getConfig 从Nacos中获取相应的 func getConfig(dataId string, group string, configClient config_client.IConfigClient) string { log.Debug(fmt.Sprintf("nacos config get method dataID is %s, group is %s", dataId, group)) content, err := configClient.GetConfig(vo.ConfigParam{ DataId: dataId, Group: group, }) if err != nil { log.Error("nacos config get error !", zap.Error(err)) } log.Debug(fmt.Sprintf("dataId %s , group %s, nacos config content is %s", dataId, group, content)) return content }