Todos os produtos
Search
Central de documentação

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

Última atualização: Jun 28, 2026

Este tutorial ensina a criar dois microsserviços Spring Cloud do zero: um provedor de serviços e um consumidor de serviços. Você testará ambos localmente com registro e descoberta de serviços via Nacos e, em seguida, os implantará no Serverless App Engine (SAE).

Ao final, o consumidor descobrirá e chamará o provedor por meio do Nacos, em execução no SAE em ambiente de produção.

O código-fonte completo está disponível no GitHub.

Público-alvo deste tutorial

Identifique seu cenário atual e comece pelo ponto indicado:

Seu cenário

Por onde começar

Novo no Spring Cloud

Siga todas as etapas. Aprenda como o Spring Cloud Alibaba Nacos Discovery implementa o registro e a descoberta de serviços, além de habilitar chamadas do consumidor para o provedor.

Familiarizado com Eureka, Consul ou ZooKeeper

Substitua as dependências e configurações do seu registro de serviços existente pelo Spring Cloud Alibaba Nacos Discovery. Não é necessário alterar o código, pois o Spring Cloud Alibaba implementa as interfaces padrão do Spring Cloud Registry.

Já utiliza o Spring Cloud Alibaba Nacos Discovery open-source

Acesse diretamente a Etapa 4: Implantar no SAE.

Para ignorar a configuração local do Nacos, acesse diretamente a Etapa 4: Implantar no SAE e use o registro integrado do SAE. Nesse fluxo, não é necessário ter um Nacos Server local.

Pré-requisitos

Antes de começar, verifique se você tem:

  • O Maven instalado e adicionado ao PATH

  • Um Nacos Server em execução (necessário para as Etapas 1 a 3; opcional se você pular para a Etapa 4)

Para iniciar um Nacos Server local:

  1. Baixe e extraia o pacote do Nacos Server.

  2. Inicie o Nacos no modo standalone:

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

    • Windows: startup.cmd -m standalone

A flag -m standalone inicia o Nacos no modo standalone em vez do modo cluster. No Windows, clicar duas vezes no arquivo startup.cmd inicia o serviço no modo cluster por padrão, o que falha sem uma configuração de cluster adequada. Se ocorrer um erro de inicialização, abra o startup.cmd em um editor de texto, defina MODE="standalone" e execute-o novamente. Para mais detalhes, consulte o guia Quick Start for Nacos .

Escolha um registro de serviços

O SAE oferece três opções de registro de serviços, listadas da mais recomendada para a menos recomendada:

Opção

Mais indicada para

Observações

Microservices Engine (MSE) (recomendado)

Cargas de trabalho em produção com muitos microsserviços

Nacos comercial totalmente gerenciado; veja Use an MSE Nacos registry

Registro autogerenciado

Equipes que precisam de controle total

Exige conectividade de rede entre o SAE e seu cluster Nacos; veja as Notas sobre registro autogerenciado abaixo

Registro integrado do SAE

Primeiros passos ou cargas de trabalho simples

Configuração zero; o SAE injeta automaticamente o endereço, porta, namespace, AccessKey e Context-path do Nacos Server durante a implantação

ZF182Dl2pw

Registro integrado do SAE

O SAE fornece endereçamento automático do Nacos Server para aplicações de microsserviços Java. Configure-o por meio do recurso de service registration and discovery no console do SAE. Para instruções de configuração, consulte Use the SAE built-in Nacos registry.

x6JeUmPTQf

Notas sobre registro autogerenciado

7D79jXUfBL

Ao usar um registro Nacos autogerenciado com o SAE, implante sua aplicação como imagem ou pacote JAR e adicione estes parâmetros de inicialização antes de -jar:

-Dnacos.use.endpoint.parsing.rule=false -Dnacos.use.cloud.namespace.parsing=false
Importante

Não misture parâmetros JVM -D e -XX no mesmo argumento, pois isso causa falha no comando. Incorreto: Correto:

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 implantações com imagem: Adicione os parâmetros ao comando de inicialização da imagem:

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 orientações sobre como criar uma imagem docker, consulte Example of image creation.

Para implantações com pacote JAR: No console do SAE, acesse Startup Command Settings e insira os parâmetros no campo options Settings.

sc_configure_a_startup_command_for_nacos

Para mais detalhes, consulte Configure a startup command.

Etapa 1: Criar o provedor de serviços

O provedor de serviços registra-se no Nacos e expõe um endpoint echo. Este exemplo usa Spring Boot 2.1.4.RELEASE e Spring Cloud Greenwich.SR1.

