上一節(jié)學(xué)習(xí)了GatewayFilter。
回憶一下一個關(guān)鍵點:
GateWayFilterFactory的本質(zhì)就是:針對配置進行解析,為指定的路由,添加Filter,以便對請求報文進行處理。
一、原理分析
GlobalFilter又是啥?先看一下接口定義
public interface GlobalFilter {
Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}
再看一下GatewayFilter
public interface GatewayFilter extends ShortcutConfigurable {
Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}
可以看到GatewayFilter和GlobalFilter方法簽名是一模一樣的,那為啥又要整一個GlobalFilter出來?
GatewayFilter的作用主要是,基于配置文件或者代碼,就是routes那個配置,解析出配置,然后進行報文處理。這個Filter是跟某個route強行綁定的。
GlobalFilter,是直接強制加載的,不屬于某個指定的route。而這個filter需不需要處理,是通過在filter方法中來進行判斷的。如果不需要自己處理,就直接丟給鏈條中下個filter。
請求的處理邏輯,可以看以下代碼
FilteringWebHandler.java
@Override
public Mono<Void> handle(ServerWebExchange exchange) {
Route route = exchange.getRequiredAttribute(GATEWAY_ROUTE_ATTR);
List<GatewayFilter> gatewayFilters = route.getFilters();
List<GatewayFilter> combined = new ArrayList<>(this.globalFilters);
combined.addAll(gatewayFilters);
// TODO: needed or cached?
AnnotationAwareOrderComparator.sort(combined);
if (logger.isDebugEnabled()) {
logger.debug("Sorted gatewayFilterFactories: " + combined);
}
return new DefaultGatewayFilterChain(combined).filter(exchange);
}
代碼解析:
- 從配置中獲取route,并取出滿足當前route條件的gatewayFilter
- GlobalFilter和gatewayFilter合并成一個list,并排序
- filter封裝成鏈,鏈式處理當前請求
二、如何自定義一個GlobalFilter
@Bean
public GlobalFilter customFilter() {
return new CustomGlobalFilter();
}
public class CustomGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("custom global filter");
return chain.filter(exchange);
}
@Override
public int getOrder() {
return -1;
}
}
三、內(nèi)置的GlobalFilter
3.1 Forward Routing Filter
處理URL格式為:forward:///localendpoint,這種將會被轉(zhuǎn)發(fā)到forward后面的地址
3.2 The LoadBalancerClient Filter
沒看到源碼,本地是 SpringCloud 2021.0.1版本
3.3 The ReactiveLoadBalancerClientFilter
如果URL有?個 lb scheme (如 lb://myservice ),它將使?Spring Cloud ReactorLoadBalancer 將名稱(在前?個示例中為 myservice )解析為實際主機和端?,并替換URI
spring:
cloud:
gateway:
routes:
- id: myRoute
uri: lb://service
predicates:
- Path=/service/**
3.4 The Netty Routing Filter
如果URL具有http 或https 模式,則會運?Netty Routing Filter。它使?Netty HttpClient 發(fā)出下游代理請求。
響應(yīng)放在ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR exchange屬性中。
3.5 The Netty Write Response Filter
從ServerWebExchangeUtils.CLIENT_RESPONSE_ATTR exchange屬性如果有值,此filter就執(zhí)行,用于寫響應(yīng)報文到緩存。
3.6 The RouteToRequestUrl Filter
如果 ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR exchange屬性中存在 Route 對象RouteToRequestUrlFilter 將運?。它基于請求URI創(chuàng)建?個新的URI,使?Route對象的uri屬性進?更新。新的URI被放置在 ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR exchange屬性中。如果該URI有?個前綴scheme,例如lb:ws://serviceid,則會從該URI中剝離該 lb scheme,并將其放置在ServerWebExchangeUtils.GATEWAY_SCHEME_PREFIX_ATTR 中,以便稍后在過濾器鏈中使?。
3.7 The Websocket Routing Filter
如果 ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR exchange屬性中有 ws 、 wss scheme,則Websocket Routing Filter將被運?。它使?Spring Web Socket基礎(chǔ)模塊將Websocket轉(zhuǎn)發(fā)到下游。
URI前綴為 lb 的Websockets可以被負載均衡,如 lb:ws://serviceid文章來源:http://www.zghlxwxcb.cn/news/detail-696295.html
spring:
cloud:
gateway:
routes:
# SockJS route
- id: websocket_sockjs_route
uri: http://localhost:3001
predicates:
- Path=/websocket/info/**
# Normal Websocket route
- id: websocket_route
uri: ws://localhost:3001
predicates:
- Path=/websocket/**
3.8 The Gateway Metrics Filter
要啟??關(guān)指標,請將 spring-boot-starter-actuator 添加為項?依賴項。然后,默認情況下,只要屬性 spring.cloud.gateway.metrics.enabled 未設(shè)置為 false ,?關(guān)指標過濾器就會運?。此過濾器添加名為 spring.cloud.gateway.requests 的計時器指標,并帶有以下標記文章來源地址http://www.zghlxwxcb.cn/news/detail-696295.html
- routeId: route ID.
- routeUri: API 將被轉(zhuǎn)發(fā)的URI
- outcome: 結(jié)果分類,依據(jù) HttpStatus.Series
- status: 返回client的請求的Http Status
- httpStatusCode: 返回client的請求的httpStatusCode
- httpMethod: ?于請求的HTTP?法
另外通過 spring.cloud.gateway.metrics.tags.path.enabled (默認為false)來激活額外的指標: - path:請求的路徑
這些指標可以從 /actuator/metrics/spring.cloud.gateway.requests 獲取,并且能夠很容易的與Prometheus 集成創(chuàng)建Grafana dashboard。
注意:要將pometheus啟?,需要添加 micrometer-registry-prometheus 為項?依賴。
到了這里,關(guān)于【深入解析spring cloud gateway】04 Global Filters的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!