欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

web 容器的設(shè)計如何實現(xiàn)

 更新時間:2016年12月01日 15:52:24   作者:seaboat 汪洋之舟  
這篇文章主要介紹了web 容器的設(shè)計如何實現(xiàn)的相關(guān)資料,本文旨在介紹如何設(shè)計一個web容器,只探討實現(xiàn)的思路,并不涉及過多的具體實現(xiàn)。把它分解劃分成若干模塊和組件,每個組件模塊負責(zé)不同的功能,需要的朋友可以參考下

web 容器的設(shè)計

開發(fā)一個web容器涉及很多不同方面不同層面的技術(shù),例如通信層的知識,程序語言層面的知識等等,且一個可用的web容器是一個比較龐大的系統(tǒng),要說清楚需要很長的篇幅,本文旨在介紹如何設(shè)計一個web容器,只探討實現(xiàn)的思路,并不涉及過多的具體實現(xiàn)。把它分解劃分成若干模塊和組件,每個組件模塊負責(zé)不同的功能,下圖列出一些基本的組件,并將對每個組件進行介紹。

 web容器,設(shè)計,JSP

連接接收器

主要的職責(zé)就是監(jiān)聽是否有客戶端套接字連接并接收socket,再將socket交由任務(wù)執(zhí)行器(線程池)執(zhí)行。不斷從系統(tǒng)底層讀取socket,做盡可能少的處理,再扔進線程池。為什么強調(diào)要做盡可能少的處理?這里關(guān)系到系統(tǒng)性能問題,過多的處理會嚴重影響吞吐量。因為一般只有一個接收器(一條線程負責(zé)套接字接收工作),所以它對每次接收處理的時間長短將很可能對整體性能產(chǎn)生影響。于是接收器所干的活都是非常少且簡單的,僅僅維護了幾個狀態(tài)變量、流量控制閘門的累加操作、serverSocket的接收操作、設(shè)置接收到的socket的一些屬性、將接收到的socket放入線程池以及一些異常處理。其他需要較長時間處理的邏輯就交給了線程池,例如對socket底層數(shù)據(jù)的讀取,對http協(xié)議報文的解析及響應(yīng)客戶端的一些操作等等。

web容器,設(shè)計,JSP

連接數(shù)控制器

對于一臺機器而言,訪問請求的總流量有高峰期且服務(wù)器有物理極限,為了保證web服務(wù)器不被沖垮我們需要采取一些措施進行保護預(yù)防,需要稍微說明的此處的流量更多的是指套接字的連接數(shù),通過控制套接字連接個數(shù)來控制流量。其中一種有效的方法就是采取流量控制,它就像在流量的入口增加了一道閘門,閘門的大小決定了流量的大小,一旦達到最大流量將關(guān)閉閘門停止接收直到有空閑通道。計數(shù)器可用JDK的AQS框架實現(xiàn)。

web容器,設(shè)計,JSP

套接字工廠

不同的使用場合可能需要不同的安全級別,例如在支付相關(guān)的交易就必須對信息加密后再發(fā)送,這其中還涉及到密鑰協(xié)商的過程,而在另外一些普通場合則無需對報文加密。反應(yīng)到應(yīng)用層則是使用http與https的問題。
簡單講TLS\SSL協(xié)議給每次通信①提供認證服務(wù),認證本次會話實體身份的合法性。②提供加密服務(wù),強加密機制能保證通信過程中的消息不會被破譯。③提供防篡改服務(wù),利用Hash算法對消息進行簽名,通過驗證簽名保證通信內(nèi)容不被篡改。
http協(xié)議對應(yīng)Socket,而https則對應(yīng)SSLSocket。如何生成Socket及SSLSocket則交由套接字工廠。

web容器,設(shè)計,JSP

任務(wù)定義器——Task

定義需要執(zhí)行的任務(wù),告訴線程池要執(zhí)行什么樣的任務(wù)。任務(wù)主要分為三點:處理socket并響應(yīng)客戶端、連接數(shù)計數(shù)器減一、關(guān)閉socket。其中對socket的處理是最重要也是最復(fù)雜的,它包括對底層socket字節(jié)流的讀取、http協(xié)議請求報文的解析(請求行、請求頭、請求體等信息的解析)、根據(jù)請求行解析得到路徑去尋找相應(yīng)主機上web項目的資源、根據(jù)處理的結(jié)果組裝好http協(xié)議響應(yīng)報文輸出到客戶端。

web容器,設(shè)計,JSP

任務(wù)執(zhí)行器

一個擁有最大最小線程數(shù)限制的線程池,之所以稱之為“任務(wù)執(zhí)行器”是因為線程池可以看做是啟動了若干線程不斷檢測某個任務(wù)隊列,一旦發(fā)現(xiàn)有需要執(zhí)行的任務(wù)則執(zhí)行。最大最小線程數(shù)限制、多余線程回收時間限制、超出最大線程數(shù)時線程池做出的拒絕動作等等。

