SpringCloud Gateway HttpWebHandlerAdapter鏈路調(diào)用請求流程介紹
前言
上一節(jié)我們說到從HttpWebHandlerAdapter
的handle方法說起到DispatcherHandler
的調(diào)用流程
那么HttpWebHandlerAdapter
的handle方法是從哪里來調(diào)用的呢?
我們可以找下看哪些類使用了HttpHandler
通過這些類的名字,我們可以發(fā)現(xiàn),HttpHandler 往下就是具體的 Web 容器了,也就是說有具體的 Web 容器來接受請求,然后通過調(diào)用 HttpWebHandlerAdapter#handler 來進行后續(xù)的處理。這樣我們也就明白了 為什么 HttpHandler 的具體實現(xiàn)是一個適配器,因為它要適配不同的底層容器,Spring webFLux 不僅僅可以使用 NettyReactiveWebServer 作為底層Web 容器,也可以使用 tomcat、jetty等 servlet 的容器。
web容器
通過上面分析點進去可以看到
NettyReactiveWebServerFactory.java @Override public WebServer getWebServer(HttpHandler httpHandler) { HttpServer httpServer = createHttpServer(); ReactorHttpHandlerAdapter handlerAdapter = new ReactorHttpHandlerAdapter(httpHandler); NettyWebServer webServer = createNettyWebServer(httpServer, handlerAdapter, this.lifecycleTimeout, getShutdown()); webServer.setRouteProviders(this.routeProviders); return webServer; }
通過方法名就可以發(fā)現(xiàn)這就是得到一個web服務(wù)
往上面一直追蹤可以找到入口是AbstractApplicationContext#onRefresh方法中,也就是在AbstractApplicationContext#refresh中調(diào)用的。熟悉Spring的同學(xué)可以看到這就是Spring容器啟動的核心方法。
接著上面的代碼,可以看到第二行,實例化了ReactorHttpHandlerAdapter
對象
點進去可以看到核心的apply方法
@Override public Mono<Void> apply(HttpServerRequest reactorRequest, HttpServerResponse reactorResponse) { NettyDataBufferFactory bufferFactory = new NettyDataBufferFactory(reactorResponse.alloc()); try { ReactorServerHttpRequest request = new ReactorServerHttpRequest(reactorRequest, bufferFactory); ServerHttpResponse response = new ReactorServerHttpResponse(reactorResponse, bufferFactory); if (request.getMethod() == HttpMethod.HEAD) { response = new HttpHeadResponseDecorator(response); } //調(diào)用handle方法 return this.httpHandler.handle(request, response) .doOnError(ex -> logger.trace(request.getLogPrefix() + "Failed to complete: " + ex.getMessage())) .doOnSuccess(aVoid -> logger.trace(request.getLogPrefix() + "Handling completed")); } catch (URISyntaxException ex) { if (logger.isDebugEnabled()) { logger.debug("Failed to get request URI: " + ex.getMessage()); } reactorResponse.status(HttpResponseStatus.BAD_REQUEST); return Mono.empty(); } }
可以看到在這里調(diào)用開始httpHandler#handle方法,
WebServerManager.java #WebServerManager this.handler = new DelayedInitializationHttpHandler(handlerSupplier, lazyInit); this.webServer = factory.getWebServer(this.handler);
此時的httpHandler是DelayedInitializationHttpHandle
對象,調(diào)用其handle方法
可以看到最后實際調(diào)用的是HttpWebHandlerAdapter
的handle方法
到此這篇關(guān)于SpringCloud Gateway HttpWebHandlerAdapter鏈路調(diào)用請求流程介紹的文章就介紹到這了,更多相關(guān)SpringCloud HttpWebHandlerAdapter內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot中實現(xiàn)策略模式+工廠模式的方法
這篇文章主要介紹了Springboot中實現(xiàn)策略模式+工廠模式,具體策略模式和工廠模式的UML我就不給出來了,使用這個這兩個模式主要是防止程序中出現(xiàn)大量的IF ELSE IF ELSE....,接下來咱們直接實現(xiàn)Springboot策略模式工廠模式2022-03-03SpringBoot采用AJAX實現(xiàn)異步發(fā)布帖子詳解
Ajax是一種web應(yīng)用技術(shù),可以借助客戶端腳本(javascript)與服務(wù)端應(yīng)用進行異步通訊,獲取服務(wù)端數(shù)據(jù)以后,可以進行局部刷新,進而提高數(shù)據(jù)的響應(yīng)和渲染速度。所有的Ajax請求都會基于DOM(HTML元素)事件,通過XHR(XMLHttpRequest)對象實現(xiàn)與服務(wù)端異步通訊局部更新2022-08-08如何解決SpringBoot2.x版本對Velocity模板不支持的方案
這篇文章主要介紹了如何解決SpringBoot2.x版本對Velocity模板不支持的方案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12Spring里的Async注解實現(xiàn)異步操作的方法步驟
這篇文章主要介紹了Spring里的Async注解實現(xiàn)異步操作的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04Java單機環(huán)境實現(xiàn)定時任務(wù)技術(shù)
這篇文章主要介紹了Java單機環(huán)境實現(xiàn)定時任務(wù)技術(shù),文章內(nèi)容介紹詳細,具有一定的參考價值,需要的小伙伴可以參考一下2022-04-04