Ce tutoriel vous guide pas à pas dans la création de deux microservices Spring Cloud — un fournisseur de service et un consommateur de service — à partir de zéro. Vous les testerez localement grâce à l'enregistrement et à la découverte de services Nacos, puis vous déploierez les deux applications sur Serverless App Engine (SAE).
À l'issue de ce processus, le consommateur découvrira et appellera le fournisseur via Nacos, le tout s'exécutant en production sur SAE.
Le code source complet est disponible sur GitHub.
Public cible de ce tutoriel
Identifiez votre situation ci-dessous pour savoir par où commencer :
| Votre situation | Point de départ |
|---|---|
| Vous débutez avec Spring Cloud | Suivez toutes les étapes. Vous apprendrez comment Spring Cloud Alibaba Nacos Discovery implémente l'enregistrement et la découverte de services, ainsi que la manière d'activer les appels du consommateur vers le fournisseur. |
| Vous maîtrisez Eureka, Consul ou ZooKeeper | Remplacez vos dépendances et configurations d'annuaire de services existantes par Spring Cloud Alibaba Nacos Discovery. Aucune modification de code n'est nécessaire, car Spring Cloud Alibaba implémente les interfaces standard Spring Cloud Registry. |
| Vous utilisez déjà Spring Cloud Alibaba Nacos Discovery open source | Passez directement à l'étape Étape 4 : Déploiement sur SAE. |
Si vous souhaitez ignorer entièrement la configuration locale de Nacos, rendez-vous directement à l'étape Étape 4 : Déploiement sur SAE et utilisez l'annuaire intégré à SAE. Aucun serveur Nacos local n'est requis dans ce cas.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Maven installé et ajouté à votre PATH
Un serveur Nacos en cours d'exécution (requis pour les étapes 1 à 3 ; non requis si vous passez directement à l'étape 4)
Pour démarrer un serveur Nacos local :
Téléchargez et extrayez le package du serveur Nacos.
-
Démarrez Nacos en mode autonome :
Linux, Unix ou macOS :
sudo sh startup.sh -m standaloneWindows :
startup.cmd -m standalone
L'indicateur-m standalonedémarre Nacos en mode autonome plutôt qu'en mode cluster. Sous Windows, un double-clic surstartup.cmdlance par défaut le mode cluster, ce qui échoue en l'absence de configuration de cluster. En cas d'erreur au démarrage, ouvrezstartup.cmddans un éditeur de texte, définissezMODE="standalone", puis exécutez à nouveau le fichier. Pour plus de détails, consultez la section Démarrage rapide de Nacos .
Choisir un annuaire de services
SAE prend en charge trois options d'annuaire de services, classées de la plus recommandée à la moins recommandée :
| Option | Idéal pour | Remarques |
|---|---|---|
| Microservices Engine (MSE) (recommandé) | Charges de travail de production avec de nombreux microservices | Solution Nacos commerciale entièrement gérée ; consultez la section Utiliser un annuaire MSE Nacos |
| Annuaire autogéré | Équipes nécessitant un contrôle total | Requiert une connectivité réseau entre SAE et votre cluster Nacos ; consultez les remarques sur les annuaires autogérés ci-dessous |
| Annuaire intégré à SAE | Prise en main ou charges de travail simples | Configuration zéro ; SAE injecte automatiquement l'adresse du serveur Nacos, le port, le namespace, l'AccessKey et le Context-path lors du déploiement |

Annuaire intégré à SAE
SAE fournit un adressage automatique du serveur Nacos pour les applications de microservices Java. Configurez cette fonctionnalité via la fonction service registration and discovery dans la console SAE. Pour les instructions de configuration, consultez la section Utiliser l'annuaire Nacos intégré à SAE.

Remarques sur les annuaires autogérés

Lorsque vous utilisez un annuaire Nacos autogéré avec SAE, déployez votre application sous forme d'image ou de package JAR et ajoutez les paramètres de démarrage suivants avant -jar :
-Dnacos.use.endpoint.parsing.rule=false -Dnacos.use.cloud.namespace.parsing=false
Ne mélangez pas les paramètres JVM -D et -XX dans le même argument, sous peine d'échec de la commande. Incorrect : Correct :
java -Dalicloud.deployment.mode=EDAS_MANAGED -XX:+UseContainerSupport -XX:InitialRAMPercentage=70.0 ... -jar /home/admin/app/xx-server.jar
java -XX:+UseContainerSupport -XX:InitialRAMPercentage=70.0 ... -Dnacos.use.endpoint.parsing.rule=false -Dnacos.use.cloud.namespace.parsing=false -jar /home/admin/app/xx-server.jar
Pour les déploiements par image : Ajoutez les paramètres à la commande de démarrage de l'image :
RUN echo 'eval exec java -Dnacos.use.endpoint.parsing.rule=false -Dnacos.use.cloud.namespace.parsing=false -jar $CATALINA_OPTS /home/admin/app/hello-edas-0.0.1-SNAPSHOT.jar'> /home/admin/start.sh && chmod +x /home/admin/start.sh
Pour obtenir des conseils sur la création d'une image Docker, consultez la section Exemple de création d'image.
Pour les déploiements par package JAR : Dans la console SAE, accédez à Startup Command Settings et saisissez les paramètres dans le champ options Settings.