O Spring Boot 2.4 e versões posteriores não são suportados. Se você usar o Spring Cloud Alibaba 2.2.6.RELEASE, a versão necessária do cliente é 1.4.2.
  1. Crie um projeto Maven chamado nacos-service-provider.

  2. Adicione o seguinte conteúdo ao pom.xml:

    O Spring Cloud Edgware atingiu o fim do ciclo de vida. Use Greenwich ou superior para novos projetos.

    Versão do Spring Cloud

    Versão do Spring Cloud Alibaba

    Greenwich (usada neste exemplo)

    2.1.1.RELEASE

    Finchley

    2.0.1.RELEASE

    Edgware (fim do 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>

    Compatibilidade de versões: Alinhe sua versão do Spring Cloud à versão correta do Spring Cloud Alibaba:

  3. Em src/main/java, crie o pacote com.aliware.edas.

  4. No pacote com.aliware.edas, crie a classe de inicialização ProviderApplication. A anotação @EnableDiscoveryClient ativa o registro e a descoberta de serviços:

    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. No pacote com.aliware.edas, crie a classe EchoController. Ela mapeia requisições GET para /echo/{string} e retorna a variável de caminho:

    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. Em src/main/resources, crie o arquivo application.properties e configure-o para apontar para o Nacos Server local:

    spring.application.name=service-provider
    server.port=18081
    spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

    Se o Nacos Server estiver em outro host, substitua 127.0.0.1 pelo endereço IP correspondente. Para todas as opções de configuração disponíveis, consulte a Referência de configuração.

  7. Verifique o registro:

    1. Execute o método main da classe ProviderApplication.

    2. Abra http://127.0.0.1:8848/nacos no navegador. O nome de usuário e a senha padrão são ambos nacos.

    3. No painel de navegação à esquerda, escolha Service Management > Service List. O serviço service-provider deve aparecer na lista. Clique em Details para confirmar.

Etapa 2: Criar o consumidor de serviços

O consumidor de serviços registra-se no Nacos e chama o provedor usando dois mecanismos: RestTemplate (com balanceamento de carga no lado do cliente) e FeignClient (HTTP declarativo).

  1. Crie um projeto Maven chamado nacos-service-consumer.

  2. Adicione o seguinte ao pom.xml. O consumidor adiciona spring-cloud-starter-openfeign além das dependências do provedor:

    <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. Em src/main/java, crie o pacote com.aliware.edas.

  4. No pacote com.aliware.edas, crie a interface EchoService. A anotação @FeignClient vincula a interface ao serviço service-provider registrado no 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. No pacote com.aliware.edas, crie a classe de inicialização ConsumerApplication:

    • @EnableDiscoveryClient — registra o consumidor no Nacos

    • @EnableFeignClients — ativa a varredura do FeignClient

    • @LoadBalanced no bean RestTemplate — habilita o balanceamento de carga no lado do cliente 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);
        }
    }
  6. No pacote com.aliware.edas, crie a classe TestController para expor dois endpoints, um para cada método de chamada:

    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. Em src/main/resources, crie o arquivo application.properties:

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

    1. Execute o método main da classe ConsumerApplication.

    2. Abra http://127.0.0.1:8848/nacos (nome de usuário e senha: nacos).

    3. Escolha Service Management > Service List. Confirme se service-consumer aparece na lista.

Etapa 3: Testar localmente

Com ambos os serviços em execução, envie requisições de teste do consumidor para o provedor.

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: Insira as seguintes URLs no navegador:

http://127.0.0.1:18082/echo-rest/rest-rest
http://127.0.0.1:18082/echo-feign/feign-rest

Ambos os endpoints retornam o parâmetro de caminho como corpo da resposta, confirmando que o consumidor descobriu e chamou o provedor com sucesso.

Etapa 4: Implantar no SAE

Implante nacos-service-provider e nacos-service-consumer como duas aplicações separadas. Ambas devem estar na mesma região e namespace para que a descoberta de serviços funcione.

Para instruções detalhadas de implantação, consulte Implantar uma aplicação Java.

Defina o Application runtime environment com base no tipo de pacote:

Tipo de pacote

Application runtime environment

Pacote JAR

Standard Java Application Runtime Environment

Pacote WAR

apache-tomcat-XXX

Quando a aplicação inicia no SAE, o registro de serviços integrado injeta automaticamente o endereço do Nacos Server, porta de serviço, namespace, AccessKey e Context-path. Esses valores têm precedência sobre quaisquer definições em application.properties. Você pode manter ou remover a configuração original, pois ambas as abordagens funcionam.

Etapa 5: Verificar a implantação

  1. Vincule um Classic Load Balancer (CLB) público à aplicação nacos-service-consumer. Ao configurar o acesso público, defina Network Protocol como HTTP, HTTP Port como 80 e Container Port como 18082. Para detalhes, consulte Vincular um CLB a uma aplicação.

  2. No navegador, insira o endereço IP público do CLB em um destes formatos:

    http://<public-IP-address>/echo-rest/rest-rest
    http://<public-IP-address>/echo-feign/feign-rest

    Uma resposta exibida na página confirma que a implantação funciona corretamente.

Referência de configuração

Propriedades de configuração do Spring Cloud Alibaba Nacos Discovery para o application.properties:

Chave

Padrão

Descrição

spring.cloud.nacos.discovery.server-addr

Nenhum

Endereço IP e porta do Nacos Server

spring.cloud.nacos.discovery.service

${spring.application.name}

Nome sob o qual o serviço se registra

spring.cloud.nacos.discovery.network-interface

Nenhum

Interface de rede usada para registro; usa a primeira interface disponível se não for definida

spring.cloud.nacos.discovery.ip

Nenhum

Endereço IP explícito para registro (tem precedência sobre a detecção de interface)

spring.cloud.nacos.discovery.port

-1

Porta para registro; detectada automaticamente se não especificada

spring.cloud.nacos.discovery.namespace

Nenhum

Namespace para isolamento de ambiente (por exemplo, separar desenvolvimento de produção)

spring.cloud.nacos.discovery.metadata

Nenhum

Metadados personalizados no formato de mapa

spring.cloud.nacos.discovery.cluster-name

DEFAULT

Nome do cluster Nacos

spring.cloud.nacos.discovery.endpoint

Nenhum

Nome de domínio para resolução dinâmica de endereço do Nacos Server; não necessário ao implantar no SAE

ribbon.nacos.enabled

true

Habilita a integração do Ribbon com o Nacos; não altere a menos que seja necessário

Para a lista completa de opções de configuração, consulte Nacos Discovery.

Próximos passos