日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Tomcat 处理 HTTP 请求源码分析(上)【转】

發布時間:2025/4/5 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Tomcat 处理 HTTP 请求源码分析(上)【转】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文地址:https://www.infoq.cn/article/zh-tomcat-http-request-1

很多開源應用服務器都是集成 tomcat 作為 web container 的,而且對于 tomcat 的 servlet container 這部分代碼很少改動。這樣,這些應用服務器的性能基本上就取決于 Tomcat 處理 HTTP 請求的 connector 模塊的性能。本文首先從應用層次分析了 tomcat 所有的 connector 種類及用法,接著從架構上分析了 connector 模塊在整個 tomcat 中所處的位置,最后對 connector 做了詳細的源代碼分析。并且我們以 Http11NioProtocol 為例詳細說明了 tomcat 是如何通過實現 ProtocolHandler 接口而構建 connector 的。

通過本文的學習,應該可以輕松做到將 tomcat 做為 web container 集成到第三方系統,并且自定義任何你想要的高性能的 HTTP 連接器。

1 Connector 介紹

1.1 Connector 的種類

Tomcat 源碼中與 connector 相關的類位于 org.apache.coyote 包中,Connector 分為以下幾類:

  • Http Connector, 基于 HTTP 協議,負責建立 HTTP 連接。它又分為 BIO Http Connector 與 NIO Http Connector 兩種,后者提供非阻塞 IO 與長連接 Comet 支持。
  • AJP Connector, 基于 AJP 協議,AJP 是專門設計用來為 tomcat 與 http 服務器之間通信專門定制的協議,能提供較高的通信速度和效率。如與 Apache 服務器集成時,采用這個協議。
  • APR HTTP Connector, 用 C 實現,通過 JNI 調用的。主要提升對靜態資源(如 HTML、圖片、CSS、JS 等)的訪問性能。現在這個庫已獨立出來可用在任何項目中。Tomcat 在配置 APR 之后性能非常強勁。

1.2 Connector 的配置

對 Connector 的配置位于 conf/server.xml 文件中。

1.2.1 BIO HTTP/1.1 Connector 配置

一個典型的配置如下:

<Connector port=”8080” protocol=”HTTP/1.1” maxThreads=”150” connectionTimeout=”20000” redirectPort=”8443”

其它一些重要屬性如下:

  • acceptCount : 接受連接 request 的最大連接數目,默認值是 10
  • address : 綁定 IP 地址,如果不綁定,默認將綁定任何 IP 地址
  • allowTrace : 如果是 true, 將允許 TRACE HTTP 方法
  • compressibleMimeTypes : 各個 mimeType, 以逗號分隔,如 text/html,text/xml
  • compression : 如果帶寬有限的話,可以用 GZIP 壓縮
  • connectionTimeout : 超時時間,默認為 60000ms (60s)
  • maxKeepAliveRequest : 默認值是 100
  • maxThreads : 處理請求的 Connector 的線程數目,默認值為 200

如果是 SSL 配置,如下:

<Connector port="8181" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol = "TLS" address="0.0.0.0" keystoreFile="E:/java/jonas-full-5.1.0-RC3/conf/keystore.jks" keystorePass="changeit" />

其中,keystoreFile 為證書位置,keystorePass 為證書密碼

1.2.2 NIO HTTP/1.1 Connector 配置

<Connector port=”8080” protocol=”org.apache.coyote.http11.Http11NioProtocol” maxThreads=”150” connectionTimeout=”20000” redirectPort=”8443”