Pour plus de détails, consultez la section Configurer une commande de démarrage.
Étape 1 : Créer le fournisseur de service
Le fournisseur de service s'enregistre auprès de Nacos et expose un endpoint echo. Cet exemple utilise Spring Boot 2.1.4.RELEASE et Spring Cloud Greenwich.SR1.
Spring Boot 2.4 et versions ultérieures ne sont pas pris en charge. Si vous utilisez Spring Cloud Alibaba 2.2.6.RELEASE, la version cliente requise est la 1.4.2.
Créez un projet Maven nommé
nacos-service-provider.-
Ajoutez les éléments suivants au fichier
pom.xml:Spring Cloud Edgware a atteint sa fin de vie. Utilisez Greenwich ou une version ultérieure pour les nouveaux projets.
Version Spring Cloud Version Spring Cloud Alibaba Greenwich (utilisée dans cet exemple) 2.1.1.RELEASE Finchley 2.0.1.RELEASE Edgware (fin de vie) 1.5.1.RELEASE <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.1.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>Compatibilité des versions : Faites correspondre votre version Spring Cloud à la version Spring Cloud Alibaba appropriée :
Dans le répertoire
src/main/java, créez le packagecom.aliware.edas.-
Dans le package
com.aliware.edas, créez la classe de démarrageProviderApplication. L'annotation@EnableDiscoveryClientactive l'enregistrement et la découverte de services :package com.aliware.edas; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } } -
Dans le package
com.aliware.edas, créez la classeEchoController. Elle mappe les requêtes GET vers/echo/{string}et renvoie la variable de chemin :package com.aliware.edas; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController public class EchoController { @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET) public String echo(@PathVariable String string) { return string; } } -
Dans le répertoire
src/main/resources, créez le fichierapplication.propertieset pointez-le vers le serveur Nacos local :spring.application.name=service-provider server.port=18081 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848Si votre serveur Nacos s'exécute sur un hôte différent, remplacez
127.0.0.1par son adresse IP. Pour toutes les options de configuration disponibles, consultez la section Référence de configuration. -
Vérifiez l'enregistrement :
Exécutez la méthode
mainde la classeProviderApplication.Ouvrez
http://127.0.0.1:8848/nacosdans un navigateur. Le nom d'utilisateur et le mot de passe par défaut sont tous deuxnacos.Dans le volet de navigation de gauche, choisissez Service Management > Service List.
service-providerdevrait apparaître dans la liste. Cliquez sur Details pour confirmer.
Étape 2 : Créer le consommateur de service
Le consommateur de service s'enregistre auprès de Nacos et appelle le fournisseur à l'aide de deux mécanismes : RestTemplate (avec équilibrage de charge côté client) et FeignClient (HTTP déclaratif).
Créez un projet Maven nommé
nacos-service-consumer.-
Ajoutez les éléments suivants au fichier
pom.xml. Le consommateur ajoutespring-cloud-starter-openfeignaux dépendances du fournisseur :<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.1.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> Dans le répertoire
src/main/java, créez le packagecom.aliware.edas.-
Dans le package
com.aliware.edas, créez l'interfaceEchoService. L'annotation@FeignClientla lie au serviceservice-providerenregistré dans Nacos :package com.aliware.edas; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @FeignClient(name = "service-provider") public interface EchoService { @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET) String echo(@PathVariable("str") String str); } -
Dans le package
com.aliware.edas, créez la classe de démarrageConsumerApplication:@EnableDiscoveryClient— enregistre le consommateur auprès de Nacos@EnableFeignClients— active l'analyse FeignClient@LoadBalancedsur le beanRestTemplate— active l'équilibrage de charge côté client via Nacos
package com.aliware.edas; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class ConsumerApplication { @LoadBalanced @Bean public RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } } -
Dans le package
com.aliware.edas, créez la classeTestControllerpour exposer deux endpoints — un pour chaque méthode d'appel :package com.aliware.edas; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController public class TestController { @Autowired private RestTemplate restTemplate; @Autowired private EchoService echoService; // Calls the provider via RestTemplate with load balancing @RequestMapping(value = "/echo-rest/{str}", method = RequestMethod.GET) public String rest(@PathVariable String str) { return restTemplate.getForObject("http://service-provider/echo/" + str, String.class); } // Calls the provider via FeignClient @RequestMapping(value = "/echo-feign/{str}", method = RequestMethod.GET) public String feign(@PathVariable String str) { return echoService.echo(str); } } -
Dans le répertoire
src/main/resources, créez le fichierapplication.properties:spring.application.name=service-consumer server.port=18082 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 -
Vérifiez l'enregistrement :
Exécutez la méthode
mainde la classeConsumerApplication.Ouvrez
http://127.0.0.1:8848/nacos(nom d'utilisateur et mot de passe :nacos).Choisissez Service Management > Service List. Confirmez que
service-consumerapparaît dans la liste.
Étape 3 : Tester localement
Une fois les deux services en cours d'exécution, envoyez des requêtes de test du consommateur vers le fournisseur.
Linux, Unix ou macOS :
curl http://127.0.0.1:18082/echo-rest/rest-rest
curl http://127.0.0.1:18082/echo-feign/feign-rest
Windows : Saisissez les URL suivantes dans un navigateur :
http://127.0.0.1:18082/echo-rest/rest-rest
http://127.0.0.1:18082/echo-feign/feign-rest
Les deux endpoints renvoient le paramètre de chemin dans le corps de la réponse, confirmant que le consommateur a découvert et appelé le fournisseur avec succès.
Étape 4 : Déploiement sur SAE
Déployez nacos-service-provider et nacos-service-consumer en tant que deux applications distinctes. Elles doivent se trouver dans la même région et le même namespace pour que la découverte de services fonctionne.
Pour des instructions de déploiement détaillées, consultez la section Déployer une application Java.
Définissez l'Application runtime environment en fonction de votre type de package :
| Type de package | Environnement d'exécution de l'application |
|---|---|
| Package JAR | Standard Java Application Runtime Environment |
| Package WAR | apache-tomcat-XXX |
Lorsque l'application démarre sur SAE, l'annuaire de services intégré injecte automatiquement l'adresse du serveur Nacos, le port de service, le namespace, l'AccessKey et le Context-path. Ces valeurs ont priorité sur tous les paramètres définis dans application.properties. Votre configuration d'origine peut rester en place ou être supprimée ; les deux options fonctionnent.
Étape 5 : Vérifier le déploiement
Associez un Classic Load Balancer (CLB) public à l'application
nacos-service-consumer. Lors de la configuration de l'accès public, définissez le Network Protocol sur HTTP, le HTTP Port sur80et le Container Port sur18082. Pour plus de détails, consultez la section Associer un CLB à une application.-
Dans un navigateur, saisissez l'adresse IP publique du CLB selon l'un des formats suivants :
http://<public-IP-address>/echo-rest/rest-rest http://<public-IP-address>/echo-feign/feign-restLa réception d'une réponse sur la page confirme que le déploiement fonctionne correctement.
Référence de configuration
Propriétés de configuration Spring Cloud Alibaba Nacos Discovery pour le fichier application.properties :
| Clé | Valeur par défaut | Description |
|---|---|---|
spring.cloud.nacos.discovery.server-addr |
Aucune | Adresse IP et port du serveur Nacos |
spring.cloud.nacos.discovery.service |
${spring.application.name} |
Nom sous lequel le service s'enregistre |
spring.cloud.nacos.discovery.network-interface |
Aucune | Interface réseau à utiliser pour l'enregistrement ; revient à la première interface disponible si non définie |
spring.cloud.nacos.discovery.ip |
Aucune | Adresse IP explicite à enregistrer (prioritaire sur la détection d'interface) |
spring.cloud.nacos.discovery.port |
-1 |
Port à enregistrer ; détecté automatiquement si non spécifié |
spring.cloud.nacos.discovery.namespace |
Aucune | Namespace pour l'isolation des environnements (par exemple, séparation du développement et de la production) |
spring.cloud.nacos.discovery.metadata |
Aucune | Métadonnées personnalisées au format map |
spring.cloud.nacos.discovery.cluster-name |
DEFAULT |
Nom du cluster Nacos |
spring.cloud.nacos.discovery.endpoint |
Aucune | Nom de domaine pour la résolution dynamique de l'adresse du serveur Nacos ; non requis lors du déploiement sur SAE |
ribbon.nacos.enabled |
true |
Active l'intégration de Ribbon avec Nacos ; ne pas modifier sauf si nécessaire |
Pour la liste complète des options de configuration, consultez la section Nacos Discovery.