Configurando um Gateway com Spring Cloud Gateway e Eureka

Pré-requisitos do Ambiente de Desenvolvimento

Para este projeto, utilizei as seguintes versões de ferramentas e frameworks:

  • JDK: 1.8
  • Spring Boot: 2.0.1.RELEASE
  • Spring Cloud: Finchley.RELEASE
  • Maven: 3.3.9
  • IDE: IntelliJ IDEA

É fundamental verificar a compatibilidade entre as versões do Spring Boot e do Spring Cloud. A tabela abaixo mostra algumas corrsepondências conhecidas:

Spring Boot Spring Cloud
1.5.x.RELEASE Edgware.SR5
2.0.1.RELEASE Finchley.RC1
2.0.3.RELEASE Finchley.SR4
2.1.0.RELEASE Greenwich.SR2

Consulte sempre o portal oficial para informações atualizadas: https://start.spring.io/actuator/info

Definição das Dependências no Maven

O arquivo pom.xml abaixo configura um projeto Maven com as bibliotecas necessárias para o Spring Cloud Gateway integrado ao Eureka:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example.microservices</groupId>
    <artifactId>api-gateway</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
        <relativePath/>
    </parent>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

Nota importante: o spring-cloud-starter-gateway utiliza o modelo reativo baseado em Netty. Por isso, é necessário excluir a dependência spring-boot-starter-web e incluir explicitamente o spring-boot-starter-webflux.

Configuração da Aplicação

Crie o arquivo application.yml no diretório src/main/resources com as seguintes propriedades:

server:
  port: 9000

spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
          lower-case-service-id: true

eureka:
  client:
    service-url:
      default-zone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true
    instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}

management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    conditions:
      enabled: true

Os parâmetros spring.cloud.gateway.discovery.locator.enabled e lower-case-service-id permitem que o gateway descubra automaticamente os serviços registrados no Eureka e roteie as requisições utilizando os nomes dos serviços em letras minúsculas.

Classe Principal da Aplicação

A classe de inicialização habilita o cliente Eureka e a descoberta de serviços:

package com.example.microservices.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class GatewayServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayServiceApplication.class, args);
    }
}

Ao iniciar a aplicação, o gateway será registrado automaticamente no servidor Eureka e passará a rotear requisições para todos os microserviços disponíveis. Para acessar um serviço regitsrado com o nome order-service, por exemplo, basta enviar a requisição para http://localhost:9000/order-service/**.

Tags: spring-cloud-gateway spring-boot eureka maven netflix-eureka-client

Publicado em 7-7 18:28