欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringCloud?Gateway中GatewayFilterChain執(zhí)行流程詳解

 更新時(shí)間:2022年10月21日 11:10:02   作者:Polarisy丶  
Spring?Cloud?Gateway旨在為微服務(wù)架構(gòu)提供一種簡(jiǎn)單有效的、統(tǒng)一的?API?路由管理方式。Spring?Cloud?Gateway?作為?Spring?Cloud?生態(tài)系中的網(wǎng)關(guān),它不僅提供統(tǒng)一的路由方式,并且基于?Filter?鏈的方式提供了網(wǎng)關(guān)基本的功能,例如:安全、監(jiān)控/埋點(diǎn)和限流等

上一節(jié)我們把FilteringWebHandler中handle方法的過(guò)濾器統(tǒng)一排序的那部分邏輯講完了

接著就是生成過(guò)濾器器鏈,執(zhí)行過(guò)濾方法

return new DefaultGatewayFilterChain(combined).filter(exchange);
		@Override
		public Mono<Void> filter(ServerWebExchange exchange) {
			return Mono.defer(() -> {
				if (this.index < filters.size()) {
                      //filters就是上面?zhèn)魅氲乃羞^(guò)濾器,index就是當(dāng)前的索引
					GatewayFilter filter = filters.get(this.index);
                      //index+1,獲取下一個(gè)過(guò)濾器
					DefaultGatewayFilterChain chain = new DefaultGatewayFilterChain(this, this.index + 1);
                      //分別執(zhí)行每個(gè)過(guò)濾器的filter方法
					return filter.filter(exchange, chain);
				}
				else {
					return Mono.empty(); // complete
				}
			});
		}
	}

可以看到目前系統(tǒng)內(nèi)置的過(guò)濾器有十種,每個(gè)過(guò)濾器大致的作用我在下面列出來(lái)可供參考

RemoveCachedBodyFilter:移除請(qǐng)求上下文中的body緩存信息,只有在使用了ReadBodyPredicateFactory相關(guān)處理是會(huì)有body緩存

AdaptCachedBodyGlobalFilter:從請(qǐng)求中獲取body緩存到網(wǎng)關(guān)上下文,這樣就可以直接從網(wǎng)關(guān)上下文中拿到請(qǐng)求參數(shù),而不會(huì)出現(xiàn)從request中拿到之后還要回填到請(qǐng)求體的問題

NettyWriteResponseFilter:進(jìn)行響應(yīng)回寫,但是大家可以注意到執(zhí)行器鏈中NettyWriteResponseFilter的排序是在很前面的,按道理這種響應(yīng)處理的類應(yīng)該是在靠后才對(duì),這里的設(shè)計(jì)比較巧妙。大家可以看到chain.filter(exchange).then(),意思就是執(zhí)行到我的時(shí)候直接跳過(guò)下一個(gè),等后面的過(guò)濾器都執(zhí)行完后才執(zhí)行這段邏輯。

ForwardPathFilter:解析路徑并且將路徑轉(zhuǎn)發(fā)

RouteToRequestUrlFilter:根據(jù)匹配的 Route ,計(jì)算請(qǐng)求的地址

ReactiveLoadBalancerClientFilter:根據(jù) lb:// 前綴過(guò)濾處理,做負(fù)載均衡,選擇最終要調(diào)用的服務(wù)地址

LoadBalancerServiceInstanceCookieFilter:也是負(fù)載均衡相關(guān),并且和ServiceInstance有關(guān)

WebsocketRoutingFilter:Websocket 路由網(wǎng)關(guān)過(guò)濾器。其根據(jù) ws://wss:// 前綴過(guò)濾處理,代理后端 Websocket 服務(wù),提供給客戶端連接

NettyRoutingFilter:Netty 路由網(wǎng)關(guān)過(guò)濾器。其根據(jù) http://https:// 前綴過(guò)濾處理,使用基于 Netty 實(shí)現(xiàn)的 HttpClient 請(qǐng)求后端 Http 服務(wù)

ForwardRoutingFilter:轉(zhuǎn)發(fā)路由網(wǎng)關(guān)過(guò)濾器。其根據(jù) forward:// 前綴過(guò)濾處理,將請(qǐng)求轉(zhuǎn)發(fā)到當(dāng)前網(wǎng)關(guān)實(shí)例本地接口。

那么請(qǐng)求最后是怎么轉(zhuǎn)發(fā)到controller那進(jìn)行處理的呢?

其實(shí)是在NettyRoutingFilter里面,通過(guò)httpClient來(lái)發(fā)送request,下面截取一部分代碼

		Flux<HttpClientResponse> responseFlux = getHttpClient(route, exchange).headers(headers -> {
			headers.add(httpHeaders);
			// Will either be set below, or later by Netty
			headers.remove(HttpHeaders.HOST);
			if (preserveHost) {
				String host = request.getHeaders().getFirst(HttpHeaders.HOST);
				headers.add(HttpHeaders.HOST, host);
			}
		}).request(method).uri(url).send((req, nettyOutbound) -> {
			if (log.isTraceEnabled()) {
				nettyOutbound.withConnection(connection -> log.trace("outbound route: "
						+ connection.channel().id().asShortText() + ", inbound: " + exchange.getLogPrefix()));
			}
             //具體調(diào)用發(fā)送request的位置
			return nettyOutbound.send(request.getBody().map(this::getByteBuf));

Spring-Cloud-Gateway總體的執(zhí)行流程到這就差不多分享完了,后續(xù)可能繼續(xù)會(huì)分享一些關(guān)于路由或者網(wǎng)關(guān)一些其他的擴(kuò)展知識(shí)。

到此這篇關(guān)于SpringCloud Gateway中GatewayFilterChain執(zhí)行流程詳解的文章就介紹到這了,更多相關(guān)SpringCloud GatewayFilterChain內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論