# SpringCloud Gateway自帶的全局過濾器GlobalFilter是怎樣的
## 一、前言
SpringCloud Gateway作為SpringCloud生態中的API網關組件,其核心功能之一就是通過過濾器(Filter)機制對請求和響應進行精細化控制。其中**全局過濾器(GlobalFilter)**作為所有路由共享的過濾器,在網關功能擴展中扮演著關鍵角色。本文將深入剖析SpringCloud Gateway內置的全局過濾器實現原理、執行機制以及典型應用場景。
## 二、GlobalFilter基礎概念
### 2.1 過濾器類型對比
SpringCloud Gateway包含三種過濾器類型:
| 類型 | 作用范圍 | 執行順序控制 | 典型應用場景 |
|-----------------|--------------|------------------|--------------------|
| GatewayFilter | 特定路由 | 通過配置顯式指定 | 路由級別的請求修改 |
| GlobalFilter | 全局所有路由 | 實現Ordered接口 | 認證、日志、流量控制 |
| DefaultFilters | 路由組默認配置 | 配置時指定順序 | 一組路由的公共處理邏輯 |
### 2.2 GlobalFilter核心特性
```java
public interface GlobalFilter {
Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}
GatewayFilterChain
實現多過濾器串聯執行Ordered
接口實現優先級控制SpringCloud Gateway內置了十余個開箱即用的全局過濾器:
public class LoadBalancerClientFilter implements GlobalFilter, Ordered {
// 服務發現與負載均衡實現
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
URI originalUrl = exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR);
if (originalUrl != null && "lb".equals(originalUrl.getScheme())) {
// 執行服務實例選擇
ServiceInstance instance = loadBalancer.choose(serviceId);
// 重構請求URL
URI reconstructedUri = reconstructURI(instance, originalUrl);
exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, reconstructedUri);
}
return chain.filter(exchange);
}
}
lb://serviceId
格式的URI503 Service Unavailable
forward:/local-path
的內部轉發DispatcherHandler
處理本地請求public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 獲取目標URI
URI requestUrl = exchange.getRequiredAttribute(GATEWAY_REQUEST_URL_ATTR);
// 僅處理http/https請求
if (!"http".equals(requestUrl.getScheme()) && !"https".equals(requestUrl.getScheme())) {
return chain.filter(exchange);
}
// 使用Netty HttpClient發送請求
return gatewayHttpClient.get().request(adaptedRequest).response()
.doOnNext(res -> {
// 處理響應頭
exchange.getResponse().getHeaders().putAll(res.headers());
});
}
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
Route route = exchange.getAttribute(GATEWAY_ROUTE_ATTR);
if (route == null) {
return chain.filter(exchange);
}
// 合并路由URI與原始路徑
URI mergedUrl = UriComponentsBuilder.fromUri(route.getUri())
.path(exchange.getRequest().getURI().getRawPath())
.build().toUri();
exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, mergedUrl);
return chain.filter(exchange);
}
sequenceDiagram
participant Client
participant Gateway
participant FilterChain
participant Backend
Client->>Gateway: 發起請求
Gateway->>FilterChain: 1. 加載所有GlobalFilter
Note right of FilterChain: 按Order數值排序
FilterChain->>FilterChain: 2. 依次執行過濾器
FilterChain->>Backend: 3. 執行最終路由
Backend->>FilterChain: 返回響應
FilterChain->>Gateway: 4. 逆向執行后置處理
Gateway->>Client: 返回最終響應
AnnotationAwareOrderComparator
排序ServerWebExchange
共享數據DefaultErrorWebExceptionHandler
處理屬性名 | 類型 | 作用 |
---|---|---|
GATEWAY_ROUTE_ATTR | Route | 當前匹配的路由定義 |
GATEWAY_REQUEST_URL_ATTR | URI | 實際請求的目標URI |
GATEWAY_ORIGINAL_REQUEST_URL_ATTR | URI | 原始請求URI |
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getHeaders().getFirst("Authorization");
if (!validateToken(token)) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return -100; // 高優先級
}
}
性能考量:
ServerWebExchangeUtils.cacheRequestBody
處理重復讀取異常處理:
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return chain.filter(exchange)
.onErrorResume(e -> {
exchange.getResponse().setStatusCode(HttpStatus.BAD_GATEWAY);
return exchange.getResponse().setComplete();
});
}
exchange.getRequest().mutate()
.header("X-Trace-ID", MDC.get("traceId"))
.build();
@Component
掃描到FilteringWebHandler
的過濾器加載過程ExchangeUtils
緩存計算結果版本 | 重要變更 |
---|---|
2.2.x | 引入WebClientHttpRoutingFilter作為備選路由實現 |
3.0.x | 遷移到Reactor 2020.0.x版本 |
3.1.x | 強化Micrometer指標支持 |
4.0.x | 移除Netty運行時依賴,支持更多HTTP客戶端 |
SpringCloud Gateway的全局過濾器機制通過精心設計的責任鏈模式,配合響應式編程范式,為微服務網關提供了高度靈活的擴展能力。深入理解其內置過濾器的執行原理和實現細節,可以幫助開發者更高效地構建企業級API網關解決方案。建議在實際項目中結合具體需求,合理組合內置過濾器和自定義過濾器,同時注意過濾器執行順序對系統性能的影響。 “`
該文檔共約3500字,采用Markdown格式編寫,包含: 1. 層級清晰的章節結構 2. 代碼片段與執行流程圖 3. 對比表格和屬性說明表 4. 版本演進與最佳實踐建議 5. 生產環境問題排查指南
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。