Cómo crear una API Gateway con Zuul2
por Santiago Montoya, el 16 de diciembre de 2019
¿Qué es Zuul?
Zuul es una librería generada por Netflix para tener un solo punto de acceso (gateway) a todo los componentes que hacen parte de nuestro sistema. Por medio de este podemos gestionar el acceso a diferentes microservicios en vez de que cada uno tenga un punto de acceso único.
Zuul proporciona un completo control del punto de acceso para poder gestionar de una manera dinámica el enrutamiento y filtrado de las peticiones que se hacen a través de la misma.
Generación y Configuración de un proyecto con Zuul2
1) Crear proyecto con el inicializador de Spring Boot
Por medio del link anterior configuramos el nuevo proyecto a generar:
Group: Grupo al que pertenece
Artifact: Identificador del artefacto a generar
Description: Descripción del proyecto
Después agregamos las dependencia Spring Web:
Para generar el proyecto le damos en el botón “Generate - Ctrl +”
2) Importar el proyecto en su IDE preferido
Después de descargar el proyecto, entramos al IDE e importamos un proyecto Maven
Al terminar de importar, abrimos el archivo pom.xml y agregamos las siguientes dependencias
<properties>
3) Implementación de Zuul
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR3</spring-cloud.version>
</properties>
<!-- https://mvnrepository.com/artifact/com.netflix.zuul/zuul-core -->
<dependency>
<groupId>com.netflix.zuul</groupId>
<artifactId>zuul-core</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-zuul -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<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>
Nos dirigimos a la clase principal y agregamos la anotación
@EnableZuulProxy
Creamos un paquete donde estarán los filtros de Zuul
Dentro de cada clase extendemos de ZuulFilter y agregamos los métodos de ZuulFilter que no se han implementado:
En cada método podemos indicar si se debe usar el filtro, que funcion tiene el filtro, tipo de filtro y orden de filtros.
Sí shouldFilter() retorna verdadero, quiere decir que este filtro se debe de usar, por ende cuando pasen por la gateway entrara al método run() en el cual tendremos nuestra lógica para controlar las peticiones.
FilterType() indica que tipo de filtro es el que se está usando, acepta valores tales como:
- pre
- post
- error
- route
- static
filterOrder() indica el orden en el cual se deben ejecutar los filtros, si tenemos varios activos.
Instanciamos cada clase del paquete de filtros en la clase principal
4) Creacion de archivo application.yml
Creamos el archivo application.yml en la carpeta src/main/resources y lo configuramos con los servicios a los cuales deseamos redireccionar;
spring:
application:
name: leccion-zuul
server:
port: 8080
# Zuul routes.
# Here for /login path, we are routing to localhost:8081
# Here for /product path, we are routing to localhost:8082
# Here for /customer path, we are routing to localhost:8083
zuul:
routes:
product-service:
url: http://localhost:8082/product
path: /product/**
service-id: product-service
customer-service:
url: http://localhost:8083/customer
path: /customer/**
service-id: customer-service
# Disable accessing services using service name (i.e. gallery-service).
# They should be only accessed through the path defined below.
# Link: https://stackoverflow.com/questions/46317388/zuul-service-name-exposed-instead-of-route-path-only
ignored-services: '*'
ignoreSecurityHeaders: false
sensitiveHeaders: Cookie,Set-Cookie
En mi caso ya tengo dos servicios activos que son Productos (Product) y Clientes (Customer) por lo cual yo podremos acceder a ellos por medio de Zuul;
Consumiendo servicio de productos:
Consumiendo servicio de clientes: