Spring Cloud Gateway ---GatewayFilter過濾器、過濾器工廠(入門)

♂???木發表於2019-03-12

前言


在一個系統中,經常需要對特定路由進行特定操作,而微服務中閘道器過濾器便起到了原來單體應用中過濾器作用,對請求進行處理,本文主要介紹Spring Cloud Gateway中過濾器的基本概念,以及入門使用。

概念


  • 1、Gateway中Filter生命週期只有兩個階段:pre和post
    pre:請求在路由之前被呼叫,我們可利用這種過濾器實現身份驗證、在叢集中選擇請求的微服務、記錄除錯資訊等
    post:在路由到微服務以後執行。這種過濾器可用來為響應新增標準的HttpHeader、收集統計資訊和指標、將響應從微服務傳送給客戶端等

  • 2、Spring Cloud GatewayFilter 分為兩種:GatewayFilterGlobalFilterGlobalFilter 會應用到所有的路由上,而 GatewayFilter 將應用到單個路由或者一個分組的路由上。

GatewayFilter Factory


Spring Cloud Gateway中提供了很多自帶的過濾器工廠使用。我們可以使用其完成各種操作。
例如:使用AddRequestParameter GatewayFilter Factory給特定請求新增引數(此處使用此方法的前提是閘道器已經註冊到服務中心

在閘道器微服務中新增如下配置,對請求為Get方式的路由進行攔截新增引數foo=bar,並轉發到uri中

#此處需要注意閘道器服務開啟需要配置spring.cloud.gateway.discovery.locator.enabled: true
spring:
  cloud:
    gateway:
      routes:
      # =====================================
      - id: add_request_parameter_route
        uri: http://localhost:8003/provider/test
        filters:
        - AddRequestParameter=foo, bar
        predicates: 
        - Method=GET
複製程式碼

在provider微服務中新增http://localhost:8003/provider/test路由方法

@RestController
@RequestMapping("/provider")
public class TestController {
    @Value("${server.port}")
    private String addr;
    
    //此處需要引數名同為foo才能接受引數foo=bar
    @GetMapping("/test")
    public String test(String foo){
        String relstr= "來自服務提供者:"+addr+" foo:"+foo;
        return relstr;
    }
}
複製程式碼

啟動閘道器服務(9001)和provider微服務(8003),以任意路由用Get方式請求閘道器,測試:如圖可知訪問成功且引數新增成功

Spring Cloud Gateway ---GatewayFilter過濾器、過濾器工廠(入門)

AddRequestHeader GatewayFilter Factory


application.yml

spring:
  cloud:
    gateway:
      routes:
      # 為匹配路由請求新增請求頭X-Request-Foo, Bar
      - id: add_request_header_route
        uri: http://example.org
        filters:
        - AddRequestHeader=X-Request-Foo, Bar
複製程式碼

AddResponseHeader GatewayFilter Factory


application.yml

spring:
   cloud:
     gateway:
       routes:
       # 為匹配路由請求新增響應頭X-Response-Foo , Bar
       -  id:add_request_header_route
         uri:http://example.org
         過濾器:
         -  AddResponseHeader = X-Response-Foo , Bar
複製程式碼

Hystrix GatewayFilter Factory


application.yml

spring:
   cloud:
     gateway:
       routes:
       #
       -  id:hytstrix_route
         uri:http://example.org
         過濾器:
         -  Hystrix = myCommandName
複製程式碼

其他過濾器


參考官方文件

  • PrefixPath GatewayFilter Factory:uri新增字首過濾器
  • RequestRateLimiter GatewayFilter Factory
  • RedirectTo GatewayFilter Factory

相關文章