高性能非阻塞Web 服务器Undertow

标签: 性能 web 服务器 | 发表时间:2014-02-26 10:10 | 作者:gaotong1991
出处:http://www.iteye.com

概述

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”。



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [性能 web 服务器] 推荐:

Web服务器的性能估计

- - 鸟窝
在给客户做方案的时候,或者在软件设计的时候,或者在软件测试的时候,我们经常会估算我们的web应用程序的性能. 如果估算误差太大,你给客户的方案是10台服务器,实际部署时确需要20台机器,客户绝对要疯了. 同样对我们的代码设计和测试方案影响重大. 那么在带宽和内存都很充足的情况下我们如何大致估算出一个web应用程序的性能呢.

Go 和 Python Web 服务器性能对比

- Ken - python.cn(jobs, news)
我通常使用 Python 来构建 Web 应用. 一年前,在兴趣的驱使下,我开始学习 Go. 在此期间,我重写了一些原本由 C 开发的 CGI 应用,包括运行于 chroot 环境下的同 thttpd 服务器一起的应用. 我开始寻找可以开发易于 chroot、且内置 Web 服务器的独立 Web 应用的工具.

Python 和 PHP 的 Web 服务器性能测试

- 非狐外传 - python.cn(jobs, news)
这几天一直在玩虚拟机,测了几种Python和PHP的Web服务器的性能,顺便记录下来. 宿主:MacBook Pro MC700. 操作系统:Mac OS X 10.6.8. CPU: 2.3GHz Intel Core i5(双核). 虚拟机:Virtual Box. 操作系统:Linux version 2.6.32-5-686 (Debian 2.6.32-35).

Python和PHP的Web服务器性能测试

- phus - keakon的涂鸦馆
这几天一直在玩虚拟机,测了几种Python和PHP的Web服务器的性能,顺便记录下来. 宿主:MacBook Pro MC700. 操作系统:Mac OS X 10.6.8. CPU: 2.3GHz Intel Core i5(双核). 虚拟机:Virtual Box. 操作系统:Linux version 2.6.32-5-686 (Debian 2.6.32-35).

高性能非阻塞Web 服务器Undertow

- - 互联网 - ITeye博客
WildFly 8 包含了一个全新的Web服务器(Undertow),WildFly 8 默认的Web服务器为Undertow. 一句话概括什么是Undertow - 高性能非阻塞 Web 服务器. Undertow 主要有以下几个特点:. 轻量化 - Undertow 是一个Web 服务器,但它不像传统的Web 服务器有容器的概念,它由两个核心jar包组成,使用API加载一个Web应用可以使用小于10MB的内存.

浅谈web服务器—Nginx

- - CSDN博客推荐文章
常见的web服务器有apache,Nginx,lighttpd等. 但Nginx作为一款高性能的Http和反向代理服务器,由于其高效率、简配置等优势在业内被广泛使用. 目前Taobao、新浪、赶集网、金山、豆瓣网、网易新闻等众多知名互联网企业的服务器都是采用Nginx. 根据url的不同,将HTTP请求转发到后端的应用服务器集群.

简易的python web服务器用途

- Ruby - Erlang非业余研究
原创文章,转载请注明: 转载自Erlang非业余研究. 本文链接地址: 简易的python web服务器用途. 我们在工作中经常会需要看下报表,如tsung的统计报表或者lcov的覆盖情况,这些报表通常为了方便都会作成html格式的. 我们可以把这些html网页打包拉回去用浏览器慢慢看,但是每次都要打包,拉数据非常麻烦.

Node.js 的简易web服务器

- bingo - 走走停停看看
网上关于Node.js的介绍已经铺天盖地了,但我就没找到一个简单的web服务器给我做测试用. 实际上Node.js只需要一个exe文件和一个js文件就可以搭建服务器了,用来随便测试页面之类的用起来比nginx还方便. 只可用于http服务,没有更多功能的js文件. 1,先去 http://nodejs.org/下载最新的Node.js可执行的exe文件.

优秀的轻量级Web服务器

- - Solidot
Alison Neville 写道 "Web服务器是一种使用超文本传输协议(HTTP)响应客户端请求提供网页的计算机软件,以HTML文件、图像、样式表和脚本的形式构成网页内容. Apache是​​最流行的Web服务器软件,提供了最新的协议实现,优秀的特性集,具有高可配置和可扩展性. Apache被一半以上的活跃网站所使用.

web服务器访问流程

- - ITeye博客
 问题1:DNS解析是什么,简述如图步骤1、2做了什么. 人们习惯记忆域名,但机器间互相只认ip,域名和ip可以是多对一的关系,他们之间的转换工作称为域名解析,域名解析需要有专门的域名解析服务器来完成. 在浏览器中输入域名www.iteye.com,操作系统会向检查自己本地的hosts. 是否有这个网址映射,如果有就直接调用这个ip地址,完成域名解析.