Um gateway de serviço encaminha requisições de clientes para microsserviços de backend com base em regras configuráveis, como caminho da URL, cabeçalhos ou parâmetros de consulta. Este tópico explica como construir um gateway usando o Nacos como registro de serviços, com Spring Cloud Gateway ou Spring Cloud Netflix Zuul.
Para pular a configuração passo a passo, baixe os projetos de demonstração completos:
Como o Spring Cloud Gateway encaminha requisições
O Spring Cloud Gateway processa requisições por meio de três construções principais:
|
Construção |
Descrição |
|
Rota |
Bloco básico de construção. Cada rota mapeia uma requisição de entrada para um serviço de backend, definida por um ID, uma URI de destino, um ou mais predicados e filtros opcionais. |
|
Predicado |
Condição de correspondência avaliada na requisição recebida (caminho, cabeçalho, parâmetro de consulta etc.). A rota corresponde quando todos os predicados retornam verdadeiro. |
|
Filtro |
Etapa de processamento que modifica a requisição ou a resposta antes ou depois do encaminhamento. Por exemplo, |
Fluxo da requisição: Cliente -> Gateway Handler Mapping (corresponde a uma rota avaliando predicados) -> Gateway Web Handler (executa a cadeia de filtros) -> Serviço de Backend. Os filtros executam tanto antes quanto depois da requisição proxy, permitindo modificar cabeçalhos, reescrever caminhos ou adicionar autenticação no nível do gateway.
Pré-requisitos
Antes de começar, verifique se você possui:
Maven instalado com variáveis de ambiente configuradas
A versão mais recente do Nacos Server baixada
-
Opcional:
Ao desenvolver aplicações localmente, use o plug-in Alibaba Cloud Toolkit para habilitar chamadas mútuas entre aplicações locais e aplicações implantadas no EDAS, recurso conhecido como interconexão ponta a nuvem. Dessa forma, não é necessário configurar uma VPN, o que aumenta a eficiência do desenvolvimento. Para obter mais informações, consulte Visão geral da interconexão ponta a nuvem.
Inicie o Nacos Server
Descompacte o pacote do Nacos Server baixado.
-
Acesse o diretório
nacos/bine execute o Nacos Server no modo standalone:-
Linux, UNIX ou macOS:
sh startup.sh -m standalone Windows: clique duas vezes em
startup.cmd.
-
Construa um gateway de serviço com Spring Cloud Gateway
O Spring Cloud Gateway foi desenvolvido sobre o Project Reactor e o Spring WebFlux, oferecendo um gateway reativo e não bloqueante.
Etapa 1: Crie o projeto do gateway
Crie um projeto Maven chamado
spring-cloud-gateway-nacos.-
Adicione as seguintes dependências ao arquivo
pom.xml. Este exemplo usa Spring Boot 2.1.4.RELEASE e Spring Cloud Greenwich.SR1:<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.1.1.RELEASE</version> </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> -
Crie a classe de inicialização
GatewayApplication:@SpringBootApplication @EnableDiscoveryClient public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); } }
Etapa 2: Configure as regras de roteamento
Adicione a seguinte configuração ao arquivo application.yaml. Substitua 127.0.0.1:8848 pelo endereço real do seu Nacos Server caso ele esteja em execução em outra máquina.
server:
port: 18012
spring:
application:
name: spring-cloud-gateway-nacos
cloud:
gateway:
routes:
- id: service-provider
uri: lb://service-provider
predicates:
- Path=/provider1/**
filters:
- StripPrefix=1
nacos:
discovery:
server-addr: 127.0.0.1:8848
Esta configuração de rota funciona da seguinte maneira:
|
Componente |
Valor |
Descrição |
|
Predicado |
|
Corresponde a todas as requisições cujo caminho comece com |
|
URI |
|
Encaminha as requisições correspondentes para o serviço |
|
Filtro |
|
Remove o primeiro segmento do caminho antes do encaminhamento. Por exemplo, |
Etapa 3: Inicie o gateway e verifique o registro
Execute a função principal de
GatewayApplicationpara iniciar o gateway.Abra o console do Nacos Server em
http://127.0.0.1:8848/nacos(nome de usuário e senha padrão:nacos).No painel de navegação à esquerda, escolha Service Management > Services. Confirme se
spring-cloud-gateway-nacosaparece na lista de serviços.
Construa um gateway de serviço com Spring Cloud Netflix Zuul
O Zuul é uma opção alternativa de gateway baseada em um modelo de I/O bloqueante, adequada para aplicações que já utilizam a pilha Netflix OSS.
Etapa 1: Crie o projeto do gateway
Crie um projeto Maven chamado
spring-cloud-zuul-nacos.-
Adicione as seguintes dependências ao arquivo
pom.xml. Este exemplo usa Spring Boot 2.1.4.RELEASE, Spring Cloud Greenwich.SR1 e Spring Cloud Alibaba 0.9.0:<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.1.1.RELEASE</version> </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> -
Crie a classe de inicialização
ZuulApplication:@SpringBootApplication @EnableZuulProxy @EnableDiscoveryClient public class ZuulApplication { public static void main(String[] args) { SpringApplication.run(ZuulApplication.class, args); } }
Etapa 2: Configure as regras de roteamento
Adicione a seguinte configuração ao arquivo application.properties. Substitua 127.0.0.1:8848 pelo endereço real do seu Nacos Server caso ele esteja em execução em outra máquina.
spring.application.name=spring-cloud-zuul-nacos
server.port=18022
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
zuul.routes.opensource-provider1.path=/provider1/**
zuul.routes.opensource-provider1.serviceId=service-provider
Essa configuração encaminha todas as requisições com caminho iniciando em /provider1/ para o serviço de backend service-provider.
Etapa 3: Inicie o gateway e verifique o registro
Execute a função principal de
ZuulApplicationpara iniciar o gateway.Abra o console do Nacos Server em
http://127.0.0.1:8848/nacos(nome de usuário e senha padrão:nacos).No painel de navegação à esquerda, escolha Service Management > Services. Confirme se
spring-cloud-zuul-nacosaparece na lista de serviços.
Crie um provedor de serviços
Tanto o Spring Cloud Gateway quanto o Zuul exigem um serviço downstream para encaminhar as requisições. Para detalhes completos, consulte Implementar registro e descoberta de serviços.
O exemplo a seguir cria um provedor de serviços mínimo com um único endpoint /echo/{string}:
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
@RestController
public class EchoController {
@RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
public String echo(@PathVariable String string) {
return string;
}
}
}
Verifique o encaminhamento de requisições
Verificação local
Inicie o gateway e o provedor de serviços e envie uma requisição através do gateway.
Para Spring Cloud Gateway (porta 18012):
curl http://127.0.0.1:18012/provider1/echo/hello
Para Zuul (porta 18022):
curl http://127.0.0.1:18022/provider1/echo/hello
Uma resposta bem-sucedida retorna hello, confirmando que o gateway encaminhou a requisição para service-provider e removeu o prefixo /provider1.

Implantação no EDAS
Implante a aplicação no Enterprise Distributed Application Service (EDAS). Para instruções de implantação, consulte Implementar registro e descoberta de serviços.
O registro de serviços do EDAS é uma versão comercial do Nacos. Ao implantar no EDAS, a plataforma configura automaticamente os detalhes de conexão do Nacos — endereço IP, porta do serviço, namespace, AccessKey ID, AccessKey secret e caminho de contexto. Nenhuma configuração adicional é necessária. Mantenha ou remova as configurações originais do Nacos local conforme necessário.
Compatibilidade de versões
|
Versão do Spring Cloud |
Versão do Spring Cloud Alibaba |
|
Greenwich |
2.1.1.RELEASE |
|
Finchley |
2.0.1.RELEASE |
|
Edgware |
1.5.1.RELEASE |
O Spring Cloud Edgware atingiu o fim da vida útil. Não o utilize para novas aplicações.