1. Introducción y conceptos básicos de Spring Cloud Gateway
En la arquitectura de microservicios, la puerta de enlace API es un componente muy importante, que puede ayudarnos a implementar funciones como el enrutamiento de servicios, el equilibrio de carga, la autenticación y la autorización. Spring Cloud Gateway es una implementación de puerta de enlace API basada en Spring 5, Spring Boot 2 y Project Reactor lanzada oficialmente por Spring Cloud. Este artículo presentará los conceptos básicos, los componentes principales y cómo configurar y usar Spring Cloud Gateway.
1.1 ¿Qué es Spring Cloud Gateway?
Spring Cloud Gateway es una implementación de puerta de enlace API basada en Spring Boot, Spring WebFlux y Project Reactor, que proporciona una manera simple y eficiente de construir una puerta de enlace API en una arquitectura de microservicio. Las funciones principales de Spring Cloud Gateway incluyen:
- Enrutamiento: reenvía la solicitud al microservicio correspondiente de acuerdo con la ruta solicitada, el método y otra información
- Filtrado: procesar solicitudes antes o después de que se reenvíen, como agregar, modificar encabezados de solicitud, encabezados de respuesta, etc.
- Aserción: juzgar si se cumple una condición en función de la información solicitada, como si la ruta de la solicitud coincide con una expresión regular
- Equilibrio de carga: distribuya las solicitudes entre varias instancias para lograr una alta disponibilidad y rendimiento
1.2 Comparación entre Spring Cloud Gateway y otras puertas de enlace API
Hay muchas implementaciones de puertas de enlace API en el mercado, como Nginx, Zuul, Kong, etc. En comparación con estas puertas de enlace API, Spring Cloud Gateway tiene las siguientes ventajas:
- Basado en Spring Boot y Spring Cloud, está más integrado con el ecosistema Spring
- Mayor rendimiento con E/S sin bloqueo y un modelo de programación reactiva
- Proporciona una gran cantidad de filtros y aserciones, que pueden implementar fácilmente varias funciones.
- Admite enrutamiento dinámico y configuración dinámica, más flexible
1.3 Componentes principales de Spring Cloud Gateway
Los componentes principales de Spring Cloud Gateway incluyen principalmente lo siguiente:
- Ruta: una ruta es el componente básico de una puerta de enlace, que define cómo se reenvían las solicitudes a los microservicios. Una ruta consta de un ID, una aserción y una cadena de filtros.
- Predicado: se utiliza una aserción para determinar si una solicitud cumple una determinada condición, como si la ruta de la solicitud coincide con una expresión regular. Las aserciones se pueden utilizar para aplicar filtros de forma selectiva o enrutar solicitudes.
- Filter (filtro): El filtro se utiliza para procesar la solicitud antes o después de que se reenvíe la solicitud, como agregar y modificar encabezados de solicitud, encabezados de respuesta, etc. Los filtros se dividen en filtros locales y filtros globales. Los filtros locales solo funcionan en rutas específicas, mientras que los filtros globales funcionan en todas las rutas.
- LoadBalancer: se utiliza un equilibrador de carga para distribuir solicitudes entre varias instancias para lograr una alta disponibilidad y un alto rendimiento. Spring Cloud Gateway integra Spring Cloud LoadBalancer, que puede lograr fácilmente el equilibrio de carga.
2. Configuración y uso de Spring Cloud Gateway
A continuación, presentaremos cómo construir y configurar Spring Cloud Gateway y cómo usar funciones como aserciones, filtros y enrutamiento.
2.1 Cómo construir y configurar Spring Cloud Gateway
Para crear un proyecto Spring Cloud Gateway, primero debe crear un proyecto Spring Boot y agregar las siguientes dependencias:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
Luego, configure Spring Cloud Gateway en el archivo application.yml
o application.properties
de la siguiente manera:
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/user/**
filters:
- StripPrefix=1
La configuración anterior define una user-service
ruta llamada , cuando la ruta de la solicitud /user
comienza con , la solicitud se reenviará al user-service
microservicio. StripPrefix=1
Indica eliminar la primera parte de la ruta (es decir, ) antes de reenviar la solicitud /user
.
2.2 Uso de aserciones
2.2.1 Aserciones incorporadas
Spring Cloud Gateway proporciona algunas aserciones integradas, como Path
, Method
, Header
etc. Estos son algunos ejemplos de afirmaciones integradas de uso común:
Path=/user/**
:/user
Solicitudes de coincidencia cuya ruta comienza conMethod=GET
: coincide con las solicitudes GETHeader=X-Requested-With, XMLHttpRequest
: Solicitudes de coincidencia que contienenX-Requested-With
un encabezado con un valor deXMLHttpRequest
2.2.2 Aserciones personalizadas
Además de las aserciones integradas, también podemos personalizar las aserciones. Para crear una aserción personalizada, implemente GatewayPredicate
la interfaz y regístrela como Spring Bean. Aquí hay un ejemplo de una aserción personalizada simple:
@Component
public class CustomPredicate implements GatewayPredicate {
@Override
public boolean test(ServerWebExchange exchange) {
// 自定义断言逻辑
return true;
}
@Override
public GatewayPredicate negate() {
return new CustomPredicate();
}
}
2.3 Uso de filtros
2.3.1 Filtros locales
Los filtros locales son filtros que solo se aplican a rutas específicas. Para crear un filtro parcial, implemente GatewayFilter
la interfaz y regístrela como Spring Bean. Aquí hay un ejemplo de un filtro parcial simple:
@Component
public class CustomFilter implements GatewayFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 在请求被转发之前的处理逻辑
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
// 在请求被转发之后的处理逻辑
}));
}
}
2.3.2 Filtros globales
Los filtros globales son filtros que se aplican a todas las rutas. Para crear un filtro global, implemente GlobalFilter
la interfaz y regístrela como Spring Bean. Aquí hay un ejemplo de un filtro global simple:
@Component
public class CustomGlobalFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 在请求被转发之前的处理逻辑
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
// 在请求被转发之后的处理逻辑
}));
}
}
2.3.3 Filtros personalizados
Además de los filtros incorporados, también podemos personalizar filtros. Para crear un filtro personalizado, implemente GatewayFilterFactory
la interfaz y regístrela como Spring Bean. Aquí hay un ejemplo de un filtro personalizado simple:
@Component
public class CustomFilterFactory implements GatewayFilterFactory<CustomFilterFactory.Config> {
@Override
public GatewayFilter apply(Config config) {
return new CustomFilter(config);
}
@Override
public Class<Config> getConfigClass() {
return Config.class;
}
public static class Config {
// 自定义过滤器配置
}
}
2.4 Uso de enrutamiento
2.4.1 Enrutamiento basado en el equilibrio de carga del clúster
Spring Cloud Gateway integra Spring Cloud LoadBalancer, que puede lograr fácilmente el equilibrio de carga. Para usar el balanceo de carga, simplemente establezca el URI de la ruta en lb://<service-id>
algo como esto:
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/user/**
2.4.2 Realización de enrutamiento dinámico
Spring Cloud Gateway admite enrutamiento dinámico y la configuración de enrutamiento se puede modificar en tiempo de ejecución. Para implementar el enrutamiento dinámico, debe implementar RouteDefinitionLocator
la interfaz y registrarla como Spring Bean. Aquí hay un ejemplo de una ruta dinámica simple:
@Component
public class CustomRouteDefinitionLocator implements RouteDefinitionLocator {
@Override
public Flux<RouteDefinition> getRouteDefinitions() {
// 从数据库、配置中心等地方获取路由配置
List<RouteDefinition> routeDefinitions = new ArrayList<>();
return Flux.fromIterable(routeDefinitions);
}
}
2.4.3 Recuperar las rutas definidas en el gateway
Para recuperar las rutas definidas en la puerta de enlace, RouteLocator
se puede utilizar la interfaz. Aquí hay un ejemplo simple:
@Autowired
private RouteLocator routeLocator;
public void printRoutes() {
routeLocator.getRoutes().subscribe(route -> {
System.out.println("Route ID: " + route.getId());
System.out.println("Route URI: " + route.getUri());
});
}
Resumir
A través de la introducción anterior, creo que todos tienen una cierta comprensión de Spring Cloud Gateway. En proyectos reales, podemos usar de manera flexible funciones como aserción, filtro y enrutamiento de acuerdo con los requisitos para construir una poderosa puerta de enlace API con un rendimiento superior.