1. 程式人生 > >【玩轉SpringBoot】翻身做主人,一統web伺服器

【玩轉SpringBoot】翻身做主人,一統web伺服器


寄人籬下的日子


一直以來受傳統影響,我們的web工程總是打成war包,然後放入tomcat的webapps目錄下面。

如下圖01:


當tomcat啟動時,會去解壓war包,然後執行web工程。這大家都非常熟悉了。

用一個抽象的圖形表示,就是這樣子。如下圖02:


在一個大大的tomcat裡面,有一個小小的war包,貌似沒有地位啊。

不知道有沒有人思考過這兩個問題:

1)Spring在哪裡?

2)tomcat和war包是如何聯絡上的呢?

對於第一個問題,因為我們的web工程是使用spring-web開發的,所以Spring在war包裡呢。

Spring蜷縮在小小的war包裡,生活在tomcat的屋簷下,完全一副威風不起來樣子。


這簡直是叔可忍,嬸也不能忍啊。

對於第二個問題,tomcat和war包在程式碼上沒啥關係。它們其實是通過Java Web的規範聯絡上的。

這個規範是這樣的,在某一個jar包的META-INF目錄下,必須要有一個services目錄。

在這個目錄下必須有一個以javax.servlet.ServletContainerInitializer為名字的檔案。

顯然這個檔名稱是一個介面,所以檔案內容就是這個介面的實現類。

拿Spring來說,這個任務自然就落在了spring-web-xxx.jar這個jar包裡啦。

如下圖03:


因此,tomcat會掃描web工程裡的所有jar包,找到這個檔案並讀出裡面的介面實現類,然後去呼叫這個實現類。


這樣一來,啟動流程從tomcat沿著這個實現類就來到了web工程裡面了,web工程自然就被啟動起來了。

對於Spring來說,這個實現類一定是由spring-web來提供了,如下圖04:


可以看到Spring唯一能訪問的就是ServletContext,因此Spring的整個容器就是在ServletContext裡面放著呢。

這就是傳統的spring-web工程與tomcat的關係。

Spring就一活脫脫的小弟,被埋在tomcat裡面,它不甘心啊。

Spring一心想成為大老虎,無奈只能被當作Hello Kitty,寶寶心裡苦啊。


翻過身來成主人


Spring一直努力著、等待著、尋找著、觀察著,終於機會來了。


它就是SpringBoot,是它讓Spring翻身成了主人,是它讓Spring百尺竿頭更進一步,掌聲響起來。

現在可以用下面這個圖形表示,如下圖05:


成功實現了“權力反轉”,SpringBoot成了老大,把tomcat納入了麾下。

有時候不得不感慨,真是一念之間,地獄天堂啊。

除此之外,其實SpringBoot更進了一步,它乾脆一統了web伺服器。

也就是說,它那天看tomcat不爽了,分分鐘換成jetty或netty。

原來它只有一席之地,現在卻擁有了星辰大海。不要太爽了。

當然,為此呢,它需要付出一些額外勞動,不過這個買賣依然非常划算。

因為以有限的代價,換來了無限的可能。現在它就是啟動入口,它想怎麼折騰都行。

不得不說,當大哥的感覺真好,如果再有個大嫂,那就更好了,哈哈。

SpringBoot統一web可能還有一個原因,就是要支援響應式web,這樣整體看起來更加對稱。


抽象幾個介面,認真封裝一下


實現統一web伺服器方案其實就是,抽象幾個介面,認真封裝一下。真是這樣的。

首先,得有個web伺服器介面吧,如下圖06:


一般的人看到這個介面,心中想的是這個介面好簡單啊。

二般的人看到這個介面,心中想的是這個介面抽象程度很高啊,說明它的不同實現之間差異化一定很大。

因為抽象程度低的話,不足以抽象出共性,不足以抹平差異化。

所以介面就是它的不同實現類之間的交集,差異化越大的,它們之間的交集就越小。

看下這個介面的不同實現類,如下圖07:


其實就是基於已有的不同web伺服器的封裝。不同的web伺服器,是不同的團隊設計開發的,幾乎沒有什麼共性。

