1. 河豚號 > 生活百科 >

web服務器和應用服務器的區(qū)別,一分鐘帶你搞懂這兩者的關聯

很多時候我們都想知道,web容器或web服務器(比如Tomcat或者jboss)是怎樣工作的?它們是怎樣處理來自全世界的http請求的?它們在幕后做了什么動作?Java Servlet API(例如ServletContext,ServletRequest,ServletResponse和Session這些類)在其中扮演了什么角色?這些都是web應用開發(fā)者或者想成為web應用開發(fā)者的人必須要知道的重要問題或概念。在這篇文章里,我將會盡量給出以上某些問題的答案。請集中精神!

文章章節(jié):

什么是web服務器、應用服務器和web容器?

什么是Servlet?他們有什么作用?

什么是ServletContext?它由誰創(chuàng)建?

ServletRequest和ServletResponse從哪里進入生命周期?

如何管理Session?知道cookie嗎?

如何確保線程安全?

什么是web服務器,應用服務器和web容器?

我先討論web服務器和應用服務器。讓我在用一句話大概講講:

“在過去它們是有區(qū)別的,但是這兩個不同的分類慢慢地合并了,而如今在大多在情況下和使用中可以把它們看成一個整體。”

在Mosaic瀏覽器(通常被認為是第一個圖形化的web瀏覽器)和超鏈接內容的初期,演變出了“web服務器”的新概念,它通過HTTP協議來提供靜態(tài)頁面內容和圖片服務。在那個時候,大多數內容都是靜態(tài)的,并且HTTP 1.0只是一種傳送文件的方式。但在不久后web服務器提供了CGI功能。這意味著我們可以為每個web請求啟動一個進程來產生動態(tài)內容?,F在,HTTP協議已經很成熟了并且web服務器變得更加復雜,擁有了像緩存、安全和session管理這些附加功能。隨著技術的進一步成熟,我們從Kiva和NetDynamics學會了公司專屬的基于Java的服務器端技術。這些技術最終全都融入到我們今天依然在大多數應用開發(fā)里使用的JSP中。

 

Web服務器是怎樣工作的(工作原理)?

 

以上是關于web服務器的。現在我們來討論應用服務器。

在同一時期,應用服務器已經存在并發(fā)展很長一段時間了。一些公司為Unix開發(fā)了Tuxedo(面向事務的中間件)、TopEnd、Encina等產品,這些產品都是從類似IMS和CICS的主機應用管理和監(jiān)控環(huán)境衍生而來的。大部分的這些產品都指定了“封閉的”產品專用通信協議來互連胖客戶機(“fat” client)和服務器。在90年代,這些傳統的應用服務器產品開始嵌入HTTP通信功能,剛開始要利用網關來實現。不久后它們之間的界線開始變得模糊了。

同時,web服務器越來越成熟,可以處理更高的負載、更多的并發(fā)和擁有更好的特性;應用服務器開始添加越來越多的基于HTTP的通信功能。所有的這些導致了web服務器與應用服務器的界線變得更窄了。

目前,“應用服務器”和“web服務器”之間的界線已經變得模糊不清了。但是人們還把這兩個術語區(qū)分開來,作為強調使用。

當有人說到“web服務器”時,你通常要把它認為是以HTTP為核心、web UI為向導的應用。當有人說到“應用服務器”時,你可能想到“高負載、企業(yè)級特性、事務和隊列、多通道通信(HTTP和更多的協議)”。但現在提供這些需求的基本上都是同一個產品。

以上就是關于web服務器和應用服務器的全部內容?,F在我們來看看第三個術語,即web容器。

 

Web服務器是怎樣工作的(工作原理)?

 

在Java方面,web容器一般是指Servlet容器。Servlet容器是與Java Servlet交互的web容器的組件。web容器負責管理Servlet的生命周期、把URL映射到特定的Servlet、確保URL請求擁有正確的訪問權限和更多類似的服務。綜合來看,Servlet容器就是用來運行你的Servlet和維護它的生命周期的運行環(huán)境。

什么是Servlet?他們有什么作用?

在Java里,Servlet使你能夠編寫根據請求動態(tài)生成內容的服務端組件。事實上,Servlet是一個在javax.servlet包里定義的接口。它為Servlet的生命周期聲明了三個基本方法——init()、service()和destroy()。每個Servlet都要實現這些方法(在SDK里定義或者用戶定義)并在它們的生命周期的特定時間由服務器來調用這些方法。

類加載器通過懶加載(lazy-loading)或者預加載(eager loading)自動地把Servlet類加載到容器里。每個請求都擁有自己的線程,而一個Servlet對象可以同時為多個線程服務。當Servlet對象不再被使用時,它就會被JVM當做垃圾回收掉。

