Todos los productos
Search
Centro de documentos

Serverless App Engine:Use Spring Cloud to develop microservice applications and deploy them to SAE

Última actualización: Sep 05, 2026

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:

  1. Descargue y extraiga el paquete de Nacos Server.

  2. Inicie Nacos en modo independiente:

    • Linux, Unix o macOS: sudo sh startup.sh -m standalone

    • Windows: startup.cmd -m standalone

El parámetro -m standalone inicia Nacos en modo independiente en lugar de modo clúster. En Windows, hacer doble clic en startup.cmd lo 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, abra startup.cmd en un editor de texto, establezca MODE="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

ZF182Dl2pw

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.

x6JeUmPTQf

Notas sobre registros autogestionados

7D79jXUfBL

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
Importante

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.

sc_configure_a_startup_command_for_nacos

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.
  1. Cree un proyecto Maven llamado nacos-service-provider.

  2. 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:

  3. En src/main/java, cree el paquete com.aliware.edas.

  4. En com.aliware.edas, cree la clase de inicio ProviderApplication. La anotación @EnableDiscoveryClient activa 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);
        }
    }
  5. En com.aliware.edas, cree la clase EchoController. 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;
        }
    }
  6. En src/main/resources, cree el archivo application.properties y 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:8848

    Si su servidor de Nacos se ejecuta en un host diferente, reemplace 127.0.0.1 por su dirección IP. Para consultar todas las opciones de configuración disponibles, revise Configuration reference.

  7. Compruebe el registro:

    1. Ejecute el método main de ProviderApplication.

    2. Abra http://127.0.0.1:8848/nacos en un navegador. El nombre de usuario y la contraseña predeterminados son ambos nacos.

    3. En el panel de navegación izquierdo, elija Service Management > Service List. El servicio service-provider deberí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).

  1. Cree un proyecto Maven llamado nacos-service-consumer.

  2. Agregue lo siguiente al archivo pom.xml. El consumidor añade spring-cloud-starter-openfeign ademá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>
  3. En src/main/java, cree el paquete com.aliware.edas.

  4. En com.aliware.edas, cree la interfaz EchoService. La anotación @FeignClient la vincula al servicio service-provider registrado 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);
    }
  5. En com.aliware.edas, cree la clase de inicio ConsumerApplication:

    • @EnableDiscoveryClient — registra el consumidor en Nacos

    • @EnableFeignClients — activa el escaneo de FeignClient

    • @LoadBalanced en el bean RestTemplate — 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);
        }
    }
  6. En com.aliware.edas, cree la clase TestController para 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);
        }
    }
  7. En src/main/resources, cree el archivo application.properties:

    spring.application.name=service-consumer
    server.port=18082
    spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
  8. Compruebe el registro:

    1. Ejecute el método main de ConsumerApplication.

    2. Abra http://127.0.0.1:8848/nacos (nombre de usuario y contraseña: nacos).

    3. Elija Service Management > Service List. Confirme que service-consumer aparece 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

  1. 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 en 80 y Container Port en 18082. Para más detalles, consulte Bind a CLB to an application.

  2. 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-rest

    Si 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

spring.cloud.nacos.discovery.server-addr

Ninguna

Dirección IP y puerto del servidor Nacos

spring.cloud.nacos.discovery.service

${spring.application.name}

Nombre con el que se registra el servicio

spring.cloud.nacos.discovery.network-interface

Ninguna

Interfaz de red que se utilizará para el registro; si no se define, se usa la primera interfaz disponible

spring.cloud.nacos.discovery.ip

Ninguna

Dirección IP explícita para registrar (tiene prioridad sobre la detección automática de interfaz)

spring.cloud.nacos.discovery.port

-1

Puerto para registrar; se detecta automáticamente si no se especifica

spring.cloud.nacos.discovery.namespace

Ninguna

Namespace para aislamiento de entornos (por ejemplo, separar desarrollo de producción)

spring.cloud.nacos.discovery.metadata

Ninguna

Metadatos personalizados en formato de mapa

spring.cloud.nacos.discovery.cluster-name

DEFAULT

Nombre del clúster de Nacos

spring.cloud.nacos.discovery.endpoint

Ninguna

Nombre de dominio para la resolución dinámica de direcciones del servidor Nacos; no es obligatorio al desplegar en SAE

ribbon.nacos.enabled

true

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.

Pasos siguientes