SpringCloudAlibaba - Gateway 自定义过滤器工厂

本文详细介绍了SpringCloud Gateway中过滤器工厂的使用,包括内置过滤器工厂如AddRequestHeaderGatewayFilterFactory的配置示例,以及如何实现自定义过滤器工厂,通过继承AbstractGatewayFilterFactory或AbstractNameValueGatewayFilterFactory来创建过滤器。文中还提供了一个自定义日志打印过滤器工厂的具体实例,并展示了如何修改请求和交换信息。核心API包括exchange.getRequest().mutate().build()用于修改请求,exchange.mutate().build()用于修改交换,以及chain.filter(exchange)用于传递给下一个过滤器处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

Gateway中的过滤器可以为路由添加业务逻辑,修改请求以及响应


环境

Spring Cloud Hoxton.SR9 + Spring Cloud Alibaba 2.2.6.RELEASE


Gateway过滤器的生命周期

  • pre: Gateway转发请求之前
  • post: Gateway转发请求之后

过滤器工厂

内置过滤器工厂

  • AddRequestHeader GatewayFilter Factory示例,为原始请求添加请求参数foo=bar
gateway:
  discovery:
    locator:
      # 让gateway通过服务发现组件找到其他的微服务
      enabled: true
  routes:
    - id: user-center
      uri: lb://user-center
      predicates:
        - Path=/**
      filters:
        - AddRequestParameter=foo, bar
  • 输入日志

在这里插入图片描述


自定义过滤器工厂

自定义过滤器工厂 - 实现方式

  • 实现自定义过滤器工厂有两种方式
继承 AbstractGatewayFilterFactory
继承 AbstractNameValueGatewayFilterFactory

自定义过滤器工厂 - 具体实例

  • 实现自定义过滤器工厂 - 日志打印
  • application.yml
gateway:
  discovery:
    locator:
      # 让gateway通过服务发现组件找到其他的微服务
      enabled: true
  routes:
    - id: user-center
      uri: lb://user-center
      predicates:
        - Path=/**
      filters:
        - PreLog=参数1,参数2
  • PreLogGatewayFilterFactory.java
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractNameValueGatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;

/**
 * 自定义过滤器工厂 - 日志打印
 * 必须以GatewayFilterFactory结尾
 */
