轉自:?https://zhuanlan.zhihu.com/p/21349186?
前情提要:
Tomcat高效響應的秘密(一) Sendfile與Gzip
Tomcat高效響應的秘密(二) keep alive
前面高效響應的兩篇,我們分析了Sendfile的特性以及HTTP1.1的keep-alive特性,基于這些功能,Tomcat可以更快速的響應請求。
而在keep-alive的特性分析時,我們發現是服務端與客戶端在keep-alive未超時的時候,一直保持TCP的連接,這樣在新的請求到達時就避免了重新握手和斷開連接。
為了進一步提升性能,Google率先發起并推出了Spdy,許多主流的瀏覽器都允以支持。最終IETF以此為參照,提出了HTTP/2的標準。
在減少延遲,加速頁面加載方面,維基百科上有如下描述:
Data compression of HTTP headers
HTTP/2 Server Push.
Pipelining of requests
Fixing the head-of-line blocking problem in HTTP 1.x
Multiplexing multiple requests over a single TCP connection
我們來試用一樣HTTP/2,直觀感受一下它的特點。
需要的材料有:
-
版本要大于 Tomcat 9.0.0 M4
-
OpenSSL
-
使用OpenSSL生成的證書文件
觀察新版本的Tomcat配置文件server.xml,其中包含如下內容:
<!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443?with HTTP/2
This connector uses the APR/native implementation. When using the
APR/native implementation or the OpenSSL engine with NIO or NIO2 then
the OpenSSL configuration attributes must be used.
-->
<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
maxThreads="150" SSLEnabled="true" >
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
<SSLHostConfig>
<Certificate certificateKeyFile="conf/localhost-rsa-key.pem"
certificateFile="conf/localhost-rsa-cert.pem"
certificateChainFile="conf/localhost-rsa-chain.pem"
type="RSA" />
</SSLHostConfig>
</Connector>
-->
由于HTTP/2只支持在HTTPS中使用,因此證書是必須的,制做證書的原理,各位請自行Google。
在Tomcat中,要配置其支持HTTP/2,需要以下步驟:
-
使用openssl,執行如下命令生成證書
openssl genrsa -out?server.key?2048
openssl rsa -in server.key -out server.key
openssl req -new -x509 -key server.key -out?ca.crt?-days 3650
2. 官網下載Native的dll文件,拷貝到c:\windows\System32目錄下,以支持Apr Connector。
3. 修改server.xml,將支持http2的https Connector配置去掉注釋,修改其中對應的證書路徑為第一步生成的路徑。
<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol" maxThreads="150" SSLEnabled="true" > <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" /> <SSLHostConfig> <Certificate certificateKeyFile="conf/server.key" certificateFile="conf/ca.crt"/> </SSLHostConfig> </Connector>
4. 重啟Tomcat
5. 使用https://localhost:8443訪問
6. 查看logs目錄下中對應日期的accesslog, 默認情況下,tomcat的配置中默認開啟了accesslog ,此時我們發現,請求使用的協議已經是HTTP 2.0

7. 為了觀察更加細致,可以配置Tomcat的日志級別,從而輸出更加詳細的日志。設置org.apache.coyote.http2.level = FINE,關于日志的原理,可以參考之前兩篇文章:
Tomcat的Logging
Tomcat的Logging -- 內部實現方式
8. github 下載一個測試的demo?GitHub - jfclere/h2_demos
下載后需要在本地執行.sh文件,生成對應的html文件和相應的images。
9. 部署第8步生成的文件到某個特定應用中,或是新建一個空應用將其添加進去,訪問這個應用,查看頁面對應的執行時間。
通過上面的這些步驟,我們可以更直觀的體驗一把HTTP/2帶來的性能提升。我們后面的文章再分析其實現原理,各位可以先看之前的這篇文章
服務器推送之WebSocket--原理及Tomcat的實現,了解協議的upgrade
在Youtube上,有Tomcat 的commiter 之一 Mark 介紹Tomcat 的Http/2的視頻,墻外的朋友可以直接訪問該鏈接:https://www.youtube.com/watch?v=oCFwgMvouis
墻內的朋友,可以回復關鍵字http2,獲取下載地址。
相關閱讀
Tomcat的Connector組件
Tomcat高效響應的秘密(二) keep alive
Tomcat高效響應的秘密(一) Sendfile與Gzip
服務器推送之WebSocket--原理及Tomcat的實現
Tomcat的Logging
猜你喜歡
-
深度揭秘亂碼問題背后的原因及解決方式
-
WEB應用是怎么被部署的?
-
怎樣調試Tomcat源碼
-
IDE里的Tomcat是這樣工作的!
-
重定向與轉發的本質區別
-
怎樣閱讀源代碼
本專欄由曾從事應用服務器核心研發的工程師維護。文章深入Tomcat源碼,分析應用服務器的實現細節,工作原理及與之相關的技術,使用技巧,工作實戰等。起于Tomcat但不止于此。同時會分享并發、JVM等,內容多為原創,歡迎關注。
推薦關注同名公眾號:?Tomcat那些事兒