一套完整的 Tomcat 和 Jetty 的原始碼拆解
如果你是一個熱衷於技術的 Java 程式設計師,鵬磊今天為你分享一位大佬的學習經歷,可以讓你在眾多 Java 開發人員中脫穎而出。
這位大佬,我介紹一下:
李號雙 , eBay 技術主管,2009 年畢業後加入惠普,先後負責分散式企業級應用的開發與架構設計,以及容器化上雲。
2018 年加入 eBay, 參與 eBay 付款系統 2.0 的設計與研發 ,負責可靠性和高可用部分,系統 採用定製版的 Tomcat 執行大規模微服務例項 ,並且 通讀過 Tomcat 原始碼 ,具有豐富的線上問題定位和調優經驗。
以下是他的分享:
很多「過來人」都會告誡新人,程式設計沒有捷徑可走,不花費幾年時間經過大量的實踐和刻意練習怎麼能領悟程式設計的精髓呢?
我曾經也是一名“刻苦”的新人,直到後面才體會到,其實在 Java 的學習上,同樣也逃不開”二八原則“,即 掌握 20% 的知識,就能解決 80% 的問題。
這一點也是我工作很久之後才悟出來的,這種思維方式讓我在之後的 Java 學習路上受益很大。
我先來講講自己的經歷。
十年前,我在實習做嵌入式系統開發,開發語言是 C 和 C++。出於我個人興趣愛好,當時我想轉 Java,學了一段時間後,發 現 Java 上手還挺快,API 比較齊全,也不需要自己來管理記憶體,感覺比 C 語言高階。
畢業後我順利地找到了一個 Java 開發的工作,入職後我的工作主要是實現一些小模組,很多時候通過程式碼的複製貼上,再稍微改改就能完成功能,這樣的狀態大概持續了一年。
鵬磊認為: 工作前三年對於咱們技術人成長非常關鍵,CRUD 不應該是常態。
在這個過程中,我對 Java 語法更加熟悉了,也“背”過一些設計模式,用過一些 Web 框架,但是 很少有機會將一些 Java 的高階特性運用到實際專案中,因此對它們的理解也是模糊的 。
那時候如果讓我獨立設計一個系統,我會感到非常茫然,不知道從哪裡下手;對於 Web 框架,我也只是知道這樣用是可以的,但卻不知道它背後的原理是什麼。
而且,在我腦子裡沒有一張 Java Web 開發的全景圖,舉個例子,我不知道瀏覽器的請求是怎麼跟 Spring 中的程式碼聯絡起來的。
鵬磊認為: 80% 新人都會有的困境,可惜只有 20% 找到了方法,大部分人在工作早期沒有高手帶路,走了很多彎路。
後來我分析發現,我的知識體系在廣度和深度上都有問題。然而 Java 知識體系很龐大,我到底該專注於哪一方面?
接著,我注意到了像 Tomcat 和 Jetty 這樣的 Web 容器,覺得它們很神奇,只需要把 Web 應用打成 WAR 包放到它的目錄下,啟動起來就能通過瀏覽器來訪問了。
那 Web 容器究竟是如何工作的?帶著這份好奇心, 我決定選擇 Tomcat 來深入研究。
學習了Tomcat的原理之後,我發現Servlet技術是Web開發的原點,幾乎所有的Java Web框架(比如Spring)都是基於Servlet的封裝,從Servlet規範的角度來看,Spring應用其實就是一個Servlet,而Tomcat和Jetty這樣的Web容器,負責載入和執行Servlet。
你可以通過下面這張圖來理解 Tomcat/Jetty 在 Web 開發中的位置:
隨著學習的深入,我還發現 Tomcat 和 Jetty 中用到不少 Java 高階技術 ,比如 Java 多執行緒併發程式設計、Socket 網路程式設計以及反射等等。
之前我僅僅只是瞭解這些技術,為了面試也背過一些題,但是總感覺“知道”和“會用”之間存在一道鴻溝。
通過 對 Tomcat 和 Jetty 原始碼的學習 ,我學會了 在什麼樣的場景下去用這些技術,這一點至關重要。
在理解了 Web 容器以及 JVM 的工作原理後,我開始解決線上的疑難雜症,並且嘗試對線上的 Tomcat 進行調優。 效能的提升也是實實在在的成果,我也因此得到了同事們的認可。
總之,在這個過程中,我逐漸建立起了自己的知識體系,也開始獨立設計一個系統,獨立解決技術難題,也就是說我漸漸具備了 獨當一面的能力 ,而這正是高階程式設計師或者架構師的特質。
概括一下,獨當一面的能力,離不開 技術的廣度和深度 。
後來我才發現,這種能力其實 是我在深入學習 Tomcat 的過程中才逐漸擁有 的,這就是迴歸到我開頭說的觀點: 掌握 20% 的知識,就能解決 80% 的問題。
人的精力是有限的,廣度和深度該如何權衡呢?我建議找準一個點先突破深度,而 Tomcat 和 Jetty 就是非常好的選擇。
以上就是李號雙的 Java 學習之路,希望對大家有所啟發。
李號雙最近跟極客時間合作推出了 《深入拆解 Tomcat & Jetty》 這門課程,把他當年學習 Java 的這種思維方式沉澱成一套 可複製的實戰方法 。市面上 Tomcat 的靠譜資料太少了,終於等來極客時間上了這門課。
鵬磊認為: Tomcat 的確是非常經典的開源系統,並且運用了方方面面的 Java 技術,如果能從中領略到這些大牛設計者是如何思考問題的,站在巨人的肩膀上,你能走的更快更好。
加微信:souyunku_com 返現 24元
相當於只需 44 元 , 立省 55元
這個專欄的設計路線共分為四個階段(很吸引我):
第一階段:重學 Tomcat 和 Jetty 的必備基礎
首先要學習一些基礎知識,比如作業系統、計算機網路、Java 語言,面向物件設計、HTTP 協議以及 Servlet 規範等,幫你重新理解 HTTP 協議和Servlet 規範。
第二階段:深刻掌握 Tomcat 和 Jetty 的整體架構
從 Tomcat 的 Jetty 的總體架構全貌逐步深入到各個元件,在這個過程中,重點關注元件的工作原理和設計思路,比如這個元件為什麼設計成這樣,設計者們當時是怎麼考慮這個問題的。
然後通過原始碼的剖析,加深你的理解。更重要的是,幫你學會 在真實的場景下如何運用 Java 技術。
第三階段:深入講解聯結器、容器和通用元件的詳細設計和工作原理
聯結器:
→ Tomcat 如何實現非阻塞和非同步 I/O 通訊、如何擴充套件 Java 原生執行緒池、如何支援 WebSocket;
→ 詳解 Jetty 的執行緒策略 EatWhatYouKill;
→ 總結 Tomcat 和 Jetty 的物件池技術以及高併發高效能之道。
容器:
→ 討論 Tomcat 的熱載入熱部署、類載入機制、Web 應用的隔離以及如何實現 Servlet 規範、如何實現非同步 Servlet;
→ 探討 Jetty 如何實現帶有上下文資訊的責任鏈;
→ 通過 Jetty 與 Tomcat 的對比,比較它們各自的設計特點,讓你對選型有更深的理解。並且通過思考和總結,幫你從中提煉一些通用的設計原則,以及實現高效能高併發的思路。
通用元件:
→ 包括日誌元件、Session 管理元件和叢集通訊元件。
第四階段:從實戰出發,解決工作中最常見的效能問題
在深入瞭解 Tomcat 和 Jetty 的工作原理之後,接著會從實戰出發,帶你看看如何監控 Tomcat 的效能,以及怎麼從記憶體、執行緒池和 I/O 三個方面進行調優。
同時我還會分析和解決一些你在實際工作中可能會碰到的棘手問題, 讓 你的 Web 程式飛起來 。
在這個過程中,還會 解讀 Servlet 最新技術及實際應用 ,比如 WebSocket 和非同步 Servlet 等,會重點分析這些新技術是從何而來,以及 Tomcat/Jetty 是如何支援的。這些都是 Web 技術的最新動向 ,你可以在自己的工作中 根據需要選用這些新技術。
鵬磊認為: 弄懂了 Tomcat 和 Jetty,Java Web 開發對你來說就已經毫無“祕密”可言 。
並且,你能體會到大神們是如何設計 Tomcat 和 Jetty 的,體會他們如何思考問題、如何寫程式碼,教會你在 真實的場景下如何運用 Java 技術 ,這些都能快速增加你的經驗值。
如果你正在 Java Web 開發這條路上向著架構師的方向狂奔,相信有了它,你將會走的更快更好!
從我這裡訂閱,有什麼福利?
1、優惠價 68元 , 原價 99元
2、加微信 返現 24元
3、相當於只需 44 元 , 立省 55元
重點 : 44 元 就能得到李號雙老師10年 Tomcat 和 Jetty 的 原始碼拆解的乾貨
加我微信返現:
微信ID:souyunku_com
△掃碼試讀或者訂閱
加微信: souyunku_com 返現 24元
相當於只需 44 元 , 立省 55元
兩倍咖啡的價格,
提升你的開發效率兩倍以上!
深入 Tomcat,提升 Java 開發廣度,成為 20% 領先的技術人!
:point_down:點選 「閱讀原文」 ,免費試看!