但總歸都要啟動和停止,都要有個埠吧。所以這個介面就是它現在這樣子。

差異化很大的東西,它們的建立過程也一定有較大的差異化,此時一般使用工廠去建立,如下圖0809:


一個是建立基於Servlet的web伺服器,一個是建立基於響應式的web伺服器。

這樣就實現不同的工廠,來建立不同的web伺服器即可。如下圖1011:


我們可以看到netty這個web伺服器是不支援Servlet的,只支援Reactive。

這就是整個的抽象思路和實現過程,原理很簡單,但是實現起來要足夠的專業。

就像造車一樣,造好了就是汽車,造不好就是拖拉機,雖然都能開,但是一個天上一個地下。


音樂漸起,華燈初上


從一開始spring-web和tomcat靠一個Java Web的規範連在一起。處於非常被動的地位。

到SpringBoot出現帶來的成功翻身,把自己變成了啟動入口,變成了主體。

不僅可以操作web伺服器API,而且還統一了它們。從被動變成了主動地位。

SpringBoot把握住了入口,這就為它開闢了更為廣闊的天地,可以放心去追求詩和遠方了。

音樂漸起,華燈初上,一切美好才剛剛開始。。。

>>> 玩轉SpringBoot系列文章 <<<

 

【玩轉SpringBoot】配置檔案yml的正確開啟姿勢

【玩轉SpringBoot】用好條件相關注解,開啟自動配置之門

【玩轉SpringBoot】給自動配置來個整體大揭祕

【玩轉SpringBoot】看似複雜的Environment其實很簡單

 

>>> 品Spring系列文章 <<<

 

品Spring:帝國的基石

品Spring:bean定義上梁山

品Spring:實現bean定義時採用的“先進生產力”

品Spring:註解終於“成功上位”

品Spring:能工巧匠們對註解的“加持”

品Spring:SpringBoot和Spring到底有沒有本質的不同?

品Spring:負責bean定義註冊的兩個“排頭兵”

品Spring:SpringBoot輕鬆取勝bean定義註冊的“第一階段”

品Spring:SpringBoot發起bean定義註冊的“二次攻堅戰”

品Spring:註解之王@Configuration和它的一眾“小弟們”

品Spring:bean工廠後處理器的呼叫規則

品Spring:詳細解說bean後處理器

品Spring:對@PostConstruct和@PreDestroy註解的處理方法

品Spring:對@Resource註解的處理方法

品Spring:對@Autowired和@Value註解的處理方法

品Spring:真沒想到,三十步才能完成一個bean例項的建立

品Spring:關於@Scheduled定時任務的思考與探索,結果尷尬了

 

>>> 熱門文章集錦 <<<

 

畢業10年,我有話說

【面試】我是如何面試別人List相關知識的,深度有點長文

我是如何在畢業不久只用1年就升為開發組長的

爸爸又給Spring MVC生了個弟弟叫Spring WebFlux

【面試】我是如何在面試別人Spring事務時“套路”對方的

【面試】Spring事務面試考點吐血整理(建議珍藏)

【面試】我是如何在面試別人Redis相關知識時“軟懟”他的

【面試】吃透了這些Redis知識點,面試官一定覺得你很NB(乾貨 | 建議珍藏)

【面試】如果你這樣回答“什麼是執行緒安全”,面試官都會對你刮目相看(建議珍藏)

【面試】迄今為止把同步/非同步/阻塞/非阻塞/BIO/NIO/AIO講的這麼清楚的好文章(快快珍藏)

【面試】一篇文章幫你徹底搞清楚“I/O多路複用”和“非同步I/O”的前世今生(深度好文,建議珍藏)

【面試】如果把執行緒當作一個人來對待,所有問題都瞬間明白了

Java多執行緒通關———基礎知識挑戰

品Spring:帝國的基石

 

作者是工作超過10年的碼農,現在任架構師。喜歡研究技術,崇尚簡單快樂。追求以通俗易懂的語言解說技術,希望所有的讀者都能看懂並記住。下面是公眾號的二維碼,歡迎關注!

&nb