Ce tutoriel vous guide pas à pas dans la création d'une application de microservices Spring Cloud utilisant la découverte de services basée sur Nacos, puis son déploiement direct sur Serverless App Engine (SAE) depuis IntelliJ IDEA via le plug-in Alibaba Cloud Toolkit, sans nécessiter de pipeline CI/CD distinct.
Fonctionnement
L'application se compose de deux services qui communiquent via un serveur Nacos local agissant comme registre de services :
Fournisseur (
nacos-service-provider) : expose le point de terminaisonGET /echo/{string}et s'enregistre auprès de Nacos au démarrage.Consommateur (
nacos-service-consumer) : découvre le fournisseur via Nacos et l'appelle en utilisant soit RestTemplate, soit FeignClient.
IntelliJ IDEA
└── Alibaba Cloud Toolkit plug-in
│
├── Deploy ──► SAE Application: nacos-service-provider (port 18081)
│ └── registers as "service-provider" in Nacos
│
└── Deploy ──► SAE Application: nacos-service-consumer (port 18082)
└── discovers "service-provider" via Nacos
└── exposes /echo-rest/{str} and /echo-feign/{str}
Pendant le développement, les deux services s'exécutent localement contre un serveur Nacos sur site. Après validation locale, Alibaba Cloud Toolkit compile et déploie ces services en tant qu'applications SAE directement depuis IntelliJ IDEA.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Un compte SAE activé. Consultez Activer SAE
Maven installé avec les variables d'environnement configurées
JDK 1.8 ou version ultérieure installé
Alibaba Cloud Toolkit installé et configuré dans IntelliJ IDEA
Le serveur de plug-ins JetBrains est hébergé hors de Chine. Si le téléchargement est lent, obtenez le package d'installation hors ligne depuis le site web de JetBrains et installez-le manuellement. Pour obtenir de l'aide, consultez Nous contacter .
Étape 1 : Créer des applications placeholders dans SAE
SAE prend en charge le déploiement d'applications à partir de packages JAR et d'images de conteneurs. Ce tutoriel utilise des packages JAR.
Créez une application fournisseur et une application consommateur dans SAE. Pour des instructions détaillées, consultez Déployer une application de microservices à l'aide d'un package JAR dans la console SAE.
Vous publierez votre code local vers ces applications à l'étape Étape 5.
Étape 2 : Créer le fournisseur
Créez un projet Spring Boot qui s'enregistre auprès de Nacos en tant que fournisseur de services.
Créez un projet Maven nommé
nacos-service-provider.-
Ajoutez les dépendances suivantes au fichier
pom.xml:Spring Cloud Edgware n'est plus pris en charge. Utilisez Greenwich ou une version ultérieure pour les nouveaux projets.
Version de Spring Cloud Version de Spring Cloud Alibaba Greenwich 2.1.1.RELEASE Finchley 2.0.1.RELEASE Edgware 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.1.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>Cet exemple utilise Spring Cloud Greenwich.SR1 avec Spring Cloud Alibaba 2.1.1.RELEASE. Si votre projet cible une version différente de Spring Cloud, utilisez la version correspondante de Spring Cloud Alibaba :
Dans le répertoire
src/main/java, créez un package nommécom.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 le contrôleurEchoControllerpour exposer le point de terminaison du fournisseur :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 définissez l'adresse du serveur Nacos :Si votre registre de services est géré par vos soins, remplacez
127.0.0.1par l'adresse de votre registre de services géré.spring.application.name=service-provider server.port=18081 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 -
Vérifiez l'enregistrement du fournisseur :
Exécutez la méthode
mainde la classeProviderApplicationpour démarrer le fournisseur.Ouvrez la console Nacos à l'adresse
http://127.0.0.1:8848/nacos. Le nom d'utilisateur et le mot de passe par défaut sont tous deuxnacos.Dans le volet de navigation de gauche, sélectionnez Service Management > Services. Vérifiez que service-provider apparaît dans la liste des services.
Étape 3 : Créer le consommateur
Créez un projet Spring Boot qui découvre le fournisseur via Nacos et l'appelle en utilisant RestTemplate et FeignClient.
Créez un projet Maven nommé
nacos-service-consumer.-
Ajoutez les dépendances suivantes au fichier
pom.xml. Le consommateur requiert les mêmes configurations parent et de gestion des dépendances que le fournisseur, ainsi que la dépendancespring-cloud-starter-openfeign:<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.1.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 un package nommécom.aliware.edas.-
Dans le package
com.aliware.edas, créez l'interface FeignClientEchoService: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; // Binds this FeignClient to the "service-provider" service in Nacos @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:L'annotation
@EnableDiscoveryClientactive l'enregistrement et la découverte de services.L'annotation
@EnableFeignClientsactive FeignClient.L'annotation
@LoadBalancedintègre RestTemplate à la découverte de services afin qu'il puisse résoudreservice-providerpar son nom.
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 le contrôleurTestControllerpour exposer deux points de terminaison — l'un appelant le fournisseur via RestTemplate et l'autre via FeignClient :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 service-provider via RestTemplate @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 service-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:Si votre registre de services est géré par vos soins, remplacez
127.0.0.1:8848par l'adresse de votre registre de services géré.spring.application.name=service-consumer server.port=18082 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 -
Vérifiez l'enregistrement du consommateur :
Exécutez la méthode
mainde la classeConsumerApplicationpour démarrer le consommateur.Ouvrez la console Nacos à l'adresse
http://127.0.0.1:8848/nacos.Dans le volet de navigation de gauche, sélectionnez Service Management > Services. Vérifiez que service-consumer apparaît dans la liste des services.
Étape 4 : Tester les services localement
Une fois les deux services en cours d'exécution, appelez le consommateur pour confirmer qu'il atteint correctement le fournisseur.
Sous 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
Sous Windows, ouvrez un navigateur et accédez aux URL suivantes :
http://127.0.0.1:18082/echo-rest/rest-rest
http://127.0.0.1:18082/echo-feign/feign-rest
Chaque requête renvoie la chaîne de caractères transmise dans le chemin de l'URL, confirmant que le consommateur découvre et appelle le fournisseur via Nacos.

