咱們知道若是要設計一個系統,首先是要了解需求。 Tomcat 要實現 2 個核心功能:nginx
從圖上你能夠看到,最頂層是 Server,這裏的 Server 指的就是一個 Tomcat 實例。一個 Server 中有一個或者多個 Service,一個 Service 中有多個鏈接器和一個容器。鏈接器與容器之間經過標準的 ServletRequest 和 ServletResponse 通訊。web
鏈接器對 Servlet 容器屏蔽了協議及 I/O 模型等的區別,不管是 HTTP 仍是 AJP,在容器中獲取到的都是一個標準的 ServletRequest 對象。apache
監聽網絡端口。 接受網絡鏈接請求。 讀取網絡請求字節流。 根據具體應用層協議(HTTP/AJP)解析字節流,生成統一的 Tomcat Request 對象。 將 Tomcat Request 對象轉成標準的 ServletRequest。 調用 Servlet 容器,獲得 ServletResponse。 將 ServletResponse 轉成 Tomcat Response 對象。 將 Tomcat Response 轉成網絡字節流。 將響應字節流寫回給瀏覽器。瀏覽器
經過分析鏈接器的詳細功能列表,咱們發現鏈接器須要完成 3 個高內聚的功能:tomcat
ProtocolHandler 組件是將EndPoint和Processor兩個組件進行了封裝 下圖爲兩個維度不一樣的組合網絡
Endpoint 接收到 Socket 鏈接後, 生成一個 SocketProcessor 任務提交到線程池去處理, SocketProcessor 的 run 方法會調用 Processor 組件去解析應用層協議, Processor 經過解析生成 Request 對象後, 會調用 Adapter 的 Service 方法。架構
Adapter 組件完成 Tomcat Request ->Servlet Request的轉換 CoyoteAdapter 負責將 Tomcat Request 轉成 ServletRequest,再調用容器的 service 方法。app
問題:在processor直接轉換爲容器的servletrequest和servletresponse不是更好,爲何要先轉化Tomcat的request和response,再用adapter作一層轉換消耗性能?異步
回答:若是鏈接器直接建立ServletRequest和ServletResponse對象的話,就和Servlet協議耦合了,設計者認爲鏈接器儘可能保持獨立性,它不必定要跟Servlet容器工做的。另外對象轉化的性能消耗仍是比較少的,Tomcat對HTTP請求體採起了延遲解析的策略,也就是說,TomcatRequest對象轉化成ServletRequest的時候,請求體的內容都還沒讀取呢,直到容器處理這個請求的時候纔讀取的。性能
Nginx/Apche通常作反向代理和處理靜態HTML資源,作的事情相對來講簡單,KPI就是要快,所以用C語言實現,直接調用操做系統API,充分利用操做系統的高級特性。
而Tomcat用來處理動態請求,還須要跑Java應用,所以用Java實現,所以」快「不是它主要的KPI。Java調用操做系統API要經過JNI,無形中有性能損耗。另外Tomcat經過使用Apache APR本地庫來作I/O通訊,性能已經跟Apache、Nginx接近了。
能夠的,在server.xml配置多個service,或者同一個service裏配置多個connector
omcat 設計了 4 種容器,分別是 Engine、Host、Context 和 Wrapper。
一個 Tomcat 實例包含一個service 一個 Service 包含一個 Engine和多個鏈接器, 一個 Engine 包含多個 Host, 一個 Host包 含多個Context 一個 Context包含多個 Wrapper 一個 Wrapper包含一個servlet
由 Mapper 組件完成, Mapper 組件保存了容器組件與訪問路徑的映射關係, 根據請求的 URL 進行定位
在各個層次定位過程當中, 都會對請求作一些處理
Mapper組件在映射請求的時候,會在Request對象中存儲相應的Host、Context等對象,這些選定的容器用來處理這個特定的請求,所以Engine中的Valve是從Request對象拿到Host容器的。
在同一個Tomcat實例裏部署多個Web應用是爲了節省內存等資源,不過配置部署有點複雜,應用之間互相影響,加上如今硬件成本將低,多應用部署比較少見了。
本文是我我的學習了李號雙老師的專欄課程以後,結合專欄文章和老師對同窗答疑整理的學習筆記。僅供分享。更多精彩內容,你們能夠掃描下方二位碼,在極客時間訂閱李號雙老師的《深刻拆解Tomcat & Jetty》。獲取一手學習資料。