Spring Cloud Gateway
Spring Cloud Gateway 是一个基于 Spring Framework 和 Spring Boot 构建的 API 网关,旨在提供一种简单而有效的方式来路由和处理 API 请求。它是 Spring Cloud 生态系统的一部分,专为微服务架构设计,提供了动态路由、过滤器、负载均衡、熔断器等功能。
主要功能
- 动态路由:根据请求的 URL、请求头、请求参数等动态地将请求路由到不同的微服务。
- 过滤器:在请求和响应的生命周期中应用各种过滤器,如身份验证、日志记录、限流等。
- 负载均衡:集成了 Spring Cloud LoadBalancer,可以在多个实例之间分发请求。
- 熔断器:集成了 Resilience4j,可以在服务不可用时提供降级处理。
- 监控和追踪:集成了 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 {
// 在这里定义你的过滤器配置
}
}
解释
- 继承
AbstractGatewayFilterFactory:AuthenticationGatewayFilterFactory继承了AbstractGatewayFilterFactory,并指定了配置类Config。 - 构造函数:调用父类构造函数,传递配置类
Config。 - apply 方法:实现过滤器逻辑。在这个示例中,过滤器检查请求头中的身份验证信息,如果未通过身份验证,则返回 401 响应;否则,继续处理请求。
- isAuthenticated 方法:实现身份验证逻辑,检查请求头中的身份验证令牌。
- 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 会自动识别并映射这些类名的前缀部分作为过滤器名称。
过滤器名称映射规则
- 类名后缀:过滤器工厂类的名称必须以
GatewayFilterFactory结尾。 - 过滤器名称:在配置文件中使用过滤器时,只需要使用类名的前缀部分。例如,
AuthenticationGatewayFilterFactory类的前缀是Authentication,因此在配置文件中可以使用Authentication来引用这个过滤器。