header_lecciones_v5

Cómo crear una API Gateway con Zuul2

por Santiago Montoya, el 16 de diciembre de 2019

Cómo crear una API Gateway con Zuul2

¿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

https://start.spring.io/

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

Cómo crear una API Gateway con Zuul2 1

Después agregamos las dependencia Spring Web:

Cómo crear una API Gateway con Zuul2 #2

Para generar el proyecto le damos en el botón “Generate - Ctrl +”

Cómo crear una API Gateway con Zuul2 #3

 

2) Importar el proyecto en su IDE preferido

Después de descargar el proyecto, entramos al IDE e importamos un proyecto Maven

Cómo crear una API Gateway con Zuul2 #4

Cómo crear una API Gateway con Zuul2 #5

Cómo crear una API Gateway con Zuul2 #6

Al terminar de importar, abrimos el archivo pom.xml y agregamos las siguientes dependencias

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

3) Implementación de Zuul

Nos dirigimos a la clase principal y agregamos la anotación
@EnableZuulProxy

Cómo crear una API Gateway con Zuul2 #7

Creamos un paquete donde estarán los filtros de Zuul

Cómo crear una API Gateway con Zuul2 #8

Dentro de cada clase extendemos de ZuulFilter y agregamos los métodos de ZuulFilter que no se han implementado:

Cómo crear una API Gateway con Zuul2 #9

Cómo crear una API Gateway con Zuul2 #10

En cada método podemos indicar si se debe usar el filtro, que funcion tiene el filtro, tipo de filtro y orden de filtros.

Cómo crear una API Gateway con Zuul2 #11

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

Cómo crear una API Gateway con Zuul2 #12

 

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:

Cómo crear una API Gateway con Zuul2 #13

Consumiendo servicio de clientes:

Cómo crear una API Gateway con Zuul2 #14

 

Nuevo llamado a la acción

Temas:Tecnologia e Innovación

Lecciones Pragma

Lecciones en Academia Pragma

Aquí encontrarás tutoriales técnicos para que apliques en temas de desarrollo de software, cloud, calidad en software y aplicaciones móviles. 

También puedes visitar nuestro Blog con contenido actual sobre Transformación Digital, Marketing, Conocimiento de Usuario y más. 

Blog

Suscríbete a la academia

Descarga la Guía para trabajar con ambientes IBM Websphere Portal