1.2.3 Native APR Connector 配置

  • ARP 是用 C/C++ 寫的,對靜態資源(HTML,圖片等)進行了優化。所以要下載本地庫

    tcnative-1.dll 與 openssl.exe,將其放在 %tomcat%\bin 目錄下。

    下載地址是:http://tomcat.heanet.ie/native/1.1.10/binaries/win32/

  • 在 server.xml 中要配置一個 Listener, 如下圖。這個配置 tomcat 是默認配好的。 <!--APR library loader. Documentation at /docs/apr.html --> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  • 配置使用 APR connector <Connector port=”8080” protocol=”org.apache.coyote.http11.Http11AprProtocol”

    maxThreads=”150” connectionTimeout=”20000” redirectPort=”8443”

  • 如果配置成功,啟動 tomcat, 會看到如下信息: org.apache.coyote.http11.Http11AprProtocol init
  • 2 Connector 在 Tomcat 中所處的位置

    2.1 Tomcat 架構

    圖 2-1 Tomcat 架構

    • Server(服務器) 是 Tomcat 構成的頂級構成元素,所有一切均包含在 Server 中,Server 的實現類 StandardServer 可以包含一個到多個 Services;
    • 次頂級元素 Service 的實現類為 StandardService 調用了容器 (Container) 接口,其實是調用了 Servlet Engine(引擎),而且 StandardService 類中也指明了該 Service 歸屬的 Server;
    • 接下來次級的構成元素就是容器 (Container),主機 (Host)、上下文 (Context) 和引擎 (Engine) 均繼承自 Container 接口,所以它們都是容器。但是,它們是有父子關系的,在主機 (Host)、上下文 (Context) 和引擎 (Engine) 這三類容器中,引擎是頂級容器,直接包含是主機容器,而主機容器又包含上下文容器,所以引擎、主機和上下文從大小上來說又構成父子關系,雖然它們都繼承自 Container 接口。
    • 連接器 (Connector) 將 Service 和 Container 連接起來,首先它需要注冊到一個 Service,它的作用就是把來自客戶端的請求轉發到 Container(容器),這就是它為什么稱作連接器的原因。

    故我們從功能的角度將 Tomcat 源代碼分成 5 個子模塊,它們分別是:

  • Jsper 子模塊:這個子模塊負責 jsp 頁面的解析、jsp 屬性的驗證,同時也負責將 jsp 頁面動態轉換為 java 代碼并編譯成 class 文件。在 Tomcat 源代碼中,凡是屬于 org.apache.jasper 包及其子包中的源代碼都屬于這個子模塊;
  • Servlet 和 Jsp 規范的實現模塊:這個子模塊的源代碼屬于 javax.servlet 包及其子包,如我們非常熟悉的 javax.servlet.Servlet 接口、javax.servet.http.HttpServlet 類及 javax.servlet.jsp.HttpJspPage 就位于這個子模塊中;
  • Catalina 子模塊:這個子模塊包含了所有以 org.apache.catalina 開頭的 java 源代碼。該子模塊的任務是規范了 Tomcat 的總體架構,定義了 Server、Service、Host、Connector、Context、Session 及 Cluster 等關鍵組件及這些組件的實現,這個子模塊大量運用了 Composite 設計模式。同時也規范了 Catalina 的啟動及停止等事件的執行流程。從代碼閱讀的角度看,這個子模塊應該是我們閱讀和學習的重點。
  • Connectors 子模塊:如果說上面三個子模塊實現了 Tomcat 應用服務器的話,那么這個子模塊就是 Web 服務器的實現。所謂連接器 (Connector) 就是一個連接客戶和應用服務器的橋梁,它接收用戶的請求,并把用戶請求包裝成標準的 Http 請求 (包含協議名稱,請求頭 Head,請求方法是 Get 還是 Post 等等)。同時,這個子模塊還按照標準的 Http 協議,負責給客戶端發送響應頁面,比如在請求頁面未發現時,connector 就會給客戶端瀏覽器發送標準的 Http 404 錯誤響應頁面。
  • Resource 子模塊:這個子模塊包含一些資源文件,如 Server.xml 及 Web.xml 配置文件。嚴格說來,這個子模塊不包含 java 源代碼,但是它還是 Tomcat 編譯運行所必需的。
  • 2.2 Tomcat 運行流程

    圖 2-2 tomcat 運行流程

    假設來自客戶的請求為:http://localhost:8080/test/index.jsp

  • 請求被發送到本機端口 8080,被在那里偵聽的 Coyote HTTP/1.1 Connector 獲得
  • Connector 把該請求交給它所在的 Service 的 Engine 來處理,并等待 Engine 的回應
  • Engine 獲得請求 localhost:8080/test/index.jsp,匹配它所有虛擬主機 Host
  • Engine 匹配到名為 localhost 的 Host(即使匹配不到也把請求交給該 Host 處理,因為該 Host 被定義為該 Engine 的默認主機)
  • localhost Host 獲得請求 /test/index.jsp,匹配它所擁有的所有 Context
  • Host 匹配到路徑為 /test 的 Context(如果匹配不到就把該請求交給路徑名為""的 Context 去處理)
  • path="/test"的 Context 獲得請求 /index.jsp,在它的 mapping table 中尋找對應的 servlet
  • Context 匹配到 URL PATTERN 為 *.jsp 的 servlet,對應于 JspServlet 類
  • 構造 HttpServletRequest 對象和 HttpServletResponse 對象,作為參數調用 JspServlet 的 doGet 或 doPost 方法
  • Context 把執行完了之后的 HttpServletResponse 對象返回給 Host
  • Host 把 HttpServletResponse 對象返回給 Engine
  • Engine 把 HttpServletResponse 對象返回給 Connector
  • Connector 把 HttpServletResponse 對象返回給客戶 browser
  • 3 Connector 源碼分析

    3.1 Tomcat 的啟動分析與集成設想

    我們知道,啟動 tomcat 有兩種方式:

    • 雙擊 bin/startup.bat
    • 運行 bin/catalina.bat run

    它們對應于 Bootstrap 與 Catalina 兩個類,我們現在只關心 Catalina 這個類,這個類使用 Apache Digester 解析 conf/server.xml 文件生成 tomcat 組件,然后再調用 Embedded 類的 start 方法啟動 tomcat。

    所以,集成 Tomcat 的方式就有以下兩種了:

    • 沿用 tomcat 自身的 server.xml
    • 自己定義一個 xml 格式來配置 tocmat 的各參數,自己再寫解析這段 xml,然后使用 tomcat 提供的 API 根據這些 xml 來生成 Tomcat 組件,最后調用 Embedded 類的 start 方法啟動 tomcat

    個人覺得第一種方式要優越,給開發者比較好的用戶體驗,如果使用這種,直接模仿 Catalina 類的方法即可實現集成。

    目前,JOnAS 就使用了這種集成方式,JBoss、GlassFish 使用的第二種自定義 XML 的方式。

    3.2 Connector 類圖與順序圖

    圖 3-1 Connector 相關類圖

    圖 3-2 Connector 工作流程順序圖

    從上面二圖中我們可以得到如下信息:

  • Tomcat 中有四種容器 (Context、Engine、Host、Wrapper),前三者常見,第四個不常見但它也是實現了 Container 接口的容器
  • 如果要自定義一個 Connector 的話,只需要實現 ProtocolHander 接口, 該接口定義如下:
  • 圖 3-3 自定義 connector 時需實現的 ProtocolHandler 接口

    Tomcat 以 HTTP(包括 BIO 與 NIO)、AJP、APR、內存四種協議實現了該接口(它們分別是:AjpAprProtocol、AjpProtocol、Http11AprProtocol、Http11NioProtocol、Http11Protocal、JkCoyoteHandler、MemoryProtocolHandler),要使用哪種 Connector 就在 conf/server.xml 中配置,在 Connector 的構造函數中會通過反射實例化所配置的實現類:

    <Connector port="8181" protocol="org.apache.coyote.http11.Http11AprProtocol " />

    3.3 Connector 的工作流程

    下面我們以 Http11AprProtocol 為例說明 Connector 的工作流程。

  • 它將工作委托給 NioEndpoint 類。在 NioEndpoint 類的 init 方法中構建一個 SocketServer(當然,不同的實現類會有一些微小的變化,例如如果是 NIO,它構建的就是 SocketServerChannel)
  • 在 NioEndpoint.Acceptor 類中會接收一個客戶端新的連接請求,如下圖:

  • 在 NioEndpoint 類中,有一個內部接口 Handle,該接口定義如下:

  • 在 Http11NioProtocol 類中實現了 Handle 這個內部接口,并調用 Http11NioProcessor 類 (該類實現了 ActionHook 回調接口)。在 Response 類中會調用 ActionHook 實現類的相關方法的,Response 類的 action 方法如下:

  • Http11NioProcessor 的 process 實現方法中,會通過 Adapter 來調用 Servler 容器生成響應結果。
  • 轉載于:https://www.cnblogs.com/davidwang456/articles/11249466.html

    總結

    以上是生活随笔為你收集整理的Tomcat 处理 HTTP 请求源码分析(上)【转】的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 就要操av| 国产97视频 | 午夜电影网站 | 性色av免费观看 | 国产亚洲视频在线观看 | 在线亚洲色图 | 美国黄色一级视频 | 制服丝袜影音先锋 | 欧美国产不卡 | 欧美一区二区三区影视 | 欧美日韩免费观看一区=区三区 | 国内精品久 | www.久久 | 少妇流白浆 | 亚洲精品午夜国产va久久成人 | 姝姝窝人体www聚色窝 | www.youjizz国产 | 抱着老师的嫩臀猛然挺进视频 | 麻豆短视频在线观看 | 精品视频国产 | 久久午夜精品视频 | 久久大片| 无码av免费精品一区二区三区 | 在线一区视频 | 男阳茎进女阳道视频大全 | 亚洲精品乱码久久久久久久 | 影音先锋中文字幕在线 | 香蕉视频网站 | 成人免费公开视频 | 成人啪啪网站 | www.色妞 | 精品久久国产字幕高潮 | 亚洲成人91| 欧美日韩国产伦理 | 成人免费毛片观看 | 午夜免费福利影院 | 爆操少妇| 亚洲v欧美| 97人人超 | 久久久精品一区二区涩爱 | 成年人在线免费观看视频网站 | 麻豆伊甸园| 天天摸夜夜操 | 日韩亚洲欧美在线观看 | 污片免费观看 | 污污网址在线观看 | 国产鲁鲁视频在线观看免费 | 日本高清视频一区 | 欢乐谷在线观看免费播放高清 | 亚洲熟妇色自偷自拍另类 | heyzo久久 | 成人午夜性视频 | 美女隐私无遮挡免费 | 中文字幕第六页 | 久久的色偷偷 | 日日噜 | 农村末发育av片一区二区 | 欧美日韩一级二级 | 亚洲区精品 | 日本护士╳╳╳hd少妇 | 久久久久久久久国产精品一区 | 色噜噜狠狠狠综合曰曰曰88av | 黄色大片视频网站 | 四虎成人精品在永久免费 | 精品少妇一区二区 | 九色自拍视频 | 中文在线观看免费 | 亚洲欧美一区二区三区在线 | 中文字幕视频 | 蜜桃视频一区二区在线观看 | 老司机精品视频在线播放 | 国产视频123| 男同激情视频 | 97人妻一区二区精品视频 | 91免费视 | 日本女人一区二区三区 | 久久a视频 | 永久黄色网址 | 国产香蕉久久 | 天天透天天操 | 18禁免费无码无遮挡不卡网站 | 丝袜国产在线 | 午夜影院18 | 电影《两个尼姑》免费播放 | www.激情五月.com | 91在线无精精品入口 | 比利时xxxx性hd极品 | 污视频在线 | 国产不雅视频 | 特级西西444www | 手机av在线免费观看 | 日韩国产小视频 | 国产一级特黄a高潮片 | 国产18在线观看 | 在线看国产精品 | 五月婷婷六月婷婷 | 国产精品麻豆一区二区三区 | mm1313亚洲国产精品美女 | 精品无码国产av一区二区三区 |