Jetty 的基本架构
下图是 Jetty 的基本架构图,整个 Jetty 的核心组件由 Server 和 Connector 两个组件构成,整个 Server 组件是基于 Handler 容器工作的,它类似与 Tomcat 的 Container 容器,Jetty 与 Tomcat 的比较在后面详细介绍。Jetty 中另外一个比不可少的组件是 Connector,它负责接受客户端的连接请求,并将请求分配给一个处理队列去执行。
图 1. Jetty 的基本架构
Jetty 中还有一些可有可无的组件,我们可以在它上做扩展。如 JMX,我们可以定义一些 Mbean 把它加到 Server 中,当 Server 启动的时候,这些 Bean 就会一起工作。
Jetty安装
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>7.6.11.v20130520</version>
</dependency>
创建Jetty 服务:
public static void main(String[] args) throws Exception {
Server server = new Server(8080);
server.start();
server.join();
}
Server 是Jetty的核心类,运行此类就可以启动Jetty服务,访问服务地址:http://localhost:8080/
虽然服务正常启动,但是在服务中没有加入任何Handle,所以访问的时候会返回404 error.
创建Handler:
public class HelloHandler extends AbstractHandler {
public void handle(String target, Request baseRequest,
HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
response.setContentType("text/html;charset=utf-8");
response.setStatus(HttpServletResponse.SC_OK);
baseRequest.setHandled(true);
response.getWriter().println("<h1>Hello World</h1>");
}
}
Jetty是面向Handler架构的,就像Spring面向bean架构,Ibatis面向statement架构一样。
将自定义的HelloHandler加入到Server中如下:
public static void main(String[] args) throws Exception {
Server server = new Server(8080);
server.setHandler(new HelloHandler());
server.start();
server.join();
}
重新执行此类,访问服务地址:http://localhost:8080/,访问效果如下:
当我们在浏览器里敲入 http://localhost:8080 时的请求将会代理到 Server 类的 handle 方法,Server 的 handle 的方法将请求代理给 ContextHandler 的 handle 方法,ContextHandler 又调用 HelloHandler 的 handle 方法。这个调用方式是不是和 Servlet 的工作方式类似,在启动之前初始化,然后创建对象后调用 Servlet 的 service 方法。
配置Connectors:
让Jetty基于NIO的方式工作,实现类为:org.eclipse.jetty.server.nio.SelectChannelConnector,Jetty 在启动时将会创建 NIO 的工作环境,它会创建 HttpConnection 类用来解析和封装 HTTP1.1 的协议,ConnectorEndPoint 类是以 NIO 的处理方式处理连接请求 ,请求线程池为org.eclipse.jetty.util.thread.QueuedThreadPool
public static void main(String[] args) throws Exception {
Server server = new Server(8080);
QueuedThreadPool threadPool = new QueuedThreadPool();
threadPool.setMinThreads(10);
threadPool.setMaxThreads(500);
server.setThreadPool(threadPool);
SelectChannelConnector connector = new SelectChannelConnector();
connector.setPort(8080);
//每个请求被accept前允许等待的连接数
connector.setAcceptQueueSize(50);
//同事监听read事件的线程数
connector.setAcceptors(2);
//连接最大空闲时间,默认是200000,-1表示一直连接
connector.setMaxIdleTime(3000);
server.addConnector(connector);
server.setHandler(new HelloHandler());
server.start();
server.join();
}
创建一个 Selector 相当于一个观察者,打开一个 Server 端通道,把这个 server 通道注册到观察者上并且指定监听的事件。然后遍历这个观察者观察到事件,取出感兴趣的事件再处理。这里有个最核心的地方就是,我们不需要为每个被观察者创建一个线程来监控它随时发生的事件。而是把这些被观察者都注册一个地方统一管理,然后由它把触发的事件统一发送给感兴趣的程序模块。这里的核心是能够统一的管理每个被观察者的事件,所以我们就可以把服务端上每个建立的连接传送和接受数据作为一个事件统一管理,这样就不必要每个连接需要一个线程来维护了。
这里需要注意的地方时,很多人认为监听 SelectionKey.OP_ACCEPT 事件就已经是非阻塞方式了,其实 Jetty 仍然是用一个线程来监听客户端的连接请求,当接受到请求后,把这个请求再注册到 Selector 上,然后才是非阻塞方式执行。这个地方还有一个容易引起误解的地方是:认为 Jetty 以 NIO 方式工作只会有一个线程来处理所有的请求,甚至会认为不同用户会在服务端共享一个线程从而会导致基于 ThreadLocal 的程序会出现问题,其实从 Jetty 的源码中能够发现,真正共享一个线程的处理只是在监听不同连接的数据传送事件上,比如有多个连接已经建立,传统方式是当没有数据传输时,线程是阻塞的也就是一直在等待下一个数据的到来,而 NIO 的处理方式是只有一个线程在等待所有连接的数据的到来,而当某个连接数据到来时 Jetty 会把它分配给这个连接对应的处理线程去处理,所以不同连接的处理线程仍然是独立的。
配置Web Application Context:
Web Applications context是一个变异的ServletContextHandler,它配全web.xml用来配置Servlet、Filter和其他特性。
public static void main(String[] args) throws Exception {
String rootDir = "./webapp";
String contextPath = "/";
System.setProperty("file.encoding", "utf-8");
Server server = new Server();
QueuedThreadPool threadPool = new QueuedThreadPool();
threadPool.setMinThreads(10);
threadPool.setMaxThreads(500);
server.setThreadPool(threadPool);
SelectChannelConnector connector = new SelectChannelConnector();
connector.setPort(8080);
// 每个请求被accept前允许等待的连接数
connector.setAcceptQueueSize(50);
// 同事监听read事件的线程数
connector.setAcceptors(2);
// 连接最大空闲时间,默认是200000,-1表示一直连接
connector.setMaxIdleTime(3000);
server.addConnector(connector);
WebAppContext context = new WebAppContext(rootDir, contextPath);
context.setOverrideDescriptors(Arrays.asList(new String[] { Jetty.class.getResource("/") + "web_override.xml" }));
context.setParentLoaderPriority(true);
server.setHandler(context);
server.start();
server.join();
}
- 大小: 22.9 KB
- 大小: 40.7 KB
分享到:
相关推荐
java jetty嵌入式服务器实例大全,包括文件资源、servlet、xml配置服务器、war包、多端口监听等实例。
NULL 博文链接:https://seraph115.iteye.com/blog/436300
jetty是什么 jetty配置 jetty使用 jetty嵌入 jetty启动 jetty部署 jetty教程 jetty嵌入式 jetty
系统启动时自动从数据库中读取框架配置信息,job信息,调度信息注入到框架中。 本系统内嵌了jetty作为框架的web接口为本框架提供了动态控制功能。 接口以http+json形式提供服务。通过该接口可完成以下功能 1.立即...
从某种程度上,你也可以把 Jetty 理解为一个嵌入式的Web服务器。 Jetty 可以作为嵌入式服务器使用,Jetty的运行速度较快,而且是轻量级的,可以在Java中可以从test case中控制其运行。从而可以使自动化测试不再依赖...
使用Java SE的Websocket的示例与其使用Java EE及其附带的所有功能,不如使用Java EE,而不是WebSocket的一种较小的实现方式,可能是针对独立程序或嵌入式应用程序的。 该示例将显示使码头服务器运行,为websocket...
用于 switchblade-core 的自动配置库,提供嵌入式 Jetty 实例。 mvn install 创建一个项目,导入依赖。 确保它是在 Java 8 中使用“-parameters”编译器标志编译的。 创建一个应用程序,启动它。 将类包含在与...
配置jetty6的嵌入式https必须的jar包 本人在网上找了好几天,历尽千辛万苦终于找到这个包,包里有org.mortbay.jetty.security.SslSelectChannelConnector类 这正是我需要的。包很小,里面就几个文件,但解决了我大...
此示例可用于快速简便的嵌入式容器配置(因此后缀ecc )。 嵌入式Tomcat 此示例显示如何使用 Tomcat 构建和打包可运行的 jar。 mvn clean package -P tomcat 嵌入式码头 这个例子展示了如何使用 Jetty 构建和...
同时也可以修改默认值来满足特定的需求提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等SpringBoot不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式# ...
这个项目使用 Spring 4 MVC 和 gradle 2 作为构建和依赖管理代理设置了一个快速而肮脏的嵌入式 Jetty 服务器。 它提供: 几个 RESTful 测试端点来测试 MVC 功能 提供静态 HTML 页面和简单的 JavaScript 文件来测试...
#Jersey-2,Guice,Embedded Jetty Maven项目演示了如何使用带有Guice注入的Jersey-2和通过MOXy进行JSON绑定,在具有基于Servlet-3.1注释的配置的Embedded Jetty-9中运行JAX-RS 2项目。 ##执行这个专案的步骤叉,...
Servlet 1,声明servlet及映射 2,加上@...目前使用Spring的,更多是在web方面,所以Spring更多的是依赖Servlet容器,哪怕是springboot擅长做独立可执行的微服务应用程序,其内部也包含一个嵌入式Jetty。
Spring MVC嵌入式码头示例 使用嵌入式Jetty 9服务器的基本Spring MVC 4应用程序。 无xml配置。 包括API REST服务,Freemarker和JSP示例。 与Mongo DB集成。 要求
Spark 2.6.0引入了提供可配置的嵌入式Jetty服务器的选项。 本教程说明如何使用此功能来配置支持使用log4j记录传入请求的服务器。 初始设置 我们将从Spark的基本hello world实例开始 public class ApplicationMain { ...
#Jersey-2,MOXy,JPA-2,Embedded Jetty Maven项目演示如何使用Jersey-2和具有通过MOXy的JSON绑定的Jersey-2,在具有基于Servlet-3.1批注的配置的嵌入式Jetty-9中运行JAX-RS 2项目。 -2持久性。 响应以Collection ...
它是使用Jetty嵌入式Web服务器和Milton WebDAV库以Java编写的。 所有文件内容和元数据都存储在MongoDB内部。 文件内容使用的技术与GridFS非常相似,但是文件(和文件夹)元数据,也可以在其中对其进行版本控制。 ...
喷气背包 jet.pack:将您的JRuby Webapp打包为Jetty。 已经存在许多工具,可帮助开发人员在,, 和等流行的... 简而言之,Jetpack在您的ruby项目周围创建了一个独立的JRuby / Jetty / vendored-gem世界,您只需要
jetty-http-server-wrapper.zip,jetty http服务器的包装器,使公共配置更简单。使用guice过滤器设置嵌入式jetty服务器的方便包装器
该应用程序在JAR文件中带有一个嵌入式配置文件application.properties。 要替换此配置,应将新配置放置在主目录的“ config”子目录中 构建应用程序 可以使用标准Gradle命令在IDE外部构建应用程序 gradlew构建 生成...