新一轮学习——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中来避免两次发布语义。
转载于:https://my.oschina.net/u/216330/blog/1626419