Nacos : Présentation et Fonctionnalités
Nacos (Dynamic Naming and Configuration Service) est un composant open-source conçu pour les architectures microservices. Il résout deux problématiques majeures : la découverte de services et la gestion centralisée des configurations dynamiques, tout en proposant des vérifications de santé et un support de clustering.
Découverte de services
Dans un environnement distribué, les services enregistrent leurs adresses IP et ports auprès de Nacos. Lorsqu'un service a besoin d'en appeler un autre, il interroge Nacos pour obtenir la liste des instances saines. Cela élimine le besoin de coder en dur les adresses réseau et permet une mise à l'échelle transparente.
Gestion des configurations
Au lieu de stocker les paramètres dans des fichiers locaux, les microservices récupèrent leur configuration depuis Nacos au démarrage. Les modifications effectuées via la console Nacos sont instantanément propagées aux services concernés, sans nécessiter de redémarrage.
Prérequis : Environnement Docker
Le déploiement de Nacos s'appuie sur Docker. Si Docker et Docker Compose ne sont pas encore installés sur votre machine Linux, vous pouvez les configurer via le script officiel :
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
Vérifiez l'installation :
docker --version
docker compose version
Récupération de l'image Nacos
Téléchargez l'image officielle depuis Docker Hub. La version 2.2.3 est utilisée ici pour sa stabilité.
docker pull nacos/nacos-server:2.2.3
Stratégies de Déploiement
Scénario 1 : Démarrage Rapide (Mode Autonome avec Derby)
Idéal pour les tests locaux, ce mode utilise la base de données embarquée Derby. Les données seront perdues si le conteneur est supprimé.
docker run -d \
--name nacos_dev \
-p 8848:8848 \
-e NACOS_MODE=standalone \
-e JVM_XMS=512m \
-e JVM_XMX=512m \
-e JVM_XMN=256m \
nacos/nacos-server:2.2.3
Accédez à l'interface web sur http://<IP_SERVEUR>:8848/nacos avec les identifiants par défaut nacos/nacos.
Scénario 2 : Persistance des données (Mode Autonome avec MySQL)
Pour un environnement de production, il est crucial de lier Nacos à une base de données MySQL externe et de monter des volumes pour les logs et configurations.
Initialisation de MySQL
Démarrez une instance MySQL et montez le script d'initialisation de Nacos :
docker run -d \
--name db_nacos \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=SecretPass123 \
-e MYSQL_DATABASE=nacos_db \
-v /opt/nacos/mysql:/var/lib/mysql \
-v /opt/nacos/init_db:/docker-entrypoint-initdb.d \
mysql:8.0
Assurez-vous de placer le script SQL officiel de Nacos dans /opt/nacos/init_db/ avant le démarrage.
Lancement du conteneur Nacos
docker run -d \
--name nacos_prod \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
-e NACOS_MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.1.50 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_DB_NAME=nacos_db \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=SecretPass123 \
-e JVM_XMS=1g \
-e JVM_XMX=1g \
-v /opt/nacos/conf:/home/nacos/conf \
-v /opt/nacos/logs:/home/nacos/logs \
--restart=always \
nacos/nacos-server:2.2.3
Scénario 3 : Orchestration avec Docker Compose
Pour simplifier la gestion, utilisez un fichier docker-compose.yml. Créez le fichier de configuraton suivant :
version: '3.8'
services:
base_donnees:
image: mysql:8.0
container_name: mysql_nacos
restart: always
environment:
MYSQL_ROOT_PASSWORD: SecretPass123
MYSQL_DATABASE: nacos_db
volumes:
- ./data_mysql:/var/lib/mysql
- ./init_db:/docker-entrypoint-initdb.d
ports:
- "3306:3306"
networks:
- reseau_interne
serveur_nacos:
image: nacos/nacos-server:2.2.3
container_name: nacos_app
restart: always
depends_on:
- base_donnees
environment:
NACOS_MODE: standalone
SPRING_DATASOURCE_PLATFORM: mysql
MYSQL_SERVICE_HOST: base_donnees
MYSQL_SERVICE_PORT: 3306
MYSQL_SERVICE_DB_NAME: nacos_db
MYSQL_SERVICE_USER: root
MYSQL_SERVICE_PASSWORD: SecretPass123
JVM_XMS: 1g
JVM_XMX: 1g
volumes:
- ./nacos_conf:/home/nacos/conf
- ./nacos_logs:/home/nacos/logs
ports:
- "8848:8848"
- "9848:9848"
- "9849:9849"
networks:
- reseau_interne
networks:
reseau_interne:
driver: bridge
Démarrez l'ensemble avec :
docker compose up -d
Scénario 4 : Haute Disponibilité (Cluster avec Stockage Embarqué)
Pour éviter tout point de défaillance unique, déployez un cluster de plusieurs nœuds Nacos utilisant le mode de stockage embarqué.
version: '3.8'
services:
nacos_noeud_1:
image: nacos/nacos-server:2.2.3
container_name: nacos_n1
restart: always
environment:
NACOS_MODE: cluster
EMBEDDED_STORAGE: embedded
NACOS_SERVERS: "nacos_n1:8848 nacos_n2:8848 nacos_n3:8848"
NACOS_SERVER_IP: nacos_n1
ports:
- "8848:8848"
- "9848:9848"
- "9849:9849"
networks:
- reseau_cluster
nacos_noeud_2:
image: nacos/nacos-server:2.2.3
container_name: nacos_n2
restart: always
environment:
NACOS_MODE: cluster
EMBEDDED_STORAGE: embedded
NACOS_SERVERS: "nacos_n1:8848 nacos_n2:8848 nacos_n3:8848"
NACOS_SERVER_IP: nacos_n2
ports:
- "8858:8848"
- "9858:9848"
- "9859:9849"
networks:
- reseau_cluster
nacos_noeud_3:
image: nacos/nacos-server:2.2.3
container_name: nacos_n3
restart: always
environment:
NACOS_MODE: cluster
EMBEDDED_STORAGE: embedded
NACOS_SERVERS: "nacos_n1:8848 nacos_n2:8848 nacos_n3:8848"
NACOS_SERVER_IP: nacos_n3
ports:
- "8868:8848"
- "9868:9848"
- "9869:9849"
networks:
- reseau_cluster
networks:
reseau_cluster:
driver: bridge
Initialisez le cluster via :
docker compose up -d
Opérations Fondamentales via l'API
Enregistrement d'un Service
curl -X PUT 'http://<IP_SERVEUR>:8848/nacos/v1/ns/instance?serviceName=api-utilisateurs&ip=192.168.1.101&port=8080'
Découverte d'instances
curl -X GET 'http://<IP_SERVEUR>:8848/nacos/v1/ns/instances?serviceName=api-utilisateurs'
Publication d'une Configuration
curl -X POST "http://<IP_SERVEUR>:8848/nacos/v1/cs/configs?dataId=api-utilisateurs-dev.conf&group=DEFAULT_GROUP&content=db.url=jdbc:mysql://127.0.0.1:3306/user_db"
Récupération d'une Configuration
curl -X GET "http://<IP_SERVEUR>:8848/nacos/v1/cs/configs?dataId=api-utilisateurs-dev.conf&group=DEFAULT_GROUP"
Résolution des Problèmes Courants
Console Web Inaccessible
Vérifiez l'état du conteneur avec docker ps et inspectez les journaux via docker logs nacos_prod. Si le port est bloqué, ouvrez-le dans le pare-feu :
firewall-cmd --add-port=8848/tcp --permanent
firewall-cmd --reload
Échec de Connexion à MySQL
Assurez-vous que l'adresse IP du serveur MySQL est correcte. N'utilisez pas 127.0.0.1 dans la configuration de Nacos si les conteneurs sont sur le même hôte, privilégiez l'IP interne de Docker ou le nom du service. Vérifiez également que le script SQL d'initialisation a bien été exécuté.
Arrêt Immédiat du Conteneur
Si le conteneur s'arrête instantanément, cela vient souvent d'une configuration JVM inadéquate ou d'un manque de mémoire. Réduisez les valeurs JVM_XMS et JVM_XMX. En modde cluster, une erreur de configuration des nœuds dans NACOS_SERVERS provoque également un crash.
Activation de l'Authentification
Par défaut, l'accès à l'API est ouvert. Pour sécuriser votre instance, activez l'authentification lors du démarrage :
-e NACOS_AUTH_ENABLE=true \
-e NACOS_AUTH_TOKEN=VotreCleSecreteComplexe456