Este tutorial le guía paso a paso en la creación de dos microservicios con Spring Cloud desde cero: un proveedor de servicios y un consumidor de servicios. Aprenderá a probarlos localmente mediante el registro y descubrimiento de servicios de Nacos, y posteriormente a desplegar ambos en Serverless App Engine (SAE).
Al finalizar, el consumidor descubrirá e invocará al proveedor a través de Nacos, ejecutándose en SAE dentro de un entorno productivo.
El código fuente completo está disponible en GitHub.
Público objetivo de este tutorial
Identifique su punto de partida y comience desde ahí:
|
Su situación |
Dónde empezar |
|
Es nuevo en Spring Cloud |
Siga todos los pasos. Aprenderá cómo Spring Cloud Alibaba Nacos Discovery implementa el registro y descubrimiento de servicios, así como la forma de habilitar las llamadas del consumidor al proveedor. |
|
Tiene experiencia con Eureka, Consul o ZooKeeper |
Reemplace sus dependencias y configuración actuales de registro de servicios por Spring Cloud Alibaba Nacos Discovery. No se requieren cambios en el código, ya que Spring Cloud Alibaba implementa las interfaces estándar de Spring Cloud Registry. |
|
Ya utiliza Spring Cloud Alibaba Nacos Discovery de código abierto |
Vaya directamente al Paso 4: Desplegar en SAE. |
Si desea omitir por completo la configuración local de Nacos, vaya directamente al Paso 4: Desplegar en SAE y utilice el registro integrado de SAE. En este caso, no es necesario contar con un servidor local de Nacos.
Requisitos previos
Antes de empezar, asegúrese de cumplir con lo siguiente:
Tener Maven instalado y agregado a su variable PATH
Contar con un servidor de Nacos en ejecución (obligatorio para los pasos 1 a 3; no es necesario si salta directamente al paso 4)
Para iniciar un servidor local de Nacos:
Descargue y extraiga el paquete de Nacos Server.
-
Inicie Nacos en modo independiente:
Linux, Unix o macOS:
sudo sh startup.sh -m standaloneWindows:
startup.cmd -m standalone
El parámetro-m standaloneinicia Nacos en modo independiente en lugar de modo clúster. En Windows, hacer doble clic enstartup.cmdlo inicia en modo clúster de forma predeterminada, lo cual falla si no existe una configuración de clúster. Si observa un error de inicio, abrastartup.cmden un editor de texto, establezcaMODE="standalone"y vuelva a ejecutar el archivo. Para más detalles, consulte Inicio rápido de Nacos .
Elección de un registro de servicios
SAE admite tres opciones de registro de servicios, ordenadas de mayor a menor recomendación:
|
Opción |
Recomendada para |
Notas |
|
Microservices Engine (MSE) (recomendada) |
Cargas de trabajo productivas con múltiples microservicios |
Nacos comercial totalmente gestionado; consulte Uso de un registro MSE Nacos |
|
Registro autogestionado |
Equipos que requieren control total |
Requiere conectividad de red entre SAE y su clúster de Nacos; consulte las Notas sobre registros autogestionados a continuación |
|
Registro integrado de SAE |
Primeros pasos o cargas de trabajo sencillas |
Sin configuración adicional; SAE inyecta automáticamente la dirección del servidor Nacos, el puerto, el namespace, la AccessKey y el Context-path durante el despliegue |

Registro integrado de SAE
SAE proporciona resolución automática de direcciones del servidor Nacos para aplicaciones de microservicios en Java. Configure esta opción mediante la función de service registration and discovery en la consola de SAE. Para obtener instrucciones de configuración, consulte Uso del registro integrado de Nacos en SAE.

Notas sobre registros autogestionados

Cuando utilice un registro de Nacos autogestionado con SAE, despliegue su aplicación como una imagen o un paquete JAR y agregue los siguientes parámetros de inicio antes de -jar:
-Dnacos.use.endpoint.parsing.rule=false -Dnacos.use.cloud.namespace.parsing=false
No mezcle parámetros JVM -D y -XX en el mismo argumento, ya que esto provoca un fallo en el comando. Incorrecto: Correcto:
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
Para despliegues basados en imágenes: Agregue los parámetros al comando de inicio de la imagen:
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
Para obtener orientación sobre cómo crear una imagen Docker, consulte Ejemplo de creación de imágenes.
Para despliegues de paquetes JAR: En la consola de SAE, vaya a Startup Command Settings e introduzca los parámetros en el campo options Settings.

