Spring Cloud Gateway高级特性之过滤器(Hoxton版本)

本文详细介绍了Spring Cloud Gateway的高级特性——过滤器,包括AddRequestHeader、AddRequestParameter、DedupeResponseHeader等31种过滤器的使用方法和配置示例,展示了如何利用这些过滤器进行请求和响应的修改、断路器功能的添加以及重试、速率限制等高级操作。
摘要由CSDN通过智能技术生成

1.高级特性—过滤器(Filter)

路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用。Spring Cloud Gateway 内置了多种路由过滤器,他们都由GatewayFilter的工厂类来产生,下面将对各个过滤器进行一一说明
Spring Cloud Gateway 内置的过滤器工厂一览表如下:

1.1 AddRequestHeader GatewayFilter

通过配置name和value可以增加请求的header。

spring:
  cloud:
    gateway:
      routes:
        - id: eureka-client-provider #路由的ID
          uri: lb://eureka-client-provider
          predicates:
            - Path=/provider/** # 路由规则
          filters:
            - StripPrefix=1
            # 给请求增加Header X-Request-red
            # 访问http://localhost:9100/provider/demo/hello-> eureka-client-provider/demo/hello
            - AddRequestHeader=X-Request-red, blue

请求http://localhost:9100/provider/demo/hello ,我们可以从后端获取到添加的header头

1.2 AddRequestParameter GatewayFilter

通过配置name和value可以增加请求的参数

spring:
  cloud:
    gateway:
      routes:
        - id: eureka-client-provider #路由的ID
          uri: lb://eureka-client-provider
          predicates:
            - Path=/provider/** # 路由规则
          filters:
            - StripPrefix=1
            # 给请求增加参数name
            # 访问http://localhost:9100/provider/demo/feign -> eureka-client-provider/demo/feign
            - AddRequestParameter=name, Trazen

通过请求http://localhost:9100/provider/demo/feign ,相当于http://localhost:9100/provider/demo/feign?name=Trazen

1.3 AddResponseHeader GatewayFilter

AddResponseHeader GatewayFilter Factory通过配置name和value可以增加响应的header。

spring:
  cloud:
    gateway:
      routes:
        - id: eureka-client-provider #路由的ID
          uri: lb://eureka-client-provider
          predicates:
            - Path=/provider/** # 路由规则
          filters:
            - StripPrefix=1
            # 给请求增加响应的header
            # 访问http://localhost:9100/provider/demo/hello-> eureka-client-provider/demo/hello
            - AddResponseHeader=X-Response-Foo, Bar

通过请求http://localhost:9100/provider/demo/hello 可以看到返回的header中带有配置的值。

1.4 DedupeResponseHeader GatewayFilter

剔除重复的响应头。

spring:
  cloud:
    gateway:
      routes:
        - id: eureka-client-provider #路由的ID
          uri: lb://eureka-client-provider
          predicates:
            - Path=/provider/** # 路由规则
          filters:
            - StripPrefix=1
            #剔除重复的响应头
            - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_FIRST

例如:
我们在Gateway以及微服务上都设置了CORS(解决跨域)header,如果不做任何配置,请求 -> 网关 -> 微服务,获得的响应就是这样的:

Access-Control-Allow-Credentials: true, true
Access-Control-Allow-Origin: https://hxmec.com, https://hxmec.com

也就是Header重复了。要想把这两个Header去重,只需设置成如下即可。

filters:
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin

也就是说,想要去重的Header如果有多个,用空格分隔即可;
去重策略:

  • RETAIN_FIRST: 默认值,保留第一个值
  • RETAIN_LAST: 保留最后一个值
  • RETAIN_UNIQUE: 保留所有唯一值,以它们第一次出现的顺序保留

1.5 Hystrix GatewayFilter

Hystrix 过滤器允许你将断路器功能添加到网关路由中,使你的服务免受级联故障的影响,并提供服务降级处理。

要开启断路器功能,我们需要在pom.xml中添加Hystrix的相关依赖:

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

然后添加相关服务降级的处理类:

@RestController
public class FallbackController {
   

    @GetMapping("/fallback")
    public Object fallback() {
   
        Map<String,Object> result = new HashMap<>(3);
        result.put("data",null);
        result.put("message","request fallback!!!");
        result.put("code",500);
        return result;
    }

}

在application-filter.yml中添加相关配置,当路由出错时会转发到服务降级处理的控制器上:

spring:
  cloud:
    gateway:
      routes:
        - id: eureka-client-provider #路由的ID
          uri: lb://eureka-client-provider
          predicates:
            - Path=/provider/** # 路由规则
          filters:
            - StripPrefix=1
            - name: Hystrix
              args:
                name: fallbackcmd
                fallback-uri: forward:/fallback

重新启动网关后停止spring-cloud-eureka-client-provider服务,再请求http://localhost:9100/provider/demo/hello 。可以看到已经返回服务降级后的处理信息。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值