懶加載的Servlet

 

Web服務器是怎樣工作的(工作原理)?

 

 

Web服務器是怎樣工作的(工作原理)?

 

預加載的Servlet

 

Web服務器是怎樣工作的(工作原理)?

 

 

Web服務器是怎樣工作的(工作原理)?

 

什么是ServletContext?它由誰創(chuàng)建?

當Servlet容器啟動時,它會部署并加載所有的web應用。當web應用被加載時,Servlet容器會一次性為每個應用創(chuàng)建Servlet上下文(ServletContext)并把它保存在內存里。Servlet容器會處理web應用的web.xml文件,并且一次性創(chuàng)建在web.xml里定義的Servlet、Filter和Listener,同樣也會把它們保存在內存里。當Servlet容器關閉時,它會卸載所有的web應用和ServletContext,所有的Servlet、Filter和Listner實例都會被銷毀。

從Java文檔可知,ServletContext定義了一組方法,Servlet使用這些方法來與它的Servlet容器進行通信。例如,用來獲取文件的MIME類型、轉發(fā)請求或者編寫日志文件。在web應用的部署文件(deployment descriptor)標明“分布式”的情況下,web應用的每一個虛擬機都擁有一個上下文實例。在這種情況下,不能把Servlet上下文當做共享全局信息的變量(因為它的信息已經不具有全局性了)??梢允褂猛獠抠Y源來代替,比如數據庫。

ServletRequest和ServletResponse從哪里進入生命周期?

Servlet容器包含在web服務器中,web服務器監(jiān)聽來自特定端口的HTTP請求,這個端口通常是80。當客戶端(使用web瀏覽器的用戶)發(fā)送一個HTTP請求時,Servlet容器會創(chuàng)建新的HttpServletRequest和HttpServletResponse對象,并且把它們傳遞給已經創(chuàng)建的Filter和URL模式與請求URL匹配的Servlet實例的方法,所有的這些都使用同一個線程。

request對象提供了獲取HTTP請求的所有信息的入口,比如請求頭和請求實體。response對象提供了控制和發(fā)送HTTP響應的便利方法,比如設置響應頭和響應實體(通常是JSP生成的HTML內容)。當HTTP響應被提交并結束后,request和response對象都會被銷毀。

如何管理Session?知道cookie嗎?

當客戶端第一次訪問web應用或者第一次使用request.getSession()獲取HttpSession時,Servlet容器會創(chuàng)建Session,生成一個long類型的唯一ID(你可以使用session.getId()獲取它)并把它保存在服務器的內存里。Servlet容器同樣會在HTTP響應里設置一個Cookie,cookie的名是JSESSIONID并且cookie的值是session的唯一ID。

根據HTTP cookie規(guī)范(正規(guī)的web瀏覽器和web服務器必須遵守的約定),在cookie的有效期間,客戶端(web瀏覽器)之后的請求都要把這個cookie返回給服務器。Servlet容器會利用帶有名為JSESSIONID的cookie檢測每一個到來的HTTP請求頭,并使用cookie的值從服務器內容里獲取相關的HttpSession。

HttpSession會一直存活著,除非超過一段時間沒使用。你可以在web.xml里設定這個時間段,默認時間段是30分鐘。因此,如果客戶端已經超過30分鐘沒有訪問web應用的話,Servlet容器就會銷毀Session。之后的每一個請求,即使帶有特定的cookie,都再也不會訪問到同一個Session了。servletcontainer會創(chuàng)建一個新的Session。

現有的Session

 

Web服務器是怎樣工作的(工作原理)?

 

新的Session

 

Web服務器是怎樣工作的(工作原理)?

 

另外,在客戶端的session cookie擁有一個默認的存活時間,這個時間與瀏覽器的運行時間相同。因此,當用戶關閉瀏覽器后(所有的標簽或者窗口),客戶端的Session就會被銷毀。重新打開瀏覽器后,與之前的Session關聯的cookie就再也不會被發(fā)送出去了。再次使用request.getSession()會返回一個全新的HttpSession并且使用一個全新的session ID來設置cookie。

如何確保線程安全?

你現在應該已經知道所有的請求都在共享Servlet和Filter。這是Java的一個很棒的特性,它是多線程的并且不同的線程(即HTTP請求)可以使用同一個實例。否則,對每一個請求都重新創(chuàng)建一個實體會耗費很多的資源。

 

Web服務器是怎樣工作的(工作原理)?

 

本文由網上采集發(fā)布,不代表我們立場,轉載聯系作者并注明出處:http://m.zltfw.cn/shbk/37602.html

聯系我們

在線咨詢:點擊這里給我發(fā)消息

微信號:15705946153

工作日:9:30-18:30,節(jié)假日休息