undertow服务器分析
随着Java EE 7的到来以及处理诸如Web Sockets API和HTTP升级(例如EJB over HTTP)之类的高级功能的要求,WildFly开发团队已经做出了重要决定。 在长期致力于JBoss Web服务器(Apache Tomcat的一个分支)之后,新版本的应用程序服务器现在基于名为Undertow的新Web服务器。
Undertow是一种基于Java的灵活,快速的Web服务器,它基于J2SE 新输入输出(NIO) API。 Undertow是围绕基于组合的体系结构设计的,该体系结构允许您通过组合称为处理程序的小型单个组件来构建功能全面的Web服务器。 这些处理程序链接在一起以形成功能齐全的Java EE servlet 3.1容器或嵌入在代码中的更简单的HTTP Process处理程序。
从下图中可以看到,一个处理程序链由几个单独的处理程序组成,这些处理程序最终会产生Servlet响应或错误,例如在找不到请求的Path的情况下:
Undertow Web服务器还可以灵活地在非阻塞异步处理程序之间进行选择,以处理任务,或将请求委托给由线程池支持的阻塞处理程序。
现在,我们将了解Web服务器的配置,因此只需打开您的配置文件(任何独立的配置文件或domain.xml ),然后移动到默认情况下如下所示的“ undertow ”子系统即可:
<subsystem xmlns="urn:jboss:domain:undertow:1.0"><buffer-caches><buffer-cache name="default" buffer-size="1024" buffers-per-region="1024" max-regions="10" /></buffer-caches><server name="default-server"><http-listener name="default" max-post-size="10485760" socket-binding="http" /><host name="default-host" alias="localhost"><location name="/" handler="welcome-content" /></host></server><servlet-container name="default" default-buffer-cache="default" stack-trace-on-error="local-only"><jsp-config /><persistent-sessions path="persistent-web-sessions" relative-to="jboss.server.data.dir" /></servlet-container><handlers><file name="welcome-content" path="${jboss.home.dir}/welcome-content" directory-listing="true" /></handlers>
</subsystem>
Undertow配置的关键要素之一是缓冲区缓存 。 缓冲区本质上是一个内存块,您可以在其中写入数据,然后可以在以后再次读取。 该内存块包装在NIO Buffer对象中,该对象提供了一组方法,可以更轻松地使用该内存块。 使用缓冲区的明显优势是内存访问比物理访问快得多。
除了Java NIO外,WildFly还大量使用XNIO( http://www.jboss.org/xnio ),它是一个低级I / O层,可在任何地方使用以简化NIO API的使用。 它解决了使用选择器的一些复杂性,以及对多播套接字和非套接字I / O(例如串行端口)缺乏NIO支持,同时仍保留了NIO中提供的所有功能。
为了管理Undertow Web服务器,请从管理控制台中选择Profile选项卡,然后移至Web面板。 其中包含一组标签,例如:
- Web服务 :用于指定一些核心Web服务设置,例如WSDL主机和端口
- Servlets :用于指定是否使用开发模式(默认为false),该模式允许即时重新加载JSP。
- HTTP :用于配置Undertow HTTP连接器。 例如,您将从此处将Web服务器与IO资源池相关联
- Undertow Core :用于将处理程序和过滤器与HTTP连接关联。
配置Web服务器池
如果您来自JBoss AS 7环境,则这是您配置的一部分,将进行更改。 在应用程序服务器的早期版本中,您曾经引用线程执行器来调整Web服务器的线程池。 另一方面,对于WildFly 8,您需要引用一个需要在IO子系统中创建的Worker元素。 让我们来看看如何做。 从左树菜单中展开“ 核心”选项,然后选择“ IO ”,如下图所示:
需要从主面板中选择“ Worker ”面板。 如您所见,“默认”工作程序已经存在。 您可以随时单击相应的按钮来创建或删除新的。 但是,现在我们将单击“ 编辑 ”链接,以便我们自定义默认工作线程中要使用的线程数。 单击链接后,我们将编辑以下属性:
第一个参数, 堆栈大小对应于Web服务器线程堆栈大小。 使用更大的线程堆栈大小,Web服务器将消耗更多资源,因此可以支持更少的用户。 任务keepalive (默认值为60)控制等待来自同一连接上的同一客户端的下一个请求的秒数。 使用Keep-Alives,浏览器可以在第一个请求之后消除每个请求的完整往返,通常将整个页面的加载时间减少了一半。
Io线程数与可用的Web服务器线程数相对应。 这是一个重要的调整参数,对于流量较高的Web应用程序,需要增加此参数。 任务最大线程数可以控制并发请求的最大数量。 如果您对IO Worker的配置满意,请单击“ 保存” 。
现在我们已经定义了Worker,我们将需要从Web服务器端引用它。 为此,从左侧的树菜单中展开Web子系统,然后选择HTTP选项。 在那里,您将能够配置一些HTTP服务器特有的属性:
单击表中包含的“ 默认 ”元素,并检查Worker元素是否与您的IO Worker关联。 工作人员也需要启用才能使用。 接下来,我们需要将HTTP侦听器与套接字绑定相关联(请从“常规配置”左侧菜单中选择“套接字绑定”选项,以检查您的配置可用的套接字绑定)。 最后,HTTP服务器也绑定到Java NIO 缓冲池实现,这将在下一节中讨论。
完成HTTP的工作程序配置后,Web服务器将使用其工作程序线程,这些线程根据以下条件命名: [工作程序名称]-[工作程序ID]。 从下图中可以看到,用户定义了一个名为“ custom ”的工作程序,该工作程序已通过JConsole实用程序的Threads部分进行监视(作为JDK标准版的一部分包含在内):
配置Web服务器缓冲池
正如我们所说,Undertow基于Java NIO API,并利用了J2SE的池
需要缓冲时,请使用java.nio.ByteBuffer 。
缓冲区是一个对象,其中包含一些要写入或刚刚读取的数据。 在NIO中添加Buffer对象标志着新库和原始I / O之间最显着的差异之一。 在面向流的I / O中,您曾经将数据直接写入Stream对象 ,或直接从Stream对象读取数据。 在NIO库中,所有数据都由Buffers处理。 读取数据时,会将其直接读取到缓冲区中。 写入数据时,会将其写入缓冲区。 每当您在NIO中访问数据时,您就将其拉出缓冲区。
可以通过选择“ 核心” |“底层”来配置Undertow IO缓冲池。 IO左侧菜单,以及“ 缓冲池”选项,如下图所示:
单击“ 默认 ”缓冲池行,您将可以在其中配置以下元素:
每片缓冲区 | 此参数定义每个分片分配多少缓冲区。 切片用于处理大缓冲区的子部分,从而避免了处理整个缓冲区的开销。
|
直接缓冲区 | 通过此选项,您可以选择是否将缓冲区设置为直接缓冲区。 直接缓冲区的特征是它们是在Java堆之外分配的。 因此,一旦分配,它们的内存地址在缓冲区的生命周期内是固定的。 拥有固定的内存地址会导致内核可以安全地直接访问它们,因此,可以在I / O操作中更有效地使用直接缓冲区 |
缓冲区大小 | 此选项使您可以定义java.nio.ByteBuffer的大小。 假设正在使用直接缓冲区,则如果需要最高性能,则默认的16kb缓冲区是最佳的(因为这对应于Linux上的默认套接字缓冲区大小)。 |
此摘录摘自“ Wildfly 8 Book ”,这是一本实用且易于理解的指南,讨论了最流行的开源Java应用程序服务器: JBoss Wildfily (从JBoss AS重命名)。 本书涵盖了这个新的令人兴奋的应用服务器版本的管理和管理方面的所有细节。 该书专门针对应用服务器的管理工具,为您介绍了所有最新的体系结构和性能更改。 您将从基本的服务器配置过渡到更高级的群集,JDBC连接,日志记录等技术。
翻译自: https://www.javacodegeeks.com/2014/01/entering-undertow-web-server.html
undertow服务器分析