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:
Baixe e extraia o pacote do Nacos Server.
-
Inicie o Nacos no modo standalone:
Linux, Unix ou macOS:
sudo sh startup.sh -m standaloneWindows:
startup.cmd -m standalone
A flag-m standaloneinicia o Nacos no modo standalone em vez do modo cluster. No Windows, clicar duas vezes no arquivostartup.cmdinicia 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 ostartup.cmdem um editor de texto, definaMODE="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 |

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.

Notas sobre registro autogerenciado

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

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.
Crie um projeto Maven chamado
nacos-service-provider.-
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:
Em
src/main/java, crie o pacotecom.aliware.edas.-
No pacote
com.aliware.edas, crie a classe de inicializaçãoProviderApplication. A anotação@EnableDiscoveryClientativa 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); } } -
No pacote
com.aliware.edas, crie a classeEchoController. 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; } } -
Em
src/main/resources, crie o arquivoapplication.propertiese 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:8848Se o Nacos Server estiver em outro host, substitua
127.0.0.1pelo endereço IP correspondente. Para todas as opções de configuração disponíveis, consulte a Referência de configuração. -
Verifique o registro:
Execute o método
mainda classeProviderApplication.Abra
http://127.0.0.1:8848/nacosno navegador. O nome de usuário e a senha padrão são ambosnacos.No painel de navegação à esquerda, escolha Service Management > Service List. O serviço
service-providerdeve 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).
Crie um projeto Maven chamado
nacos-service-consumer.-
Adicione o seguinte ao
pom.xml. O consumidor adicionaspring-cloud-starter-openfeignalé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> Em
src/main/java, crie o pacotecom.aliware.edas.-
No pacote
com.aliware.edas, crie a interfaceEchoService. A anotação@FeignClientvincula a interface ao serviçoservice-providerregistrado 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); } -
No pacote
com.aliware.edas, crie a classe de inicializaçãoConsumerApplication:@EnableDiscoveryClient— registra o consumidor no Nacos@EnableFeignClients— ativa a varredura do FeignClient@LoadBalancedno beanRestTemplate— 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); } } -
No pacote
com.aliware.edas, crie a classeTestControllerpara 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); } } -
Em
src/main/resources, crie o arquivoapplication.properties:spring.application.name=service-consumer server.port=18082 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 -
Verifique o registro:
Execute o método
mainda classeConsumerApplication.Abra
http://127.0.0.1:8848/nacos(nome de usuário e senha:nacos).Escolha Service Management > Service List. Confirme se
service-consumeraparece 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
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 como80e Container Port como18082. Para detalhes, consulte Vincular um CLB a uma aplicação.-
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-restUma 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 |
|
|
Nenhum |
Endereço IP e porta do Nacos Server |
|
|
|
Nome sob o qual o serviço se registra |
|
|
Nenhum |
Interface de rede usada para registro; usa a primeira interface disponível se não for definida |
|
|
Nenhum |
Endereço IP explícito para registro (tem precedência sobre a detecção de interface) |
|
|
|
Porta para registro; detectada automaticamente se não especificada |
|
|
Nenhum |
Namespace para isolamento de ambiente (por exemplo, separar desenvolvimento de produção) |
|
|
Nenhum |
Metadados personalizados no formato de mapa |
|
|
|
Nome do cluster Nacos |
|
|
Nenhum |
Nome de domínio para resolução dinâmica de endereço do Nacos Server; não necessário ao implantar no SAE |
|
|
|
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.