Este tutorial le guía en la compilación de una aplicación de microservices de Spring Cloud con detección de servicios basada en Nacos y su posterior despliegue en Serverless App Engine (SAE) directamente desde IntelliJ IDEA mediante el plugin de Alibaba Cloud Toolkit, sin necesidad de un pipeline de CI/CD independiente.
Funcionamiento
La aplicación consta de dos servicios que se comunican a través de un servidor Nacos local que actúa como registro de servicios:
Proveedor (
nacos-service-provider): ExponeGET /echo/{string}y se registra en Nacos al iniciarse.Consumidor (
nacos-service-consumer): Detecta al proveedor mediante Nacos y lo invoca usando RestTemplate o 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}
Durante el desarrollo, ambos servicios se ejecutan localmente contra un servidor Nacos on-premises. Tras la validación local, Alibaba Cloud Toolkit compila y despliega estos servicios como aplicaciones de SAE directamente desde IntelliJ IDEA.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Una cuenta de SAE activada. Consulte Activate SAE
Maven instalado con las variables de entorno configuradas
JDK 1.8 o posterior instalado
IntelliJ IDEA 2018.3 o posterior instalado
Alibaba Cloud Toolkit instalado y configurado en IntelliJ IDEA
El servidor de plugins de JetBrains está alojado fuera de China. Si la descarga es lenta, obtenga el paquete de instalación sin conexión desde el sitio web de JetBrains e instálelo manualmente. Para obtener ayuda, consulte Contact us .
Paso 1: Crear aplicaciones de marcador de posición en SAE
SAE admite el despliegue de aplicaciones desde paquetes JAR e imágenes de contenedor. Este tutorial utiliza paquetes JAR.
Cree una aplicación de proveedor y una aplicación de consumidor en SAE. Para obtener instrucciones paso a paso, consulte Deploy a microservices application by using a JAR package in the SAE console.
Publicará su código local en estas aplicaciones en el Paso 5.
Paso 2: Crear el proveedor
Cree un proyecto de Spring Boot que se registre en Nacos como proveedor de servicios.
Cree un proyecto Maven llamado
nacos-service-provider.-
Agregue las siguientes dependencias a
pom.xml:Spring Cloud Edgware ha sido descontinuado. Utilice Greenwich o versiones posteriores para nuevos proyectos.
Versión de Spring Cloud
Versión 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>Este ejemplo usa Spring Cloud Greenwich.SR1 con Spring Cloud Alibaba 2.1.1.RELEASE. Si su proyecto apunta a una versión diferente de Spring Cloud, utilice la versión correspondiente de Spring Cloud Alibaba:
En
src/main/java, cree un paquete llamadocom.aliware.edas.-
En
com.aliware.edas, cree la clase de inicioProviderApplication. La anotación@EnableDiscoveryClienthabilita el registro y la detección de servicios: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); } } -
En
com.aliware.edas, creeEchoControllerpara exponer el endpoint del proveedor: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; } } -
En
src/main/resources, creeapplication.propertiesy establezca la dirección del servidor Nacos:Si su registro de servicios es un registro autogestionado, reemplace
127.0.0.1por la dirección del registro de servicios autogestionado.spring.application.name=service-provider server.port=18081 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 -
Compruebe el registro del proveedor:
Ejecute el método
maindeProviderApplicationpara iniciar el proveedor.Abra la consola de Nacos en
http://127.0.0.1:8848/nacos. El nombre de usuario y la contraseña predeterminados son ambosnacos.En el panel de navegación izquierdo, vaya a Service Management > Services. Confirme que service-provider aparece en la lista de servicios.
Paso 3: Crear el consumidor
Cree un proyecto de Spring Boot que detecte al proveedor mediante Nacos y lo invoque usando RestTemplate y FeignClient.
Cree un proyecto Maven llamado
nacos-service-consumer.-
Agregue las siguientes dependencias a
pom.xml. El consumidor requiere el mismo padre y gestión de dependencias que el proveedor, además despring-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> En
src/main/java, cree un paquete llamadocom.aliware.edas.-
En
com.aliware.edas, cree la interfaz 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); } -
En
com.aliware.edas, cree la clase de inicioConsumerApplication:@EnableDiscoveryClienthabilita el registro y la detección de servicios.@EnableFeignClientshabilita FeignClient.@LoadBalancedintegra RestTemplate con la detección de servicios para que pueda resolverservice-providerpor nombre.
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); } } -
En
com.aliware.edas, creeTestControllerpara exponer dos endpoints: uno que invoca al proveedor mediante RestTemplate y otro mediante 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); } } -
En
src/main/resources, creeapplication.properties:Si su registro de servicios es un registro autogestionado, reemplace
127.0.0.1:8848por la dirección del registro de servicios autogestionado.spring.application.name=service-consumer server.port=18082 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 -
Compruebe el registro del consumidor:
Ejecute el método
maindeConsumerApplicationpara iniciar el consumidor.Abra la consola de Nacos en
http://127.0.0.1:8848/nacos.En el panel de navegación izquierdo, vaya a Service Management > Services. Confirme que service-consumer aparece en la lista de servicios.
Paso 4: Probar los servicios localmente
Con ambos servicios en ejecución, invoque al consumidor para confirmar que se comunica correctamente con el proveedor.
En Linux, Unix o macOS:
curl http://127.0.0.1:18082/echo-rest/rest-rest
curl http://127.0.0.1:18082/echo-feign/feign-rest
En Windows, abra un navegador y vaya a:
http://127.0.0.1:18082/echo-rest/rest-rest
http://127.0.0.1:18082/echo-feign/feign-rest
Cada solicitud devuelve la cadena que pasó en la ruta de la URL, lo cual confirma que el consumidor detecta e invoca al proveedor a través de Nacos.

