本文系統梳理 Java Web 前端性能優化的五大支柱技術:Flush 分塊輸出、動靜分離架構、HTTP 持久連接、協議層緩存控制、CDN 內容分發,並附帶 Nginx/Tomcat 實戰配置與 ab 壓測數據對比。
對於大型頁面,一次性輸出會導致長時間白屏。調用 HttpServletResponse.getWriter().flush() 可按文檔流順序分批輸出,讓用戶更快看到頁面框架。權衡點:Flush 增加網絡分片與瀏覽器渲染次數,僅建議在頁面體積較大、首屏關鍵資源可提前輸出的場景使用。
Tomcat 擅長動態業務,短板在靜態資源併發處理。引入 Nginx 作為前置反向代理:
expires 30d 開啟瀏覽器強緩存proxy_pass 轉發至後端 Tomcat 叢集upstream tomcat_cluster {
server 192.168.1.117:8080; # 可擴展為多節點實現負載均衡
}
server {
listen 9090;
root /home/user/ROOT; # 靜態資源根目錄
location ~ .*\.jsp$ {
proxy_pass https://tomcat_cluster;
proxy_set_header Host $host;
}
location ~ .*\.(gif|jpg|jpeg|png|css|js)$ {
expires 30d;
}
}
| 場景 | 吞吐量 | 提升倍數 |
|---|---|---|
| 靜態圖片 (Nginx) | 2,267 req/s | 4.2× |
| 靜態圖片 (Tomcat) | 535 req/s | 基準 |
| 動態 JSP (Nginx 代理) | 2,380 req/s | -10% (代理開銷) |
| 動態 JSP (Tomcat 直連) | 2,660 req/s | 基準 |
結論:靜態資源性能質變,動態請求微損但換取架構擴展性,綜合收益顯著。
Tomcat server.xml 中 Connector 參數 maxKeepAliveRequests(預設 100)與 keepAliveTimeout 控制長連接。ab 測試證實:開啟 Keep-Alive 後靜態資源吞吐量從 1,973 req/s 飆升至 5,983 req/s(約 3 倍),得益於 TCP 連接複用減少三次握手與慢啟動。
在 JSP 中手工處理 If-Modified-Since / Last-Modified / 304 Not Modified 頭部,讓瀏覽器緩存動態頁面片段。實測:添加緩存協商邏輯後,test.jsp 吞吐量從 955 req/s 提升至 2,829 req/s,傳輸體積歸零,性能提升 3 倍且無業務代碼變更。
CDN 通過 CNAME 接入,智能 DNS 根據地理位置、網絡狀態、節點健康度將用戶導向最優邊緣節點。騰訊等大型站點已大規模部署(如 mat1.gtimg.com、img1.gtimg.com 解析至不同 IP 段)。國內免費 CDN 服務(如 Webluker)可供中小項目驗證效果。
maxKeepAliveRequestsLast-Modified / ETag 協商緩存Cache-Control: max-age=31536000)