總結:服務器批量處理http請求的大致流程
- 一·客戶端發起請求:可以多個請求同時發送
- 二·Web服務器解析請求(如:Nginx):可以多個請求同時解析
- 三·Servlet容器接收請求(如:tomcat):可以多個請求同時處理
- 四·Servlet初始化(如果需要):
- 五·調用Servlet的service()方法:
- 六·選擇適當的HTTP方法處理:
- 七·Servlet處理請求:
- 八·生成響應:
- 九·Servlet容器發送響應:
- 十一·Servlet銷毀(如果需要):
- 十二·線程返回到線程池(如果使用):
一·客戶端發起請求:可以多個請求同時發送
1.用戶通過瀏覽器訪問一個URL,該URL與某個Servlet相關聯。
2.瀏覽器構造一個HTTP請求,請求中包含特定的URL、頭部信息、參數等;并將它發送到Web服務器。
二·Web服務器解析請求(如:Nginx):可以多個請求同時解析
1.Web服務器主要作用:請求分發、反向代理、負載均衡器、HTTP緩存服務器,支持靜態文件服務,一般不會處理動態請求。
動態請求:比如前端調用某API接口,需要后端服務器運算處理完,再響應給前端報文
靜態請求:比如前端調用某API接口,后端直接將某個資源讀取返回,不用任何運算。注意:web服務器、servlet容器兩者一般都可以稱為服務器,如何區分就看具體實際情況了
2.每個服務器都會存在一個,監聽指定端口的死循環socket線程,除非服務器關機,這個線程才會停止循環
3.該socket線程每接收到一個http請求,就會從服務器的線程池里面獲取一個空閑線程來處理該請求
4.這個新線程接著就會解析請求中的URL路徑和參數,然后根據URL映射規則,決定返回哪個靜態資源,或者將該http請求繼續轉發給哪個Servlet容器(如Tomcat、Jetty等)來處理。
三·Servlet容器接收請求(如:tomcat):可以多個請求同時處理
1.Servlet容器主要作用:動態請求的運算處理
2.每個服務器都會存在一個,監聽指定端口的死循環socket線程,除非服務器關機,這個線程才會停止循環
3.該socket線程每接收到一個http請求,就會從服務器的線程池里面獲取一個空閑線程來處理該請求
4.這個新線程接著就會解析請求中的URL路徑和參數,然后根據URL映射規則,找到對應的Servlet對象;并根據請求信息創建HttpServletRequest對象和HttpServletResponse對象,再傳遞到Servlet對象的service方法里面,然后繼續執行service方法
注意:
(1)如果多個URL映射的是同一個servlet程序處理,那么servlet容器會給每個請求分配一個線程進行單獨處理;
(2)servlet容器傳遞給各個線程的servlet對象都是同一個;
(3)servlet容器給每個線程中的同一個servlet對象之service方法,傳遞的兩個參數HttpServletRequest對象和HttpServletResponse對象都是不一樣的,這兩個對象都是根據http請求報文即時生成的。
(4)這樣雖然節省了服務器資源,但這也是造成可能存在高并發的核心原因
(5)因此servlet類中的成員變量要慎重使用,如果存在頻繁修改的變量,就盡量不要設置為成員屬性,而是設置為方法內的局部變量
四·Servlet初始化(如果需要):
1.如果Servlet實例還沒有初始化,容器會調用init()方法進行初始化。這個方法在Servlet的生命周期中只會執行一次。
五·調用Servlet的service()方法:
1.Servlet容器調用Servlet的service()方法,并傳遞ServletRequest和ServletResponse對象作為參數。
六·選擇適當的HTTP方法處理:
1.在service()方法內,Servlet根據HTTP請求的方法(GET、POST等)選擇調用適當的doGet()、doPost()等方法。
七·Servlet處理請求:
1.在doGet()、doPost()等方法中,開發者編寫具體的業務邏輯來處理請求。這可能涉及到讀取參數、執行業務邏輯、訪問數據庫等。
八·生成響應:
1.Servlet生成一個ServletResponse對象,其中包含要返回給客戶端的數據,比如HTML內容。
九·Servlet容器發送響應:
1.Servlet容器將ServletResponse對象傳遞給Web服務器,然后服務器通過網絡將響應發送回客戶端。
十一·Servlet銷毀(如果需要):
1.如果Servlet容器檢測到應用程序正在關閉或者Servlet的生命周期已經結束,它會調用Servlet的destroy()方法,釋放資源。
十二·線程返回到線程池(如果使用):
1.處理請求的線程返回到線程池,等待下一個請求。