@Slf4j
@Component
public class PreLogGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {
    @Override
    public GatewayFilter apply(NameValueConfig config) {
        return ((exchange, chain) -> {
            log.info("自定义过滤器工厂 - 日志打印参数:{},{}", config.getName(), config.getValue());

            // 修改请求
            ServerHttpRequest modifiedRequest = exchange.getRequest()
                    .mutate()
                    .build();

            // 修改exchange
            ServerWebExchange modifiedExchange = exchange.mutate()
                    .request(modifiedRequest)
                    .build();

            // 传递给下一个过滤器处理
            return chain.filter(modifiedExchange);
        });
    }
}
  • 访问GATEWAY_URL/**

在这里插入图片描述


自定义过滤器工厂- 核心API

exchange.getRequest().mutate().xxx // 修改request
exchange.mutate().xxx // 修改exchange
chain.filter(exchange) // 传递给下一个过滤器处理
exchange.getResponse() // 拿到响应

- End -
- 个人学习笔记 -
- 仅供参考 -

<think>嗯,用户问的是关于Spring Cloud Alibaba整合Gateway的介绍。首先,我需要确定用户对这两个组件的了解程度。可能他们有一定的Spring Cloud基础,但可能不太清楚如何将Spring Cloud AlibabaGateway结合起来使用。所以,我需要先简要介绍这两个组件,然后说明整合的必要性和步骤。 首先,Spring Cloud Alibaba是阿里巴巴提供的微服务解决方案,包含Nacos、Sentinel等组件,用于服务发现、配置管理、限流等。而Spring Cloud GatewaySpring官方提供的API网关,负责路由、过滤、负载均衡等。整合它们可以构建一个完整的微服务架构。 接下来,用户可能需要具体的整合步骤。我应该分步骤说明,比如创建项目、添加依赖、配置Nacos和Gateway的路由规则,以及如何集成Sentinel进行限流。要注意依赖版本之间的兼容性,比如Spring Boot、Spring CloudSpring Cloud Alibaba的版本对应,这是容易出错的地方,需要提醒用户注意。 然后,考虑用户可能的实际应用场景,比如动态路由配置,这时候需要提到Nacos作为配置中心,动态更新路由规则。另外,整合Sentinel做网关限流也是一个常见需求,应该给出示例配置。 还要注意可能的常见问题,比如依赖冲突、配置错误等,可以给出一些排查建议,比如检查版本是否匹配,配置文件是否正确,以及如何通过日志调试。 用户可能有不同的使用场景,比如是否需要服务注册发现,或者只是用配置中心。因此,在整合步骤中需要明确说明如何注册到Nacos,并确保服务发现的功能正常。 最后,是否需要代码示例?可能需要提供一个简单的application.yml配置示例,说明路由规则和Nacos的配置,以及Sentinel的集成部分。这样用户可以直接参考示例进行配置,减少出错的可能。 总结下来,回答的结构应该是先介绍两者,再说明整合的好处,然后详细步骤,包括依赖配置、路由设置、动态配置和限流整合,最后给出注意事项和常见问题解决方法。同时,确保语言简洁明了,避免过于技术化的术语,让不同层次的用户都能理解。</think>Spring Cloud AlibabaSpring Cloud Gateway 整合可以构建一个功能完善的微服务网关,结合阿里巴巴生态组件(如 Nacos、Sentinel)实现动态路由、流量控制和服务治理。以下是整合的核心要点和步骤: --- ### **1. 核心组件作用** - **Spring Cloud Gateway**:API 网关,负责路由转发、鉴权、限流、熔断等。 - **Nacos**:服务注册与配置中心,实现服务发现和动态路由配置。 - **Sentinel**:流量控制与熔断降级,保护网关和后端服务。 --- ### **2. 整合步骤** #### **2.1 创建项目并添加依赖** 在 `pom.xml` 中添加关键依赖: ```xml <!-- Spring Cloud Alibaba 基础依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <!-- Spring Cloud Gateway --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> ``` #### **2.2 配置文件(application.yml)** 配置 Nacos 服务发现和 Gateway 路由: ```yaml server: port: 8080 spring: application: name: api-gateway cloud: nacos: discovery: server-addr: localhost:8848 # Nacos 地址 gateway: discovery: locator: enabled: true # 开启服务发现路由 routes: - id: user-service uri: lb://user-service # 负载均衡到 user-service predicates: - Path=/user/** # 匹配路径 filters: - StripPrefix=1 # 去掉前缀 /user sentinel: transport: dashboard: localhost:8080 # Sentinel 控制台地址 ``` --- ### **3. 动态路由与 Nacos 整合** 通过 Nacos 配置中心动态更新路由规则: 1. 在 Nacos 控制台创建 `Data ID` 为 `gateway-routes.json` 的配置文件。 2. 配置内容示例: ```json [ { "id": "order-service", "predicates": [{"name": "Path", "args": {"pattern": "/order/**"}}], "filters": [{"name": "StripPrefix", "args": {"parts": 1}}], "uri": "lb://order-service", "order": 0 } ] ``` 3. 在 Gateway 中启用 Nacos 动态路由: ```java @Bean public NacosRouteDefinitionRepository nacosRouteDefinitionRepository() { return new NacosRouteDefinitionRepository(); } ``` --- ### **4. 整合 Sentinel 实现网关限流** 配置 Sentinel 对网关流量进行控制: 1. **添加依赖**: ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId> </dependency> ``` 2. **在 Sentinel 控制台配置流控规则**: - 针对路由 ID(如 `user-service`)设置 QPS 阈值。 3. **自定义限流异常响应**: ```java @Bean public GatewayCallbackManager sentinelGatewayCallbackManager() { GatewayCallbackManager.setBlockHandler((exchange, ex) -> { return ServerResponse.status(429) .body(BodyInserters.fromValue("Too many requests!")); }); return new GatewayCallbackManager(); } ``` --- ### **5. 注意事项** 1. **版本兼容性**:确保 Spring Boot、Spring CloudSpring Cloud Alibaba 版本匹配(例如:Spring Boot 2.6.x + Spring Cloud 2021.x + Spring Cloud Alibaba 2021.0.5.0)。 2. **路由优先级**:通过 `order` 字段控制路由匹配顺序。 3. **过滤器链**:可自定义全局过滤器(GlobalFilter)实现鉴权、日志等逻辑。 --- ### **6. 总结** 通过整合 Spring Cloud AlibabaGateway,可以实现: - **动态路由**:基于 Nacos 实时更新路由规则。 - **流量治理**:通过 Sentinel 实现网关级限流和熔断。 - **服务发现**:自动发现后端微服务实例。 此方案适合需要高可用、动态扩展的微服务架构,典型场景如电商秒杀、API 开放平台等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Maggieq8324

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值