Étape 5 : Déployer les applications sur SAE
Configurez Alibaba Cloud Toolkit dans IntelliJ IDEA pour compiler et déployer les deux applications vers les applications SAE que vous avez créées à l'étape Étape 1.
Configurer votre compte Alibaba Cloud
Cliquez sur l'icône Alibaba Cloud Toolkit
dans la barre d'outils et sélectionnez Preference… dans la liste déroulante.Dans le volet de navigation de gauche de la page Settings, accédez à Alibaba Cloud Toolkit > Accounts.
-
Saisissez votre Access Key ID et votre Access Key Secret, puis cliquez sur OK.
Pour obtenir votre Access Key ID et votre Access Key Secret, cliquez sur Get existing AK/SK sur la page Accounts . Cela ouvre la page de connexion Alibaba Cloud. Après vous être connecté, accédez à la page Security Management pour récupérer vos identifiants.
Configurer et exécuter les tâches de déploiement
Cliquez sur l'icône Alibaba Cloud Toolkit
et sélectionnez Deploy to SAE dans la liste déroulante.-
Sur la page Deploy to SAE, configurez les paramètres pour l'application fournisseur : Cliquez sur Apply pour enregistrer.
Dans la section Application, sélectionnez la région, le namespace et le nom d'application correspondant à l'application fournisseur créée à l'étape 1. Le champ Name fait référence au nom de la configuration de déploiement, et non au nom de l'application SAE ; il n'est généralement pas nécessaire de le modifier.

-
Répétez l'étape précédente pour l'application consommateur, en sélectionnant la région, le namespace et le nom d'application correspondants. Cliquez sur Apply pour enregistrer.
Si vous utilisez un registre de services géré par vos soins, ajoutez les commandes de démarrage suivantes dans l'onglet Advanced avant d'enregistrer :
-Dnacos.use.endpoint.parsing.rule=falseet-Dnacos.use.cloud.namespace.parsing=false.
-
Cliquez sur Run pour déployer le fournisseur, puis répétez l'opération pour déployer le consommateur.

Vérifier le déploiement
-
Associez une instance Server Load Balancer (SLB) à l'application consommateur pour l'exposer publiquement. Consultez Associer une instance SLB à une application.

-
Envoyez des requêtes HTTP au consommateur en utilisant l'adresse IP publique de l'instance SLB (par exemple,
47.111.XX.XX) :# Call via FeignClient curl http://47.111.XX.XX/echo-feign/feign-rest # Call via RestTemplate curl http://47.111.XX.XX/echo-rest/rest-restLes deux requêtes renvoient la chaîne de caractères issue du chemin de l'URL, confirmant que le consommateur sur SAE découvre et appelle le fournisseur via Nacos.

-
Consultez les données d'appel sur les tableaux de bord de surveillance d'application associés.
Étapes suivantes
Déployer une application Java sur SAE 1.0 — autres méthodes de déploiement prises en charge par SAE
Associer une instance SLB à une application — exposer votre application au trafic externe