Elaborar en Spring Cloud Gateway

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.ymlo application.propertiesde 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-serviceruta llamada , cuando la ruta de la solicitud /usercomienza con , la solicitud se reenviará al user-servicemicroservicio. StripPrefix=1Indica 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, Headeretc. Estos son algunos ejemplos de afirmaciones integradas de uso común:

  • Path=/user/**: /userSolicitudes de coincidencia cuya ruta comienza con
  • Method=GET: coincide con las solicitudes GET
  • Header=X-Requested-With, XMLHttpRequest: Solicitudes de coincidencia que contienen X-Requested-Withun 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 GatewayPredicatela 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 GatewayFilterla 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 GlobalFilterla 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 GatewayFilterFactoryla 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 RouteDefinitionLocatorla 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, RouteLocatorse 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.

Supongo que te gusta

Origin blog.csdn.net/heihaozi/article/details/131452119
Recomendado
Clasificación