新一輪學習——Jetty官方文檔及源碼閱讀(一)

一 java servlet

1 維基百科上這樣定義:一個Java Servlet就是包含服務器功能的Java程序。儘管servlets能夠相應任何類型的請求,他們大多數一般都是實現了搭建在web服務器上的應用。只是這樣的web servlets是相似於PHP和ASP.NET這樣的動態web內容的java實現。java

2 傳統的CGI腳本有哪些缺陷:web

(1)   每一個HTTP請求都要耗費一個進程,CPU佔用率太高瀏覽器

(2)   對於併發的CGI請求,每一個請求都要將CGI腳本加載到內存中,內存佔用過大安全

(3)   只有一個單例響應同時進行的請求。這樣下降了內存使用率,管理持久化數據變得不容易服務器

3 servlet生命週期併發

init():初始化servlet實例,實現了javax.servlet.ServletConfig接口,容許servlet從web應用配置中拿到name-value的初始化參數。app

service():每次請求時調用。肯定請求類型並分發給一個合適的方法去處理。eclipse

destroy():結束服務時調用,包含在servlet生命週期中。webapp

二 Jetty

目前最新版本:jetty 9.4.8v20171121async

官方文檔:

1 開始使用Jetty

a.     jetty簡介

(1)   maven信息:

pom:

<dependency>

  <groupId>org.eclipse.jetty</groupId>

  <artifactId>jetty-project</artifactId>

  <version>${project.version}</version>

</dependency>

(2)   先普及下版本代號知識:

主要有Alpha、Beta、Milestones(M)、Release Candidates(RC)、General Availability(GA)。

介紹下RC和GA,即發佈前的候選版本和可用版本,通常RC不可用於生產環境,它可能包含一些安全漏洞或者不完整的特徵集。

GA是可用的線上版本,也分爲Release和Stable,即發佈第一版和穩定版本。發佈以後經過用戶測試,會有一些測試過程當中提出的issue須要fixed。穩定版本是在發佈第一版通過必定時間的使用和檢驗,修復漏洞後發佈的穩定版,通常建議使用此版本(存在的狀況下)。

下表是官網上的包路徑和用途,請參閱,此處不作解釋:

上表中的demo-base路徑便是jetty服務啓動和資源存放的根目錄

啓動命令爲:

>cd $JETTY_HOME/demo-base/

>java –jar $JETTY_HOME/start.jar

(此前已設置好JETTY_HOME=/path/to/$(jetty_home))

官網建議不要在$JETTY_HOME目錄下啓動。在瀏覽器中訪問http://localhost:8080便可查看到demo服務器。

新建一個jetty base用於啓動服務:

>JETTY_BASE=/tmp/mybase

>mkdir $JETTY_BASE

>cd $JETTY_BASE

>java –jar $JETTY_HOME/start.jar --create-startd

>java –jar $JETTY_HOME/start.jar --add-to-start=http,deploy

>cp $JETTY_HOME/demo-base/webapps/async-rest.war webapps/ROOT.war

>java –jar $JETTY_HOME/start.jar

(3)配置的簡介

幾種方式:POJO、啓動配置文件(用分爲ini,mod,xml三種,此處不作詳解,請查閱官網)、其餘配置文件、Jetty IoC XML配置

ini,mod,xml三者的關係以下圖:

其餘配置文件包括context xml、web.xml、Properties文件。

b.    配置簡介

配置Server

核心server配置:etc/jetty.xml

包括ThreadPool,Handlers,Server Attributes,Server fields,Connectors,Services

ThreadPool:其餘Jetty server組件使用的默認Executor Service。基礎的配置是在start.ini和start.d/server.ini中的maximum size和minimum size

Handlers:用於處理請求,在xml中會配置成樹狀,每一個節點表明一個功能點。

Server Attributes:包含了一個繼承屬性map,若是value對象實現了LifeCycle接口,它們會和server一塊兒啓動和中止。

Server fields:在http響應中傳遞屬性

Connectors:jetty支持的一些協議(好比HTTP)的鏈接器。在server裏既能夠指定鏈接器的集合也能增/刪鏈接器。

Services:比較典型的是LoginService和DataSources

配置Connectors

包括Port,Host,Idle Timeout,HTTP Configuration,SSL Context Factory

Port:經過jetty.http.port或jetty.ssl.port設置,默認http是8080,https和http2是8443

Host:不設置,則默認爲0.0.0.0。xml中配置爲jetty.host屬性。

Idle Timeout:空閒時間

HTTP Configuration: HttpConfiguration實例,包含獨立於特定無線協議且通用的HTTP配置。標準的版本中在jetty.xml中會建立一個HttpConfiguration

SSL Context Factory:定位keystore和truststore用於認證。

ServerConnector:基於NIO且使用了鏈接工廠用於處理一個或多個協議的請求。

配置Contexts

大體至關於servletContext API,用於在一個context path中組裝handlers和裝載資源文件。包含標準的jetty處理器和自定義的應用處理器。

通用的包括contextPath,virtualHost,classPath,attributes,resourceBase

重點講下classPath,一個context只能包含一個classpath,因此任何執行處理的線程包含一個線程context的classLoader。標準的web應用經過WEB-INF/lib和WEB-INF/classes目錄來初始化,另外還須要一些rules用來代理裝載parent classloader。

Web Application的發佈

能夠發佈多種格式:war,擴展war,靜態內容,包含ContextHandler實例的xml。

同目錄存在多種可發佈格式時,優先級爲:XML>WAR>Dir

(特別提醒:在Jetty9中再也不支持ContextDeployer,功能已被合併到新的WebAppProvider中來避免兩次發佈語義。

相關文章
相關標籤/搜索