SpringCloud Gateway

66 阅读4分钟

Spring Cloud Gateway

Spring Cloud Gateway 是一个基于 Spring Framework 和 Spring Boot 构建的 API 网关,旨在提供一种简单而有效的方式来路由和处理 API 请求。它是 Spring Cloud 生态系统的一部分,专为微服务架构设计,提供了动态路由、过滤器、负载均衡、熔断器等功能。

主要功能
  1. 动态路由:根据请求的 URL、请求头、请求参数等动态地将请求路由到不同的微服务。
  2. 过滤器:在请求和响应的生命周期中应用各种过滤器,如身份验证、日志记录、限流等。
  3. 负载均衡:集成了 Spring Cloud LoadBalancer,可以在多个实例之间分发请求。
  4. 熔断器:集成了 Resilience4j,可以在服务不可用时提供降级处理。
  5. 监控和追踪:集成了 Spring Cloud Sleuth 和 Zipkin,可以对请求进行分布式追踪和监控。

AbstractGatewayFilterFactory

AbstractGatewayFilterFactory 是 Spring Cloud Gateway 中的一个抽象类,用于创建自定义的网关过滤器工厂。通过继承这个类,可以定义自己的过滤器逻辑,并将其应用到网关的路由中。

主要方法
  • apply:用于应用过滤器逻辑。
  • shortcutFieldOrder:定义过滤器配置的字段顺序。
  • name:返回过滤器的名称。

示例代码

以下是一个自定义网关过滤器工厂的示例代码:

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
public class AuthenticationGatewayFilterFactory extends AbstractGatewayFilterFactory<AuthenticationGatewayFilterFactory.Config> {

    public AuthenticationGatewayFilterFactory() {
        super(Config.class);
    }

    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {
            // 在这里添加你的过滤器逻辑
            // 例如,检查请求头中的身份验证信息
            if (!isAuthenticated(exchange)) {
                // 如果未通过身份验证,返回 401 响应
                exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
                return exchange.getResponse().setComplete();
            }
            // 如果通过身份验证,继续处理请求
            return chain.filter(exchange);
        };
    }

    private boolean isAuthenticated(ServerWebExchange exchange) {
        // 在这里实现你的身份验证逻辑
        // 例如,检查请求头中的身份验证令牌
        String authHeader = exchange.getRequest().getHeaders().getFirst(HttpHeaders.AUTHORIZATION);
        return authHeader != null && authHeader.startsWith("Bearer ");
    }

    public static class Config {
        // 在这里定义你的过滤器配置
    }
}

解释

  1. 继承 AbstractGatewayFilterFactoryAuthenticationGatewayFilterFactory 继承了 AbstractGatewayFilterFactory,并指定了配置类 Config
  2. 构造函数:调用父类构造函数,传递配置类 Config
  3. apply 方法:实现过滤器逻辑。在这个示例中,过滤器检查请求头中的身份验证信息,如果未通过身份验证,则返回 401 响应;否则,继续处理请求。
  4. isAuthenticated 方法:实现身份验证逻辑,检查请求头中的身份验证令牌。
  5. Config 类:定义过滤器的配置,可以根据需要添加配置字段。

使用自定义过滤器

在 Spring Cloud Gateway 的配置文件中,可以将自定义过滤器应用到路由中:

spring:
  cloud:
    gateway:
      routes:
        - id: my_route
          uri: http://example.com
          filters:
            - name: AuthenticationGatewayFilterFactory
动态编程方式

通过 Java 代码动态配置路由,并应用自定义过滤器:

import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GatewayConfig {

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("example_route", r -> r.path("/example/**")
                        .filters(f -> f.filter(new AuthenticationGatewayFilterFactory().apply(new AuthenticationGatewayFilterFactory.Config())))
                        .uri("http://example.com"))
                .build();
    }
}

总结

Spring Cloud Gateway 是一个强大的 API 网关框架,提供了动态路由、过滤器、负载均衡等功能。通过继承 AbstractGatewayFilterFactory,可以创建自定义的网关过滤器,并将其应用到网关的路由中。自定义过滤器可以实现各种功能,如身份验证、日志记录、限流等。

QA 1

Question

我这边的配置是: spring.cloud.gateway.routes.filters: -Authentication,并没有 name,这个应该怎么理解,是怎么关联到具体的 Filter 类的?

Answer

在 Spring Cloud Gateway 中,spring.cloud.gateway.routes.filters 配置项用于指定要应用于路由的过滤器。每个过滤器通常通过其名称来引用。如果你在配置中使用了 - Authentication 这样的简写形式,Spring Cloud Gateway 会自动将其映射到相应的过滤器工厂类。

过滤器名称映射

Spring Cloud Gateway 使用过滤器工厂类的名称来映射配置中的过滤器。例如,如果你有一个自定义过滤器工厂类 AuthenticationGatewayFilterFactory,那么在配置中可以使用 Authentication 来引用它。

在 Spring Cloud Gateway 中,过滤器工厂类的名称约定是以 GatewayFilterFactory 作为后缀。Spring Cloud Gateway 会自动识别并映射这些类名的前缀部分作为过滤器名称。

过滤器名称映射规则

  1. 类名后缀:过滤器工厂类的名称必须以 GatewayFilterFactory 结尾。
  2. 过滤器名称:在配置文件中使用过滤器时,只需要使用类名的前缀部分。例如,AuthenticationGatewayFilterFactory 类的前缀是 Authentication,因此在配置文件中可以使用 Authentication 来引用这个过滤器。