Spring WebFlux的出現帶來了異步響應式編程的福音,隨着它不斷的完善,使用者會逐漸的變多,作爲經常拿來與Spring MVC對比的框架。
它的執行過程,設計上與Spring MVC有什麼區別呢?
大致看了下其源碼,做了簡要梳理。
啓動
1 仍然保持原有的方式啓動應用,那麼Spring如何知道要啓動WebFlux應用呢?
- WebApplicationType枚舉類中,deduceFromClasspath判斷如果存在DispatcherHandler,然後一些其它條件,那麼系統認爲要啓動的是Reactive的應用
- 否則,採用Servlet應用
SpringApplication#run(java.lang.String...)
context = createApplicationContext();
switch (this.webApplicationType) {
case SERVLET:
contextClass = Class.forName(DEFAULT_SERVLET_WEB_CONTEXT_CLASS);
break;
case REACTIVE:
contextClass = Class.forName(DEFAULT_REACTIVE_WEB_CONTEXT_CLASS);
break;
default:
contextClass = Class.forName(DEFAULT_CONTEXT_CLASS);
}
2 在上下文刷新之後,啓動Reactive服務。
image.png
運行
1 首先肯定是從Netty的channelRead開始,不過我們從接近我們的鏈路開始分析。
reactor.netty.http.server.HttpServerHandle#onStateChange
->ReactorHttpHandlerAdapter.apply 封裝Request,Response。ReactorServerHttpRequest
-> HttpWebHandlerAdapter.handle 創建ServerWebExchange
-> ExceptionHandlingWebHandler.handle
-> FilteringWebHandler.handle
-> DefaultWebFilterChain.handle 使用WebFilter在請求處理前進行filter
-> DispatcherHandler.handle 與Spring MVC對應,HandlerMapping,HandlerAdpater
-> handlerAdapter.handle
-> 調用我們的業務代碼
-> 後續定義結果封裝處理
最後
大流程上看起來不難理解,不過還是可以多看幾遍學習下其設計方式。