Cet article vous est présenté par la rubrique tutoriel golang sur le centre de configuration "nacos". Ci-dessous, nous découvrirons le centre de configuration du point de vue de golang, l'installation de naco et comment utiliser nacos pour configurer, lire les fichiers de configuration dans nacos, etc. J'espère que cela vous sera utile Amis qui ont besoin d'aide !
Qu'est-ce que le centre de configuration
Un système utilisé pour gérer uniformément toutes les configurations du projet. Même si cela semble simple, ne sous-estimez pas ce module. Si un projet Internet de taille moyenne n'adopte pas le modèle du centre de configuration, un grand nombre d'éléments de configuration divers et diverses exigences de modification irrégulières causeront certainement beaucoup de maux de tête aux développeurs et rendront la gestion très confuse.
Le processus de service du centre de configuration est le suivant : Les utilisateurs mettent à jour les informations de configuration dans le centre de configuration. Le service A et le service B reçoivent des notifications de mise à jour de configuration en temps opportun et obtiennent les configurations du centre de configuration. En général, le centre de configuration est un composant de service de base qui gère de manière uniforme diverses configurations d'applications.
Dans l'architecture système, le centre de configuration est un composant de l'ensemble du système d'infrastructure de microservices. Sa fonction semble discrète, ce n'est rien de plus que la gestion de la configuration et des accès, mais il est indispensable dans toute l'architecture de microservice d'un lien.
Qu'est-ce que nacos
Nacos
Nacos est l'abréviation de Naming and Configuration Service. D'après le nom, on peut voir que les deux domaines sur lesquels il se concentre sont Naming, le centre d'enregistrement et le centre de configuration de configuration.
La configuration commerciale, le changement de fonction, la rétrogradation des dépendances faibles dans la gestion des services, et même les mots de passe de bases de données, etc., peuvent tous utiliser le centre de configuration dynamique. Lorsqu'il n'y a pas de composant de centre de configuration dédié, nous utilisons du codage en dur, des fichiers de configuration, des bases de données, des caches, etc. pour résoudre le problème. Lors de la modification de la configuration via le codage en dur, vous devez recompiler et empaqueter le fichier de configuration, et l'application doit être redémarrée. Les performances de la base de données sont limitées et le cache perd en actualité.
Modèle de configuration Nacos
namespace + group + dataId détermine de manière unique une configuration
namespace : lié au client, un clinet correspond à un espace de noms, qui peut être utilisé pour isoler l'environnement ou distinguer des locataires
group : groupe, différencier l'entreprise
dataId : identifiant configuré
Voyons comment il est utilisé dans des scénarios réels
Par exemple : un site Web de commerce électronique comporte ces modules : module utilisateur, module produit, module de commande, inventaire Modules
Ces modules doivent tous être configurés et leurs configurations sont différentes. C'est ainsi que nous créons un espace de noms pour chaque module. Chaque module doit avoir une configuration
pendant la phase de développement et une configuration après la mise en ligne. groupes de dev, et pro à distinguer. Pour dataId, qu'il soit dev ou
pro, il faut le renseigner.
Installation Nacos
Ici, nous utilisons docker pour installer directement
Installation Nacos (docker)
docker run --name nacos-standalone -e MODE=standalone -e JVM_XMS=512m -e JVM_XMX=512m -e JVM_XMN=256m -p 8848:8848 -d nacos/nacos-server:latest
Visite : 192.168.1.103:8848/nacos/index.html Nom d'utilisateur/Mot de passe : nacos/nacos
Configurer startup:
docker container update --restart=always xxx
Utilisez nacos pour la configuration
nacos Après un démarrage réussi, visitez : 192.168.1.103:8848/nacos/index.html
Vous pouvez créer un espace de noms. Nous créons un nouvel utilisateur de module utilisateur. est réussi, vous pouvez voir qu'il existe un identifiant correspondant, par exemple : 7ae18f62-e2b9-48bd-bff2-a49e7443f5bc
Ensuite, nous créons un nouveau fichier de configuration sous l'espace de noms de l'utilisateur et remplissons le nom (dataId) et le groupe correspondants. Ici, nous créons un nouveau fichier de configuration josn :
{ "name": "user-web", "host": "10.2.106.169", "port": 9091, "tags":["iceymoss", "goods", "golang", "web"], "user_srv":{ "name": "user-srv", "host": "10.2.106.169", "port": 8081 }, "jwt":{ "key": "dfijdfjidhfjijdfbdfdFwohPd6XmVCdnQi" }, "sms":{ "key": "mykey", "secret": "mysecret" }, "params":{ "sign_name": "生鲜小店", "code": "SMS_244610581" }, "redis":{ "host": "127.0.0.1", "port": 6379, "expir": 300 }, "verify":{ "width": 5 }, "consul":{ "host": "10.2.106.169", "port": 8500 }, "tracing":{ "host": "127.0.0.1", "port": 6831, "name": "shopping" } }
L'intégralité du fichier de configuration est maintenant configuré
Lisez le fichier de configuration dans nacos
Tirez les dépendances
Nous utilisons go pour lire le fichier de configuration et utiliser le sdk qui doit extraire nacos :
go get github.com/nacos-group/nacos-sdk-go/clients go get github.com/nacos-group/nacos-sdk-go/common/constant go get github.com/nacos-group/nacos-sdk-go/vo
Lire la configuration
Avant de lire la configuration, nous écrivons d'abord une structure pour le mappage de la configuration
Structure du répertoire :
nacos_test ├── config │ └── config.go └── main.go
Lors de l'écriture de la configuration, nous devons faire attention au fait que nous vous devez conserver le nom de la balise et le fichier de configuration. Les noms sont les mêmes
package config //UserSerConfig 映射用户配置 type UserSerConfig struct { Name string `mapstructure:"name" json:"name"` Host string `mapstructure:"host" json:"host"` Port int `mapstructure:"port" json:"port"` } //JWTConfig 映射token配置 type JWTConfig struct { SigningKey string `mapstructure:"key" json:"key"` } //AliSmsConfig 阿里秘钥 type AliSmsConfig struct { Apikey string `mapstructure:"key" json:"key"` ApiSecret string `mapstructure:"secret" json:"secret"` } //ParamsConfig 短信模板配置 type ParamsConfig struct { SignName string `mapstructure:"sign_name" json:"sign_name"` TemplateCode string `mapstructure:"code" json:"code"` } //RedisConfig redis数据库配置 type RedisConfig struct { Host string `mapstructure:"host" json:"host"` Port int `mapstructure:"port" json:"port"` Expir int `mapstructure:"expir" json:"expir"` } //Verifier 手机验证长度 type Verifier struct { Width int `mapstructure:"width" json:"width"` } type ConsulConfig struct { Host string `mapstructure:"host" json:"host"` Port int `mapstructure:"port" json:"port"` } //ServerConfig 映射服务配置 type ServerConfig struct { Name string `mapstructure:"name" json:"name"` Port int `mapstructure:"port" json:"port"` UserSerInfo UserSerConfig `mapstructure:"user_srv" json:"user_srv"` JWTInfo JWTConfig `mapstructure:"jwt" json:"jwt"` AliSms AliSmsConfig `mapstructure:"sms" json:"sms"` Params ParamsConfig `mapstructure:"params" json:"params"` Redis RedisConfig `mapstructure:"redis" json:"redis"` Verify Verifier `mapstructure:"verify" json:"verify"` ConsulInfo ConsulConfig `mapstructure:"consul" json:"consul"` }
Le fichier de configuration est lu ci-dessous :
package main import ( "StudyGin/nacos/config" "encoding/json" "fmt" "github.com/nacos-group/nacos-sdk-go/clients" "github.com/nacos-group/nacos-sdk-go/common/constant" "github.com/nacos-group/nacos-sdk-go/vo" ) func main() { //服务端配置, nacos运行的socket sc := []constant.ServerConfig{ { IpAddr: "10.2.81.102", Port: 8848, }, } //客服端配置 cc := constant.ClientConfig{ NamespaceId: "7ae18f62-e2b9-48bd-bff2-a49e7443f5bc", // 如果需要支持多namespace,我们可以场景多个client,它们有不同的NamespaceId TimeoutMs: 5000, NotLoadCacheAtStart: true, LogDir: "tmp/nacos/log", CacheDir: "tmp/nacos/cache", //RotateTime: "1h", //MaxAge: 3, LogLevel: "debug", } configClient, err := clients.CreateConfigClient(map[string]interface{}{ "serverConfigs": sc, "clientConfig": cc, }) if err != nil { panic(err) } //获取配置 content, err := configClient.GetConfig(vo.ConfigParam{ DataId: "user-web.json", Group: "dev"}) if err != nil { panic(err) } Config := &config.ServerConfig{} //将配置信息读取到config.ServerConfig{}对象中 err = json.Unmarshal([]byte(content), &Config) if err != nil { panic(err) } fmt.Println(Config) }
Sortie :
&{user-web 9091 {user-srv 10.2.106.169 8081} {dfijdfjidhfjijdfbdfdFwohPd6XmVCdnQi} {mykey mysecret} {生鲜小店 SMS_244610581} {127.0.0.1 6379 300} {5} {10.2.106.1600}}
Bien sûr, le centre de configuration et Viper fournissent une configuration de surveillance en temps réel
Vous pouvez l'écrire comme ceci :
//监听配置变化 err = configClient.ListenConfig(vo.ConfigParam{ DataId: "user-web", Group: "DEV", OnChange: func(namespace, group, dataId, data string) { fmt.Println("配置文件变化") fmt.Println("group:" + group + ", dataId:" + dataId + ", data:" + data) }, }) time.Sleep(3000 * time.Second)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!