來(lái)面試的都是什么妖魔,中間件都不會(huì)
大家好,我是Guide!
今天推薦一個(gè)質(zhì)量很高的 Tomcat 相關(guān)的極客時(shí)間專欄!實(shí)話說(shuō),這個(gè)專欄真心不錯(cuò),強(qiáng)烈安利!??
不光可以加深自己對(duì)于 Tomcat 的理解,還能提高自己對(duì)于系統(tǒng)架構(gòu)、性能優(yōu)化等領(lǐng)域的認(rèn)識(shí)。
下面是我自己學(xué)習(xí)這個(gè)專欄的時(shí)候做的筆記:

下面是正文。
很多過(guò)來(lái)人都會(huì)告誡新人,編程沒(méi)有捷徑可走,不花費(fèi)幾年時(shí)間經(jīng)過(guò)大量實(shí)踐和刻意練習(xí),怎么能領(lǐng)悟編程的精髓呢?
我曾經(jīng)也是一名“刻苦”的新人,但幾年之后我發(fā)現(xiàn),其實(shí)在 Java 的學(xué)習(xí)上,同樣逃不開”二八原則“,即掌握 20% 的知識(shí),就能解決 80% 的問(wèn)題。說(shuō)實(shí)話,這樣的思維方式讓我在之后的 Java 學(xué)習(xí)之路上受益很大。
想來(lái),實(shí)習(xí)那會(huì)兒我還沒(méi)搞 Java,后來(lái)覺得機(jī)會(huì)多才轉(zhuǎn)過(guò)去,發(fā)現(xiàn)上手還挺快,API 比較齊全,也不需要自己來(lái)管理內(nèi)存。畢業(yè)后順利找到了一份 Java 開發(fā)工作,主要就是實(shí)現(xiàn)一些小模塊,很多時(shí)候通過(guò)代碼復(fù)制粘貼,再稍微改改就能完成,這樣的狀態(tài)大概持續(xù)了一年。
這個(gè)過(guò)程,雖然讓我對(duì) Java 語(yǔ)法更加熟悉了,但很少有機(jī)會(huì)運(yùn)用一些 Java 的高級(jí)特性,那時(shí)如果讓我獨(dú)立設(shè)計(jì)一個(gè)系統(tǒng),我肯定懵逼。Web 框架也一樣,我也只是知道這樣用是 ok 的,但不知道它背后的原理,更不用提類似「瀏覽器的請(qǐng)求是怎么跟 Spring 中的代碼聯(lián)系起來(lái)的」這樣的問(wèn)題了。
這時(shí)我才發(fā)現(xiàn),自己在知識(shí)體系上的欠缺。但 Java 知識(shí)體系很龐大,我該專注于哪一方面呢?
后來(lái),一個(gè)偶然的機(jī)會(huì),我知道了 Tomcat 和 Jetty 這樣的 Web 容器,覺得很神奇,只要把 Web 應(yīng)用打成 WAR 包放到它的目錄下,啟動(dòng)起來(lái)就能通過(guò)瀏覽器來(lái)訪問(wèn)了。
那 Web 容器是如何工作的呢?帶著這份好奇心,我決定深入研究 Tomcat。在掌握了原理之后,我才知道,Servlet 技術(shù)是 Web 開發(fā)的原點(diǎn),幾乎所有 Java Web 框架(比如 Spring)都是基于 Servlet 的封裝,Spring 應(yīng)用本身就是一個(gè) Servlet,而 Tomcat 和 Jetty 這樣的 Web 容器,就是負(fù)責(zé)加載和運(yùn)行 Servlet 的。
通過(guò)下面這張圖,你可以理解 Tomcat/Jetty 在 Web 開發(fā)中的位置。

隨著學(xué)習(xí)的深入,我發(fā)現(xiàn) Tomcat 和 Jetty 用到了不少 Java 高級(jí)技術(shù),比如 Java 多線程并發(fā)編程、Socket 網(wǎng)絡(luò)編程以及反射等等。之前為了面試,我也背過(guò)一些題,但總感覺“知道”和“會(huì)用”之間存在一道鴻溝。而通過(guò)學(xué)習(xí) Tomcat 和 Jetty 源碼,讓我了解到,該在什么樣的場(chǎng)景下去用這些技術(shù),這一點(diǎn)至關(guān)重要。
在掌握了 Web 容器和 JVM 工作原理后,我開始解決線上的疑難雜癥,并嘗試對(duì)線上的 Tomcat 進(jìn)行調(diào)優(yōu)。性能的提升是實(shí)實(shí)在在的成果,我也因此得到了領(lǐng)導(dǎo)的認(rèn)可。這個(gè)過(guò)程,讓我建立起了自己的知識(shí)體系,開始獨(dú)立設(shè)計(jì)系統(tǒng)、解決技術(shù)難題,逐漸具備了獨(dú)當(dāng)一面的能力。
如果我能做到,那么,你也可以。為了讓你少走彎路,分享一個(gè)幫了我不少的專欄《深入拆解 Tomcat & Jetty》,作者是 eBay 技術(shù)主管李號(hào)雙,他在 eBay 負(fù)責(zé)付款系統(tǒng)的可靠性、穩(wěn)定性和高可用,系統(tǒng)采用定制版的 Tomcat 運(yùn)行大規(guī)模微服務(wù)實(shí)例,對(duì) Tomcat 和 Jetty 源碼非常了解,具有豐富的容器化上云,線上問(wèn)題定位和調(diào)優(yōu)經(jīng)驗(yàn)。

第二階段:掌握 Tomcat 和 Jetty 的整體架構(gòu):從 Tomcat 的 Jetty 的總體架構(gòu)全貌逐步深入到各個(gè)組件,重點(diǎn)關(guān)注組件的工作原理和設(shè)計(jì)思路,通過(guò)源碼的剖析,加深你的理解,實(shí)戰(zhàn)優(yōu)化 Tomcat 啟動(dòng)速度。
第三階段:深入講解連接器、容器和通用組件的詳細(xì)設(shè)計(jì)和工作原理:
連接器:
Tomcat 如何實(shí)現(xiàn)非阻塞和異步 I/O 通信、如何擴(kuò)展 Java 原生線程池、如何支持 WebSocket; 詳解 Jetty 的線程策略 EatWhatYouKill; 總結(jié) Tomcat 和 Jetty 的對(duì)象池技術(shù)以及高并發(fā)高性能之道。
容器:
討論 Tomcat 的熱加載熱部署、類加載機(jī)制、Web 應(yīng)用的隔離以及如何實(shí)現(xiàn) Servlet 規(guī)范、如何實(shí)現(xiàn)異步 Servlet; 探討 Jetty 如何實(shí)現(xiàn)帶有上下文信息的責(zé)任鏈; 總結(jié) Tomcat 和 Jetty 運(yùn)用的設(shè)計(jì)模式。

