SpringWebFlux執行過程

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

-> 調用我們的業務代碼

-> 後續定義結果封裝處理

最後

大流程上看起來不難理解,不過還是可以多看幾遍學習下其設計方式。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章