新一轮学习——Jetty官方文档及源码阅读(一)

一 java servlet

1 维基百科上这样定义:一个Java Servlet就是包含服务器功能的Java程序。尽管servlets可以相应任何类型的请求,他们大多数通常都是实现了搭建在web服务器上的应用。只是这样的web servlets是类似于PHP和ASP.NET这样的动态web内容的java实现。

2 传统的CGI脚本有哪些缺陷:

(1)   每个HTTP请求都要耗费一个进程,CPU占用率过高

(2)   对于并发的CGI请求,每个请求都要将CGI脚本加载到内存中,内存占用过大

(3)   只有一个单例响应同时进行的请求。这样降低了内存使用率,管理持久化数据变得不容易

3 servlet生命周期

init():初始化servlet实例,实现了javax.servlet.ServletConfig接口,允许servlet从web应用配置中拿到name-value的初始化参数。

service():每次请求时调用。确定请求类型并分发给一个合适的方法去处理。

destroy():结束服务时调用,包含在servlet生命周期中。

二 Jetty

目前最新版本:jetty 9.4.8v20171121

官方文档:

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中来避免两次发布语义。

猜你喜欢

转载自my.oschina.net/u/216330/blog/1626419