Maison >développement back-end >Golang >Un article expliquant en détail comment installer et utiliser le centre de configuration nacos

Un article expliquant en détail comment installer et utiliser le centre de configuration nacos

藏色散人
藏色散人avant
2022-11-14 16:44:543081parcourir

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 !

Un article expliquant en détail comment installer et utiliser le centre de configuration nacos

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer