Web 服務器工作原理及相關術語

Web 服務器工作原理

 

幾個關鍵疑問:

Web服務器是怎麼工作的?怎麼處理來着世界各地的http請求的?幕後都做了哪些動作?JavaServlet API (如ServerletContext,ServerletRequest, Servlet Response,Session等)都扮演什麼角色呢?

 

1      什麼是Web 服務器,應用服務器,Web容器

可以用一句話來總結web服務器和應用服務器的概念關係,

“在過去它們是有區別的,但是慢慢地這兩個不同的分類慢慢合併,在如今的大多數情況下可以把它們看出一個整體”。

 

我們來說說當初的故事,在Web初期,大多數內容都是靜態的,Web服務器通過HTTP協議來提供靜態頁面內容和圖片服務。但是用戶想要根據自己的輸入來動態獲取內容時,這意味着我們可以爲每個Web請求啓動一個進程來動態產生內容,如jsp,ASP,php等動態內容都需要通過CGI,FastCGI,ISAP等接口交給其他程序去處理,這裏的其他程序就是應用服務器,如JBoss,WebLogic,WebSphere。通俗來說,Web服務器專門負責處理HTTP請求,應用服務器通過很多協議來爲提供商業邏輯。以Java EE爲例,Web服務器主要處理靜態頁面和作爲Servlet容器,解釋執行servlet/JSP,而應用服務器是運行業務邏輯的,主要是EJB、JNDI和JMX API等J2EE API方面的,還包括事務處理、數據庫連接等功能。

         現在的應用服務器一般也支持HTTP協議,因此兩者之間的區別沒有這麼清晰,但是應用服務器的HTTP部分僅是支持,沒有特別優化,因此很少見tomcat直接暴露給外界,而是和nginx、Apache等配合,只讓tomcat處理JSP和Servlet部分。因此當說到“Web服務器”時,通常要把它認爲是以HTTP爲核心,WebUI爲導向的應用;當說到“應用服務器”,可能想到“高負載,企業級特性,食物和隊列,多通道通信(HTTP和更多的協議)”。

         第三個術語,Web容器,在Java中,web容器一般指servlet容器。

         Servlet容器管理servlet的生命週期、把URL映射到特定的servlet、確保URL請求擁有正確的訪問權限和更多類似的服務。Servlet容器就是運行servlet和維護它生命週期的運行環境

2      什麼是servlet?作用?

在java裏,servlet使開發人員可以編寫根據請求動態生成內容的服務端組件。Servlet是一個在javax.servlet包中定義的接口,提供servlet生命週期中的三個基本方法:init()、service()和destroy()。每個servlet都要實現這些方法,並在生命週期中的特定時間由服務器調用這些方法。

2.1     類的懶(延遲)加載和預加載

         類加載器通過懶加載(lazy-loading)或預加載(eagerloading)自動的把servlet類加載到容器裏。每個請求都有自己的線程,而一個servlet對象可以同時爲多個線程服務,當servlet對象不被使用時,會被JVM做垃圾回收。

         懶(延遲)加載,是指在請求到來時才加載並初始化servlet,然後使用servlet完成請求的服務。

         預加載,是在容器啓動時就加載並初始化servlet,當請求到達時就可以直接拿來用。

2.2     什麼是ServletContext?由誰創建?

Servlet容器啓動時,會部署並加載所有的web應用,當web應用被加載時,Servlet容器會一次性爲每個應用創建ServletContext並把它保存在內存裏。Servlet容器會處理web應用的web.xml文件,並一次性創建在web.xml裏定義的ServletFilterListener,保存在內存。當Servlet容器關閉時,會寫在所有的web應用和ServletContext,所有的Servlet、Filter和Listener 實例都會被銷燬。

         Web應用的部署文件標明分佈式時,web應用的每個虛擬機都有一個ServletContext實例,這時,ServletContext不再是全局共享信息的變量。

2.3     ServletRequest,ServletResponse生命週期

Servlet容器是包含在web服務器中的,web服務器監聽來着特定端口(通常是80)的HTTP請求。當客戶端發送一個HTTP請求時,Servlet容器創建新的HttpServletRequestHttpServletResponse對象,並傳遞給已經創建的Filter和URL模式與請求URL匹配的Servlet實例的方法,所有的這些都使用同一個線程。

         Request對象提供獲取HTTP請求的所有信息的入口,如請求頭,請求實體。Response對象提供控制和發送HTTP響應的方法,如設置響應頭和響應實體。當HTTPResponse被提交併結束後,Request和Response對象就被銷燬。

2.4     Session管理

當客戶端第一次訪問Web應用或第一次使用Request。GetSession(0獲取HttpSession時,Servlet容器會創建Session生成一個long類型的唯一ID並把它保存在服務器內存。Servlet容器同樣會在HTTP響應裏設置一個cookie,cookie的名是JSESSIONID,並且cookie的值是SessionID

         在cookie有效期,客戶端之後的請求都要把這個cookie返回服務器,Servlet容器會利用帶有名爲JSESSIONID的cookie檢測每一個到來的HTTP請求頭,並使用cookie的值從服務器內存裏獲取相關的HttpSession。

         HttpSession會一直存貨,除非超過一段時間沒有使用。Web.xml裏可以設置這個時間,默認是30分鐘。意味着如果客戶端30分鐘沒有訪問web應用的話,Servlet容器就會銷燬這個Session。之後的每一個請求,即使帶有特定的cookie,也不會訪問到同一個Session,Servlet容器會新建一個新的Session。

2.5     如何確保Servlet和Filter線程安全?

通過上文,我們知道所有的請求在共享ServletFilter實例,不同的線程使用同一個實例。否則,對每個請求都重新創建一個實例會耗費很多資源。

         因此,不要使用Servlet或者Filter的實例變量來存放請求或者會話範圍內的數據。這些數據會被其他Session的所有請求共享,這是非線程安全的。


主要內容摘自http://www.importnew.com/15020.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章