Para más detalles, consulte Configuración de un comando de inicio.
Paso 1: Crear el proveedor de servicios
El proveedor de servicios se registra en Nacos y expone un endpoint de eco. Este ejemplo utiliza Spring Boot 2.1.4.RELEASE y Spring Cloud Greenwich.SR1.
Las versiones de Spring Boot 2.4 y posteriores no son compatibles. Si utiliza Spring Cloud Alibaba 2.2.6.RELEASE, la versión requerida del cliente es la 1.4.2.
Cree un proyecto Maven llamado
nacos-service-provider.-
Agregue lo siguiente al archivo
pom.xml:Spring Cloud Edgware ha llegado al final de su ciclo de vida. Utilice Greenwich o versiones posteriores para nuevos proyectos.
Versión de Spring Cloud
Versión de Spring Cloud Alibaba
Greenwich (utilizada en este ejemplo)
2.1.1.RELEASE
Finchley
2.0.1.RELEASE
Edgware (fin de ciclo de vida)
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>Compatibilidad de versiones: Asegúrese de que su versión de Spring Cloud coincida con la versión correcta de Spring Cloud Alibaba:
En
src/main/java, cree el paquetecom.aliware.edas.-
En
com.aliware.edas, cree la clase de inicioProviderApplication. La anotación@EnableDiscoveryClientactiva el registro y descubrimiento 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, cree la claseEchoController. Esta asigna las solicitudes GET a/echo/{string}y devuelve la variable de ruta: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, cree el archivoapplication.propertiesy apúntelo al servidor local de Nacos:spring.application.name=service-provider server.port=18081 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848Si su servidor de Nacos se ejecuta en un host diferente, reemplace
127.0.0.1por su dirección IP. Para consultar todas las opciones de configuración disponibles, revise Configuration reference. -
Compruebe el registro:
Ejecute el método
maindeProviderApplication.Abra
http://127.0.0.1:8848/nacosen un navegador. El nombre de usuario y la contraseña predeterminados son ambosnacos.En el panel de navegación izquierdo, elija Service Management > Service List. El servicio
service-providerdebería aparecer en la lista. Haga clic en Details para confirmarlo.
Paso 2: Crear el consumidor de servicios
El consumidor de servicios se registra en Nacos e invoca al proveedor mediante dos mecanismos: RestTemplate (con balanceo de carga del lado del cliente) y FeignClient (HTTP declarativo).
Cree un proyecto Maven llamado
nacos-service-consumer.-
Agregue lo siguiente al archivo
pom.xml. El consumidor añadespring-cloud-starter-openfeignademás de las dependencias del proveedor:<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> En
src/main/java, cree el paquetecom.aliware.edas.-
En
com.aliware.edas, cree la interfazEchoService. La anotación@FeignClientla vincula al servicioservice-providerregistrado en 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); } -
En
com.aliware.edas, cree la clase de inicioConsumerApplication:@EnableDiscoveryClient— registra el consumidor en Nacos@EnableFeignClients— activa el escaneo de FeignClient@LoadBalanceden el beanRestTemplate— habilita el balanceo de carga del lado del cliente a través de 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); } } -
En
com.aliware.edas, cree la claseTestControllerpara exponer dos endpoints, uno para cada método de llamada: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); } } -
En
src/main/resources, cree el archivoapplication.properties:spring.application.name=service-consumer server.port=18082 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 -
Compruebe el registro:
Ejecute el método
maindeConsumerApplication.Abra
http://127.0.0.1:8848/nacos(nombre de usuario y contraseña:nacos).Elija Service Management > Service List. Confirme que
service-consumeraparece en la lista.
Paso 3: Pruebas locales
Con ambos servicios en ejecución, envíe solicitudes de prueba desde el consumidor hacia el proveedor.
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
Windows: Introduzca las siguientes URL en un navegador:
http://127.0.0.1:18082/echo-rest/rest-rest
http://127.0.0.1:18082/echo-feign/feign-rest
Ambos endpoints devuelven el parámetro de ruta como cuerpo de respuesta, lo que confirma que el consumidor descubrió e invocó correctamente al proveedor.
Paso 4: Desplegar en SAE
Despliegue nacos-service-provider y nacos-service-consumer como dos aplicaciones independientes. Ambas deben estar en la misma región y namespace para que funcione el descubrimiento de servicios.
Para obtener instrucciones detalladas sobre el despliegue, consulte Deploy a Java application.
Establezca el Application runtime environment según el tipo de paquete:
|
Tipo de paquete |
Application runtime environment |
|
Paquete JAR |
Standard Java Application Runtime Environment |
|
Paquete WAR |
apache-tomcat-XXX |
Cuando la aplicación se inicia en SAE, el registro de servicios integrado inyecta automáticamente la dirección del servidor Nacos, el puerto de servicio, el namespace, la AccessKey y el Context-path. Estos valores tienen prioridad sobre cualquier configuración definida en application.properties. Su configuración original puede mantenerse o eliminarse; ambas opciones funcionan correctamente.
Paso 5: Comprobar el despliegue
Vincule un Classic Load Balancer (CLB) público a la aplicación
nacos-service-consumer. Al configurar el acceso público, establezca Network Protocol en HTTP, HTTP Port en80y Container Port en18082. Para más detalles, consulte Bind a CLB to an application.-
En un navegador, introduzca la dirección IP pública del CLB utilizando uno de los siguientes formatos:
http://<public-IP-address>/echo-rest/rest-rest http://<public-IP-address>/echo-feign/feign-restSi recibe una respuesta en la página, significa que el despliegue funciona correctamente.
Referencia de configuración
Propiedades de configuración de Spring Cloud Alibaba Nacos Discovery para el archivo application.properties:
|
Clave |
Valor predeterminado |
Descripción |
|
|
Ninguna |
Dirección IP y puerto del servidor Nacos |
|
|
|
Nombre con el que se registra el servicio |
|
|
Ninguna |
Interfaz de red que se utilizará para el registro; si no se define, se usa la primera interfaz disponible |
|
|
Ninguna |
Dirección IP explícita para registrar (tiene prioridad sobre la detección automática de interfaz) |
|
|
|
Puerto para registrar; se detecta automáticamente si no se especifica |
|
|
Ninguna |
Namespace para aislamiento de entornos (por ejemplo, separar desarrollo de producción) |
|
|
Ninguna |
Metadatos personalizados en formato de mapa |
|
|
|
Nombre del clúster de Nacos |
|
|
Ninguna |
Nombre de dominio para la resolución dinámica de direcciones del servidor Nacos; no es obligatorio al desplegar en SAE |
|
|
|
Habilita la integración de Ribbon con Nacos; no modifique este valor a menos que sea necesario |
Para consultar la lista completa de opciones de configuración, visite Nacos Discovery.