摘錄網(wǎng)上一些Jetty相關(guān)的介紹便于快速了解Jetty。
Jetty 目前的是一個(gè)比較被看好的 Servlet 引擎荣赶,它的架構(gòu)比較簡(jiǎn)單慢逾,也是一個(gè)可擴(kuò)展性和非常靈活的應(yīng)用服務(wù)器,它有一個(gè)基本數(shù)據(jù)模型,這個(gè)數(shù)據(jù)模型就是 Handler,所有可以被擴(kuò)展的組件都可以作為一個(gè) Handler鹦聪,添加到 Server 中,Jetty 就是幫你管理這些 Handler。
Jetty 作為一個(gè)獨(dú)立的 Servlet 引擎可以獨(dú)立提供 Web 服務(wù)翠订,但是它也可以與其他 Web 應(yīng)用服務(wù)器集成,所以它可以提供基于兩種協(xié)議工作,一個(gè)是 HTTP嗤练,一個(gè)是 AJP 協(xié)議战坤。
如果將 Jetty 集成到 Jboss 或者 Apache,那么就可以讓 Jetty 基于 AJP 模式工作
Jetty 創(chuàng)建接受連接環(huán)境需要三個(gè)步驟:
創(chuàng)建一個(gè)隊(duì)列線程池玉掸,用于處理每個(gè)建立連接產(chǎn)生的任務(wù)脱吱,這個(gè)線程池可以由用戶來指定,這個(gè)和 Tomcat 是類似的憔足。
創(chuàng)建 ServerSocket郎哭,用于準(zhǔn)備接受客戶端的 socket 請(qǐng)求,以及客戶端用來包裝這個(gè) socket 的一些輔助類关筒。
創(chuàng)建一個(gè)或多個(gè)監(jiān)聽線程,用來監(jiān)聽訪問端口是否有連接進(jìn)來才写。
相比 Tomcat 創(chuàng)建建立連接的環(huán)境,Jetty 的邏輯更加簡(jiǎn)單,牽涉到的類更少嗤朴,執(zhí)行的代碼量也更少了瘾境。Jetty 的入口是 Server 類,Server 類啟動(dòng)完成了圣絮,就代表 Jetty 能為你提供服務(wù)了。它到底能提供哪些服務(wù)末盔,就要看 Server 類啟動(dòng)時(shí)都調(diào)用了哪些組件的 start 方法。
基于 AJP 工作
通常一個(gè) web 服務(wù)站點(diǎn)的后端服務(wù)器不是將 Java 的應(yīng)用服務(wù)器直接暴露給服務(wù)訪問者欣范,而是在應(yīng)用服務(wù)器颓鲜,如 Jboss 的前面在加一個(gè) web 服務(wù)器艾扮,如 Apache 或者 nginx,我想這個(gè)原因大家應(yīng)該很容易理解雕欺,如做日志分析撞蜂、負(fù)載均衡颁湖、權(quán)限控制吴侦、防止惡意請(qǐng)求以及靜態(tài)資源預(yù)加載等等听怕。
這種架構(gòu)下 servlet 引擎就不需要解析和封裝返回的 HTTP 協(xié)議很魂,因?yàn)?HTTP 協(xié)議的解析工作已經(jīng)在 Apache 或 Nginx 服務(wù)器上完成了帝蒿,Jboss 只要基于更加簡(jiǎn)單的 AJP 協(xié)議工作就行了胖替,這樣能加快請(qǐng)求的響應(yīng)速度敬拓。
在正常的企業(yè)級(jí)應(yīng)用中,Jetty 作為一個(gè) Servlet 引擎都是基于 AJP 協(xié)議工作的客年。
https://www.ibm.com/developerworks/cn/java/j-lo-jetty/
更多的介紹集成可以自己網(wǎng)上搜索。
與Tomcat的比較
Jetty更輕量級(jí)比藻。這是相對(duì)Tomcat而言的轩拨。?
單純比較 Tomcat 與 Jetty 的性能意義不是很大庶香,只能說在某種使用場(chǎng)景下赶掖,它表現(xiàn)的各有差異。因?yàn)樗鼈兠嫦虻氖褂脠?chǎng)景不盡相同。從架構(gòu)上來看 Tomcat 在處理少數(shù)非常繁忙的連接上更有優(yōu)勢(shì)牺堰,也就是說連接的生命周期如果短的話斧抱,Tomcat 的總體性能更高宪郊。
而 Jetty 剛好相反忙灼,Jetty 可以同時(shí)處理大量連接而且可以長(zhǎng)時(shí)間保持這些連接爬范。例如像一些 web 聊天應(yīng)用非常適合用 Jetty 做服務(wù)器父腕,像淘寶的 web 旺旺就是用 Jetty 作為 Servlet 引擎。
另外由于 Jetty 的架構(gòu)非常簡(jiǎn)單青瀑,作為服務(wù)器它可以按需加載組件璧亮,這樣不需要的組件可以去掉,這樣無形可以減少服務(wù)器本身的內(nèi)存開銷斥难,處理一次請(qǐng)求也是可以減少產(chǎn)生的臨時(shí)對(duì)象枝嘶,這樣性能也會(huì)提高。另外 Jetty 默認(rèn)使用的是 NIO 技術(shù)在處理 I/O 請(qǐng)求上更占優(yōu)勢(shì)哑诊,Tomcat 默認(rèn)使用的是 BIO群扶,在處理靜態(tài)資源時(shí),Tomcat 的性能不如 Jetty。
作為一個(gè)標(biāo)準(zhǔn)的 Servlet 引擎竞阐,它們都支持標(biāo)準(zhǔn)的 Servlet 規(guī)范缴饭,還有 Java EE 的規(guī)范也都支持,由于 Tomcat 的使用的更加廣泛骆莹,它對(duì)這些支持的更加全面一些颗搂,有很多特性 Tomcat 都直接集成進(jìn)來了。但是 Jetty 的應(yīng)變更加快速幕垦。
Jetty更滿足公有云的分布式環(huán)境的需求丢氢,而Tomcat更符合企業(yè)級(jí)環(huán)境。
Google 應(yīng)用系統(tǒng)引擎最初是以 Apache Tomcat 作為其 webserver/servlet 容器的先改,但最終將切換到 Jetty 上疚察。Google選擇Jetty的關(guān)鍵原因是它的體積和靈活性。 在云計(jì)算里盏道,體積的因素是很重要稍浆,如果你運(yùn)行幾萬個(gè)Jetty的實(shí)例(Google就是這樣干的)载碌,每個(gè)server省1兆猜嘱,那就會(huì)省10幾個(gè)G的內(nèi)存(或能夠給其他應(yīng)用提供更多的內(nèi)存)。
Jetty 被設(shè)計(jì)成了可插拔和可擴(kuò)展的特性嫁艇,這樣Google就可以高度的自定義它朗伶。 他們?cè)谄渲刑鎿Q了他們自己的HTTP connector,Google認(rèn)證步咪,以及他們自己的session集群论皆。也真是奇怪,這個(gè)特性對(duì)于云計(jì)算來說是非常出色的猾漫,但同時(shí)也讓Jetty非常適合嵌入小的設(shè)備中点晴,例如手機(jī)和機(jī)頂盒。
相同點(diǎn):
Tomcat和Jetty都是一種Servlet引擎悯周,他們都支持標(biāo)準(zhǔn)的servlet規(guī)范和JavaEE的規(guī)范粒督。
不同點(diǎn):
架構(gòu)比較
Jetty的架構(gòu)比Tomcat的更為簡(jiǎn)單
Jetty的架構(gòu)是基于Handler來實(shí)現(xiàn)的,主要的擴(kuò)展功能都可以用Handler來實(shí)現(xiàn)禽翼,擴(kuò)展簡(jiǎn)單屠橄。
Tomcat的架構(gòu)是基于容器設(shè)計(jì)的,進(jìn)行擴(kuò)展是需要了解Tomcat的整體設(shè)計(jì)結(jié)構(gòu)闰挡,不易擴(kuò)展锐墙。
性能比較
Jetty和Tomcat性能方面差異不大
Jetty可以同時(shí)處理大量連接而且可以長(zhǎng)時(shí)間保持連接,適合于web聊天應(yīng)用等等长酗。
Jetty的架構(gòu)簡(jiǎn)單溪北,因此作為服務(wù)器,Jetty可以按需加載組件,減少不需要的組件刻盐,減少了服務(wù)器內(nèi)存開銷掏膏,從而提高服務(wù)器性能。
Jetty默認(rèn)采用NIO結(jié)束在處理I/O請(qǐng)求上更占優(yōu)勢(shì)敦锌,在處理靜態(tài)資源時(shí)馒疹,性能較高
少數(shù)非常繁忙;Tomcat適合處理少數(shù)非常繁忙的鏈接,也就是說鏈接生命周期短的話乙墙,Tomcat的總體性能更高颖变。
Tomcat默認(rèn)采用BIO處理I/O請(qǐng)求,在處理靜態(tài)資源時(shí)听想,性能較差腥刹。
其它比較
Jetty的應(yīng)用更加快速,修改簡(jiǎn)單汉买,對(duì)新的Servlet規(guī)范的支持較好衔峰。
Tomcat目前應(yīng)用比較廣泛,對(duì)JavaEE和Servlet的支持更加全面蛙粘,很多特性會(huì)直接集成進(jìn)來垫卤。
Springboot默認(rèn)集成的是Tomcat ,如果想換成Jetty容器出牧,首先則需要把默認(rèn)的Tomcat容器去除穴肘,然后引入Jetty依賴:
修改pom.xml
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jetty</artifactId></dependency>
保存更新后發(fā)現(xiàn)下載很慢,于是中斷下載舔痕,準(zhǔn)備切換下載源使用阿里的maven鏡像评抚。
先查看build?path中?libraries下面maven依賴管理下載的文件存放位置,發(fā)現(xiàn)很多jetty相關(guān)文件未下載成功伯复。
先找到maven的本地setting.xml
在Maven中提供了一個(gè)settings.xml文件來定義Maven的全局環(huán)境信息慨代。這個(gè)文件會(huì)存在于Maven的安裝目錄的conf子目錄下面,或者是用戶家目錄的.m2子目錄下面啸如。我們可以通過這個(gè)文件來定義本地倉(cāng)庫(kù)侍匙、遠(yuǎn)程倉(cāng)庫(kù)和聯(lián)網(wǎng)使用的代理信息等。
其實(shí)相對(duì)于多用戶的PC機(jī)而言组底,在Maven安裝目錄的conf子目錄下面的settings.xml才是真正的全局的配置康嘉。而用戶家目錄的.m2子目錄下面的settings.xml的配置只是針對(duì)當(dāng)前用戶的淀弹。當(dāng)這兩個(gè)文件同時(shí)存在的時(shí)候删性,那么對(duì)于相同的配置信息用戶家目錄下面的settings.xml中定義的會(huì)覆蓋Maven安裝目錄下面的settings.xml中的定義庸论。用戶家目錄下的settings.xml文件一般是不存在的,但是Maven允許我們?cè)谶@里定義我們自己的settings.xml厌均,如果需要在這里定義我們自己的settings.xml的時(shí)候就可以把Maven安裝目錄下面的settings.xml文件拷貝到用戶家目錄的.m2目錄下唬滑,然后改成自己想要的樣子。
settings文件內(nèi)容
<?xml version="1.0" encoding="UTF-8"?><settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"? ? ? ? ? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"? ? ? ? ? xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"><mirrors><!--阿里云倉(cāng)庫(kù) --><mirror><id>alimaven</id><mirrorOf>central</mirrorOf><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/repositories/central/</url></mirror><!--中央倉(cāng)庫(kù)1 --><mirror><id>repo1</id><mirrorOf>central</mirrorOf><name>Human Readable Name for this Mirror.</name><url>http://repo1.maven.org/maven2/</url></mirror><!-- 中央倉(cāng)庫(kù)2 --><mirror><id>repo2</id><mirrorOf>central</mirrorOf><name>Human Readable Name for this Mirror.</name><url>http://repo2.maven.org/maven2/</url></mirror></mirrors></settings>
保存update?maven
啟動(dòng)程序之后卻出現(xiàn)錯(cuò)誤提示。?Unable to start embedded container; nested exception is java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory
此處踩坑花了不少時(shí)間去找原因:為什么jetty會(huì)引用tomcat里的jar包晶密。
多方查找原因是缺少了jar包擒悬,jetty9.0之后開始依賴了tomcat-juli ,我用的jetty版本時(shí)9.4.6 稻艰。網(wǎng)上搜索?tomcat-juli?maven
http://mvnrepository.com/artifact/org.apache.tomcat/tomcat-juli/8.5.20
只需要在pom中加入下列依賴即可懂牧。
<dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-juli</artifactId><version>8.5.20</version></dependency>
?用maven?console可以查看?maven?下載日志,以防下載失敗尊勿。
重新啟動(dòng)程序僧凤,ok