Paso 5: Desplegar las aplicaciones en SAE
Configure Alibaba Cloud Toolkit en IntelliJ IDEA para compilar y desplegar ambas aplicaciones en las aplicaciones de SAE que creó en Step 1.
Configurar su cuenta de Alibaba Cloud
Haga clic en el icono de Alibaba Cloud Toolkit
en la barra de herramientas y seleccione Preference… en la lista desplegable.En el panel de navegación izquierdo de la página Settings, vaya a Alibaba Cloud Toolkit > Accounts.
-
Introduzca su Access Key ID y su Access Key Secret, luego haga clic en OK.
Para obtener su Access Key ID y Access Key Secret, haga clic en Get existing AK/SK en la página Accounts . Esto abre la página de inicio de sesión de Alibaba Cloud. Después de iniciar sesión, vaya a la página Security Management para recuperar sus credenciales.
Configurar y ejecutar las tareas de despliegue
Haga clic en el icono de Alibaba Cloud Toolkit
y seleccione Deploy to SAE en la lista desplegable.-
En la página Deploy to SAE, configure los ajustes para la aplicación de proveedor: Haga clic en Apply para guardar.
En la sección Application, seleccione la región, el namespace y el nombre de la aplicación que coincidan con la aplicación de proveedor creada en el Paso 1. El campo Name hace referencia al nombre de la configuración de despliegue, no al nombre de la aplicación SAE; por lo general, no es necesario modificarlo.

-
Repita el paso anterior para la aplicación de consumidor, seleccionando la región, el namespace y el nombre de la aplicación correspondientes. Haga clic en Apply para guardar.
Si utiliza un registro de servicios autogestionado, agregue los siguientes comandos de inicio en la pestaña Advanced antes de guardar:
-Dnacos.use.endpoint.parsing.rule=falsey-Dnacos.use.cloud.namespace.parsing=false.
-
Haga clic en Run para desplegar el proveedor y repita la operación para desplegar el consumidor.

Verificar el despliegue
-
Vincule una instancia de Server Load Balancer (SLB) a la aplicación de consumidor para exponerla públicamente. Consulte Bind an SLB instance to an application.

-
Envíe solicitudes HTTP al consumidor utilizando la dirección IP pública del SLB (por ejemplo,
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-restAmbas solicitudes devuelven la cadena de la ruta de la URL, lo que confirma que el consumidor en SAE detecta e invoca al proveedor a través de Nacos.

-
Consulte los datos de llamadas en los paneles de Monitoreo de aplicaciones correspondientes.
Pasos siguientes
Deploy a Java application to SAE 1.0 — otros métodos de despliegue compatibles con SAE
Bind an SLB instance to an application — exponga su aplicación al tráfico externo