web容器,設(shè)計,JSP

報文讀取

用于向操作系統(tǒng)底層讀取來自客戶端的報文并提供緩沖機制。報文復(fù)制到desBuf。

web容器,設(shè)計,JSP

報文輸出

用于向操作系統(tǒng)底層寫入由web容器處理后的報文并提供緩沖機制。將報文outputBuf通過緩沖區(qū)寫入到操作系統(tǒng)。

web容器,設(shè)計,JSP

輸入過濾器

在這個讀取的過程中希望做一些額外的處理,并且這些額外處理可能是根據(jù)不同條件做不同的處理,考慮到程序解耦與擴展,于是引入過濾器。通過一層層的過濾器完成過濾操作后才能到desBuf,這個過程就像被加入了一道道處理關(guān)卡,經(jīng)過關(guān)卡都會被執(zhí)行相應(yīng)操作,最終完成源數(shù)據(jù)到目的數(shù)據(jù)的操作。

web容器,設(shè)計,JSP

輸出過濾器

與輸入過濾器功能類似,用于在報文輸出的時候。

web容器,設(shè)計,JSP

報文解析器

提供解析http協(xié)議各個部分的能力。

web容器,設(shè)計,JSP

請求生成器

按照面向?qū)ο蟮乃枷?,把每個請求過程中與請求相關(guān)的屬性及協(xié)議字段等抽象成一個Request對象。包括請求行、請求頭、請求體三部分信息,在處理過程中需要什么值可直接從request對象中獲取。為實現(xiàn)servlet標準提供方便。


web容器,設(shè)計,JSP

響應(yīng)生成器

與請求相對應(yīng),需要一個響應(yīng)對象生成器。包括響應(yīng)行、響應(yīng)頭、響應(yīng)體三部分信息,在處理結(jié)果相關(guān)值可直接設(shè)置到response對象中。為實現(xiàn)servlet標準提供方便。

web容器,設(shè)計,JSP

地址映射器

地址映射器是請求與各個web項目、各個資源的路由器。一個請求的訪問根據(jù)路徑被映射找到響應(yīng)的資源輸出給請求客戶端。

web容器,設(shè)計,JSP

生命周期

為了進一步模塊化,整個容器擁有很多組件,這些組件可能在不同的時刻需要做不同的事件,需要一個生命周期統(tǒng)一把所有組件管理起來。例如所有組件的啟動、停止、關(guān)閉等操作都抽離由生命周期統(tǒng)一管理,就可以方便管理這些組件的生命周期。希望在某某狀態(tài)事情發(fā)生之前之后做點什么?添加一個生命周期監(jiān)聽器即可優(yōu)雅實現(xiàn)。

web容器,設(shè)計,JSP

JMX管理器

系統(tǒng)運行狀態(tài)的監(jiān)控及管理,服務(wù)器性能、服務(wù)器相關(guān)參數(shù)的收集、JVM負載、web連接數(shù)、線程池、數(shù)據(jù)庫連接池、緩存管理、配置文件重新加載等方面??商峁┮恍┻h程可視化管理,實時性高。同時也為分布式系統(tǒng)的管理提供了一個解決方案。

web容器,設(shè)計,JSP

Web載入器

WebLoader用于加載web應(yīng)用項目,一個web容器可能包含了若干個web應(yīng)用。為了達到lib及servlet的隔離,對于每個web應(yīng)用要使用不同的類加載器ClassLoader,且這些類加載器不是父子關(guān)系,以此達到class隔離效果,即一個web應(yīng)用的lib不會被其他web應(yīng)用使用。

web容器,設(shè)計,JSP

會話管理器

會話管理器主要對session進行管理,包括:①生成sessionid,一般cookies或url未帶jsessionid值則認為不存在會話,需要重新生成sessionid用作會話id。②很多客戶端的會話都保存在服務(wù)器中,對于超時的會話要定期清理以確保服務(wù)器內(nèi)存不會浪費。③對于一些重要的會話可以持久化到磁盤,需要時可重新加載到內(nèi)存中使用。

web容器,設(shè)計,JSP

運行日志

對運行時一些警告、異常、錯誤進行記錄。

web容器,設(shè)計,JSP

訪問日志

訪問日志一般會記錄客戶端的訪問相關(guān)信息,包括客戶端ip、請求時間、請求協(xié)議、請求方法、請求字節(jié)數(shù)、響應(yīng)碼、會話id、處理時間等等。訪問日志可以統(tǒng)計訪問用戶的數(shù)量、訪問時間分布等規(guī)律及個人愛好等等,這些數(shù)據(jù)可以幫助公司在運營策略上做出抉擇。

web容器,設(shè)計,JSP

安全管理器

