前言
在一個系統中,經常需要對特定路由進行特定操作,而微服務中閘道器過濾器便起到了原來單體應用中過濾器作用,對請求進行處理,本文主要介紹Spring Cloud Gateway
中過濾器的基本概念,以及入門使用。
概念
-
1、Gateway中Filter生命週期只有兩個階段:pre和post
pre:請求在路由之前被呼叫,我們可利用這種過濾器實現身份驗證、在叢集中選擇請求的微服務、記錄除錯資訊等
post:在路由到微服務以後執行。這種過濾器可用來為響應新增標準的HttpHeader、收集統計資訊和指標、將響應從微服務傳送給客戶端等
-
2、
Spring Cloud Gateway
的Filter
分為兩種:GatewayFilter
與GlobalFilter
。GlobalFilter
會應用到所有的路由上,而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方式請求閘道器,測試:如圖可知訪問成功且引數新增成功
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