JBoss 系列九十三: 高性能非阻塞 Web 服务器 Undertow
来源:互联网 发布:福田网络布线 编辑:程序博客网 时间:2024/06/07 00:47
概述
WildFly 8 包含了一个全新的Web服务器(Undertow),WildFly 8 默认的Web服务器为Undertow。一句话概括什么是Undertow - 高性能非阻塞 Web 服务器。Undertow 主要有以下几个特点:
- 轻量化 - Undertow 是一个Web 服务器,但它不像传统的Web 服务器有容器的概念,它由两个核心jar包组成,使用API加载一个Web应用可以使用小于10MB的内存
- HTTP Upgrade 支持 - 设计WildFly时一个重要的考虑因素是在云环境中减少端口数量的需求。在云环境中,一个系统可能运行了几百个甚至几千个WildFly实例。基于HTTP使用HTTP Upgrade可以升级成多种协议,Undertow提供了复用这些协议的能力。
- Web Socket 支持 - 对Web Socket的完全支持,用以满足Web应用现在面对巨大数量的客户端,以及对JSR-356规范的支持
- Servlet 3.1 的支持 - Undertow支持Servlet 3.1,提供了一个机会来构建一个超越Servlet规范、对开发人员非常友好的系统。
- 可嵌套性 - Web 服务器不在需要容器,我们只需要通过API在J2SE代码下快速搭建Web服务
相关链接及快速开始示例
Undertow 社区主页(http://undertow.io/):包括Undertow相关的所有新闻,消息。
Undertow 源代码(https://github.com/undertow-io/):包括所有Undertow相关的代码
Undertow 快速开始示例(https://github.com/kylinsoong/wildfly-architecture/tree/master/undertow/quickstart):包括Undertow 快速开始示例,本示例演示了如何使用Undertow,将Undertow整合到自己的应用中。Undertow编程使用的第一步是添加如下依赖到应用:
<dependency><groupId>io.undertow</groupId><artifactId>undertow-core</artifactId><version>1.0.0.Final</version></dependency><dependency><groupId>io.undertow</groupId><artifactId>undertow-servlet</artifactId><version>1.0.0.Final</version></dependency>
使用软件资料安装和下载章节中所描述方法使用Git下载quickstart应用。下载完成后使用如下命令编译
mvn clean install dependency:copy-dependencies
编译完成或生成undertow-quickstart.jar包位于target目录下,运行时所有依赖包位于target/dependency目录下。
Undertow Hello World 示例
Undertow是一个高性能非阻塞 Web 服务器,接下来我们演示如何创建一个Web 服务器,如下为HelloWorldServer类代码明细:
public class HelloWorldServer {public static void main(String[] args) {Undertow server = Undertow.builder().addHttpListener(8080, "localhost").setHandler(new HttpHandler(){public void handleRequest(HttpServerExchange exchange)throws Exception {exchange.getRequestHeaders().put(Headers.CONTENT_TYPE, "text/plain");exchange.getResponseSender().send("Hello World");}}).build();server.start();}}
通过如下方法可以运行HelloWorldServer:
java -cp target/dependency/*:target/undertow-quickstart.jar org.wildfly.undertow.quickstart.HelloWorldServer
运行后打开浏览器输入http://localhost:8080,则页面输出“Hello World”字符串。如上面,我们演示Undertow Web 服务器使用异步IO的方式向界面输出字符串。
Undertow 部署Servlet示例
Web 服务器主要是部署运行Web应用,接下来我们演示如何在Undertow 中通过API部署两个Servlet(MyServlet,MessageServlet),然后分别访问这两个Servlet。两个Servlet代码明细分别如下:
MessageServlet 类代码
public class MessageServlet extends HttpServlet {private static final long serialVersionUID = 6861632231065498153L; private static final String message = "This is MessageServlet"; protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {PrintWriter writer = resp.getWriter(); writer.write(message); writer.close();} }
MyServlet 类代码
public class MyServlet extends HttpServlet {private static final long serialVersionUID = 2378494112650465478L;private static final String message = "This is MyServlet";protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {PrintWriter writer = resp.getWriter(); writer.write(message); writer.close();}}
接下来我们使用Undertow提供的API,启动Web服务器,部署这两个Servlet,相关的ServletServer类代码如下:
public class ServletServer {public static final String MYAPP = "/myapp";public static void main(String[] args) throws ServletException {DeploymentInfo servletBuilder = Servlets.deployment().setClassLoader(ServletServer.class.getClassLoader()) .setContextPath(MYAPP) .setDeploymentName("myapp.war") .addServlets(Servlets.servlet("MessageServlet", MessageServlet.class).addMappings("/messageServlet") , Servlets.servlet("MyServlet", MyServlet.class).addMappings("/myServlet"));DeploymentManager manager = Servlets.defaultContainer().addDeployment(servletBuilder);manager.deploy();HttpHandler servletHandler = manager.start();PathHandler path = Handlers.path(Handlers.redirect(MYAPP)).addPrefixPath(MYAPP, servletHandler);Undertow server = Undertow.builder().addHttpListener(8080, "localhost").setHandler(path).build();server.start();}}
通过如下方法可以运行ServletServer,运行成功后访问http://localhost:8080/myapp/messageServlet,页面显示字符串“This is MessageServlet”;访问http://localhost:8080/myapp/myServlet,页面显示字符串“This is MyServlet”。
- JBoss 系列九十三: 高性能非阻塞 Web 服务器 Undertow
- 高性能非阻塞Web 服务器Undertow
- 高性能非阻塞 Web 服务器 Undertow
- Nginx高性能WEB服务器系列
- 利用 Java NIO 非阻塞IO流实现高性能服务器
- Undertow服务器基础分析 - Undertow
- web静态服务器-非阻塞模式
- 嵌入式Web服务器学习之阻塞IO/非阻塞IO
- 高性能WEB开发系列
- 高性能WEB开发系列
- 高性能Web服务器 Nginx
- 高性能web服务器-读书笔记
- 高性能Web服务器设计
- 高性能Web服务器 Nginx
- 高性能Web服务器 Lighttpd
- 高性能Web服务器 Nginx
- 高性能WEB服务器Nginx
- 高性能Web服务器 Nginx
- 我问你,java中的标记接口(Marker interface pattern)有啥用?
- Wow, Mangos登录时的SRP6认证
- 设计模式
- Leetcode: Minimum Window Substring
- 结构体内存对齐问题
- JBoss 系列九十三: 高性能非阻塞 Web 服务器 Undertow
- arm-linux-gcc交叉编译器的下载地址
- C/C++中##与#的使用
- 致终将逝去的Windows XP
- 一个strcpy 的溢出例子
- 生成一个集合的所有子集 Subset
- 编写ATL控件的简单做法
- Java 内存管理
- 常用 jquery 代码片段 和 javascript 代码片段