Web項目運行在web容器平臺上,這就好比將一個應(yīng)用嵌入到一個平臺上面運行,要使嵌入的程序能正常運行,首先平臺要能安全正常運行。并且要最大程度做到平臺不受嵌入的應(yīng)用程序影響,兩者在一定程度上達到隔離的效果。啟動時通過-Djava.security.manager -Djava.security.policy==web.policy指定policy文件,此文件定義了各種權(quán)限。

web容器,設(shè)計,JSP

運行監(jiān)控&遠程管理

提供一個可以實時監(jiān)控web容器運行狀態(tài)的平臺,并且能進行遠程管理。

web容器,設(shè)計,JSP

集群

集群一般有兩種:①負載均衡集群,一般是通過一定的分發(fā)算法把訪問流量均勻分布到集群里面的各個機器上進行處理。②高可用集群,集群通信把若干機器連接起來,這種集群更偏重的是當集群中某個機器發(fā)生故障后能通過自動切換或流量轉(zhuǎn)移等措施來保證整個集群對外的可用性。
web一般請求都是無狀態(tài),可以直接做集群,但涉及session則屬于有狀態(tài),需要使用集群通信技術(shù)進行session拷貝。相關(guān)技術(shù)包括組播、單播。

web容器,設(shè)計,JSP

Servlet引擎

servlet引擎利用反射把web應(yīng)用中的servlet及jsp生成對象并放入servlet對象池中,并根據(jù)實際調(diào)用相應(yīng)的方法。web應(yīng)用將業(yè)務(wù)邏輯處理都放在dopost或doget方法中,web容器處理請求時就會按照這里定義好的處理邏輯進行處理,處理完響應(yīng)客戶端。

web容器,設(shè)計,JSP

JSP編譯器

按照規(guī)范JSP最終都是被編譯成servlet執(zhí)行,所以要按照規(guī)范對jsp文件進行編譯。JSP編譯器其實就是對jsp語法進行翻譯,根據(jù)jsp語法處理。

web容器,設(shè)計,JSP

一個web容器基本包含以上介紹的組件的功能,根據(jù)各個組件模塊進行實現(xiàn)即可搭建起一個可以讓你的web運行起來的web容器。

 感謝閱讀,希望能幫助到大家,謝謝大家對本站 的支持!

相關(guān)文章

  • 基于springBoot配置文件properties和yml中數(shù)組的寫法

    基于springBoot配置文件properties和yml中數(shù)組的寫法

    這篇文章主要介紹了springBoot配置文件properties和yml中數(shù)組的寫法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java編程將漢字轉(zhuǎn)Unicode碼代碼示例

    Java編程將漢字轉(zhuǎn)Unicode碼代碼示例

    偶然看到Unicode編碼,覺得挺有意思,于是搜索了相關(guān)資料,準備學(xué)習(xí)學(xué)習(xí),本文主要是一個Unicode編碼的簡單Java實現(xiàn),需要的朋友可以了解下。
    2017-10-10
  • Java package編譯亂碼問題解決

    Java package編譯亂碼問題解決

    這篇文章主要介紹了Java package編譯亂碼問題解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • Java接口名稱沖突問題的講解

    Java接口名稱沖突問題的講解

    今天小編就為大家分享一篇關(guān)于Java接口名稱沖突問題的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • Java實現(xiàn)按比例縮小圖片

    Java實現(xiàn)按比例縮小圖片

    這篇文章主要為大家詳細介紹了Java實現(xiàn)按比例縮小圖片,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Java設(shè)計模式之單例設(shè)計模式解析

    Java設(shè)計模式之單例設(shè)計模式解析

    這篇文章主要介紹了Java設(shè)計模式之單例設(shè)計模式解析,設(shè)計模式是在大量的實踐中總結(jié)和理論化之后優(yōu)選的代碼結(jié)構(gòu)、編程風(fēng)格、以及解決問題的思考方式,設(shè)計模式免去我們自己再思考和摸索,需要的朋友可以參考下
    2023-11-11
  • Spring boot按日切分spring boot的nohup.out日志文件的方法

    Spring boot按日切分spring boot的nohup.out日志文件的方法

    過大的日志文件維護起來存在諸多問題,所以最好是能夠按日或按大小切分日志文件,下面小編給大家?guī)砹薙pring boot按日切分spring boot的nohup.out日志文件的方法,一起看看吧
    2018-08-08
  • Java Comparable和Comparator對比詳解

    Java Comparable和Comparator對比詳解

    這篇文章主要介紹了Java Comparable和Comparator對比詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • 小程序與后端Java接口交互實現(xiàn)HelloWorld入門

    小程序與后端Java接口交互實現(xiàn)HelloWorld入門

    本文主要介紹了小程序與后端Java接口交互實現(xiàn)HelloWorld入門 ,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • Java動態(tài)代理的應(yīng)用詳解

    Java動態(tài)代理的應(yīng)用詳解

    本篇文章介紹了,Java動態(tài)代理的應(yīng)用詳解,需要的朋友參考下
    2013-05-05

最新評論