高性能非阻塞Web 服务器Undertow

概述

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编程使用的第一步是添加如下依赖到应用:

Java代码   收藏代码
  1. <dependency>  
  2.     <groupId>io.undertow</groupId>  
  3.     <artifactId>undertow-core</artifactId>  
  4.     <version>1.0.0.Final</version>  
  5. </dependency>  
  6. <dependency>  
  7.     <groupId>io.undertow</groupId>  
  8.     <artifactId>undertow-servlet</artifactId>  
  9.     <version>1.0.0.Final</version>  
  10. </dependency>  

 使用软件资料安装和下载章节中所描述方法使用Git下载quickstart应用。下载完成后使用如下命令编译

 

Java代码   收藏代码
  1. mvn clean install dependency:copy-dependencies    

 

编译完成或生成undertow-quickstart.jar包位于target目录下,运行时所有依赖包位于target/dependency目录下。

Undertow Hello World 示例

Undertow是一个高性能非阻塞 Web 服务器,接下来我们演示如何创建一个Web 服务器,如下为HelloWorldServer类代码明细:

Java代码   收藏代码
  1. public class HelloWorldServer {  
  2.   
  3.     public static void main(String[] args) {  
  4.         Undertow server = Undertow.builder().addHttpListener(8080"localhost").setHandler(new HttpHandler(){  
  5.   
  6.                     public void handleRequest(HttpServerExchange exchange)throws Exception {  
  7.                         exchange.getRequestHeaders().put(Headers.CONTENT_TYPE, "text/plain");  
  8.                         exchange.getResponseSender().send("Hello World");  
  9.                     }  
  10.                 }).build();  
  11.         server.start();  
  12.     }  
  13.   
  14. }  

 通过如下方法可以运行HelloWorldServer:

Java代码   收藏代码
  1. 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 类代码

Java代码   收藏代码
  1. public class MessageServlet extends HttpServlet {  
  2.   
  3.     private static final long serialVersionUID = 6861632231065498153L;  
  4.   
  5.     private static final String message = "This is MessageServlet";  
  6.       
  7.     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
  8.         doPost(req, resp);  
  9.     }  
  10.   
  11.     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
  12.         PrintWriter writer = resp.getWriter();  
  13.         writer.write(message);  
  14.         writer.close();  
  15.     }  
  16.       
  17. }  

 

MyServlet 类代码

Java代码   收藏代码
  1. public class MyServlet extends HttpServlet {  
  2.   
  3.     private static final long serialVersionUID = 2378494112650465478L;  
  4.       
  5.     private static final String message = "This is MyServlet";  
  6.   
  7.     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
  8.         doPost(req, resp);  
  9.     }  
  10.   
  11.     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
  12.         PrintWriter writer = resp.getWriter();  
  13.         writer.write(message);  
  14.         writer.close();  
  15.     }  
  16.       
  17. }  

 接下来我们使用Undertow提供的API,启动Web服务器,部署这两个Servlet,相关的ServletServer类代码如下:

Java代码   收藏代码
  1. public class ServletServer {  
  2.       
  3.     public static final String MYAPP = "/myapp";  
  4.   
  5.     public static void main(String[] args) throws ServletException {  
  6.           
  7.         DeploymentInfo servletBuilder = Servlets.deployment().setClassLoader(ServletServer.class.getClassLoader())  
  8.                                                              .setContextPath(MYAPP)  
  9.                                                              .setDeploymentName("myapp.war")  
  10.                                                              .addServlets(Servlets.servlet("MessageServlet", MessageServlet.class).addMappings("/messageServlet")  
  11.                                                                         , Servlets.servlet("MyServlet", MyServlet.class).addMappings("/myServlet"));  
  12.         DeploymentManager manager = Servlets.defaultContainer().addDeployment(servletBuilder);  
  13.         manager.deploy();  
  14.           
  15.         HttpHandler servletHandler = manager.start();  
  16.         PathHandler path = Handlers.path(Handlers.redirect(MYAPP)).addPrefixPath(MYAPP, servletHandler);  
  17.           
  18.         Undertow server = Undertow.builder().addHttpListener(8080"localhost").setHandler(path).build();  
  19.         server.start();  
  20.     }  
  21.   
  22. }  

 通过如下方法可以运行ServletServer,运行成功后访问http://localhost:8080/myapp/messageServlet,页面显示字符串“This is MessageServlet”;访问http://localhost:8080/myapp/myServlet,页面显示字符串“This is MyServlet”。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值