最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

web 容器的設(shè)計(jì)

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

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

連接接收器

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

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

連接數(shù)控制器

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

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

套接字工廠

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

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

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

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

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

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

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

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

報(bào)文讀取

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

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

報(bào)文輸出

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

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

輸入過濾器

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

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

輸出過濾器

與輸入過濾器功能類似,用于在報(bào)文輸出的時(shí)候。

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

報(bào)文解析器

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

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

請(qǐng)求生成器

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


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

響應(yīng)生成器

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

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

地址映射器

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

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

生命周期

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

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

JMX管理器

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

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

Web載入器

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

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

會(huì)話管理器

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

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

運(yùn)行日志

對(duì)運(yùn)行時(shí)一些警告、異常、錯(cuò)誤進(jìn)行記錄。

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

訪問日志

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

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

安全管理器

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

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

運(yùn)行監(jiān)控&遠(yuǎn)程管理

提供一個(gè)可以實(shí)時(shí)監(jiān)控web容器運(yùn)行狀態(tài)的平臺(tái),并且能進(jìn)行遠(yuǎn)程管理。

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

集群

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

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

Servlet引擎

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

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

JSP編譯器

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

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

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

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

相關(guān)文章

  • SpringMvc自定義攔截器(注解)代碼實(shí)例

    SpringMvc自定義攔截器(注解)代碼實(shí)例

    這篇文章主要介紹了SpringMvc自定義攔截器(注解)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 一文帶你了解如何正確使用Java中的字符串常量池

    一文帶你了解如何正確使用Java中的字符串常量池

    研究表明,Java堆中對(duì)象占據(jù)最大比重的就是字符串對(duì)象,所以弄清楚字符串知識(shí)對(duì)學(xué)習(xí)Java很重要。本文主要重點(diǎn)聊聊字符串常量池,希望對(duì)大家有所幫助
    2022-12-12
  • 使用Thrift實(shí)現(xiàn)跨語(yǔ)言RPC的調(diào)用

    使用Thrift實(shí)現(xiàn)跨語(yǔ)言RPC的調(diào)用

    Thrift最大的優(yōu)勢(shì)就是可以實(shí)現(xiàn)跨語(yǔ)言RPC調(diào)用,尤其在一些大廠,微服務(wù)各模塊之間使用不同的語(yǔ)言是很常見的,本文就將使用java作為服務(wù)端,用python作為客戶端,實(shí)現(xiàn)不同語(yǔ)言之間的RPC調(diào)用,需要的可以參考下
    2023-10-10
  • SpringBoot項(xiàng)目中日志管理與調(diào)優(yōu)指南

    SpringBoot項(xiàng)目中日志管理與調(diào)優(yōu)指南

    在 Spring Boot 開發(fā)過程中,日志管理是開發(fā)者必須掌握的重要技能之一,合理的日志配置不僅能幫助開發(fā)者追蹤應(yīng)用程序的執(zhí)行流程、定位問題,還能提升應(yīng)用程序的可維護(hù)性,本文將詳細(xì)探討 Spring Boot 項(xiàng)目中日志管理的常見問題、解決方案以及最佳實(shí)踐
    2024-10-10
  • Java中String、StringBuffer和StringBuilder的區(qū)別

    Java中String、StringBuffer和StringBuilder的區(qū)別

    這篇文章主要介紹了Java中String、StringBuffer和StringBuilder的區(qū)別,StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字符數(shù)組保存字符串char[]value但是沒有final關(guān)鍵字修飾,所以這兩個(gè)可變,需要的朋友可以參考下
    2024-01-01
  • 關(guān)于Feign調(diào)用服務(wù)Headers傳參問題

    關(guān)于Feign調(diào)用服務(wù)Headers傳參問題

    這篇文章主要介紹了關(guān)于Feign調(diào)用服務(wù)Headers傳參問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java中操作Redis的詳細(xì)方法

    Java中操作Redis的詳細(xì)方法

    基于Jedis實(shí)現(xiàn)對(duì)redis中字符串的操作,文中通過實(shí)例代碼給大家介紹的非常詳細(xì),包括連接池JedisPool應(yīng)用的實(shí)例代碼,對(duì)Java操作Redis的相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-11-11
  • Java項(xiàng)目部署的完整流程(超詳細(xì)!)

    Java項(xiàng)目部署的完整流程(超詳細(xì)!)

    我相信很多Java新手都會(huì)遇到這樣一個(gè)問題,跟著教材敲代碼,很容易,但是讓他完整的實(shí)現(xiàn)一個(gè)應(yīng)用項(xiàng)目卻不會(huì),下面這篇文章主要給大家介紹了關(guān)于Java項(xiàng)目部署的完整流程,需要的朋友可以參考下
    2022-07-07
  • Spring MVC+MyBatis+MySQL實(shí)現(xiàn)分頁(yè)功能實(shí)例

    Spring MVC+MyBatis+MySQL實(shí)現(xiàn)分頁(yè)功能實(shí)例

    分頁(yè)功能是我們?nèi)粘i_發(fā)中經(jīng)常會(huì)遇到的,下面這篇文章主要給大家介紹了Spring MVC+MyBatis+MySQL實(shí)現(xiàn)分頁(yè)功能的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-06-06
  • 關(guān)于如何搭建CAS服務(wù)并將CAS項(xiàng)目導(dǎo)入IDEA

    關(guān)于如何搭建CAS服務(wù)并將CAS項(xiàng)目導(dǎo)入IDEA

    這篇文章主要介紹了關(guān)于如何搭建CAS服務(wù)并將CAS項(xiàng)目導(dǎo)入IDEA的問題,文中提供了詳細(xì)的圖文講解,需要的朋友可以參考下,如果有錯(cuò)誤的地方還請(qǐng)指正
    2023-03-03

最新評(píng)論

白山市| 卢龙县| 固安县| 渝北区| 宁阳县| 恩平市| 岳普湖县| 长寿区| 太白县| 孝义市| 永吉县| 新野县| 宁南县| 蕉岭县| 临潭县| 宁夏| 宜宾县| 西乡县| 金华市| 定南县| 华坪县| 曲水县| 枞阳县| 保靖县| 水城县| 绥中县| 武功县| 乌拉特前旗| 衡东县| 保亭| 彭泽县| 时尚| 莱州市| 松原市| 蓬莱市| 合川市| 南开区| 滨海县| 望谟县| 金川县| 西吉县|