`
zhaohaolin
  • 浏览: 985475 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

使用内嵌的HTTP服务器构建Java WEB应用【转】

 
阅读更多

通常我们会在众多的J2EE标准的基础上来构建自己的Java WEB应用,比如最常见的Servlet。这样写出来的程序可以在所有符合J2EE标准的WEB服务器上运行,比如Tomcat,JBoss等等。事实上大多数Java WEB项目也正是采用这种架构,这么做有很多很多好处。但是这么做也有一些问题,J2EE标准和J2EE服务器隐藏了大部分的HTTP底层消息处理细节,如果你的应用不需要利用的众多J2EE特性,或者需要一个严苛的性能要求,又或者希望可以自己处理一些HTTP底层,那么可以考虑采用内嵌的JAVA HTTP服务器,这些Embedded Java Http Server主要包括了:

  • Netty,采用NIO,它来自JBoss,部分实现了zero-copy,而且文档和例子充足;
  • Grizzly,GlassFish V3的内核。
  • AsyncWeb,基于Apache Mina作为底层的NIO框架,性能不错,但是好像不更新了。

Apache Mina找不到打包好的代码,你似乎只能通过SVN来获得了,svn checkout http://svn.apache.org/repos/asf/mina/asyncweb/trunk。

所有这些内嵌服务器都可以方便的嵌入到你的Java应用中,并且体积小巧,可以通过编程的方法详细的控制从Http消息的全部生存周期。更加优秀的是它们的新能,采用NIO或者Temp Selector(Grizzly),它们的处理速度已经比tomcat这种“庞然大物”高出许多,在应用中你了解并且可以控制所有底层到高层的细节,这让后期的优化更加容易。当然,代价是你必须放弃J2EE带来的许多方便的特性,比如Servlet,数据源等等。如果你用过Playframework的话,就会了解到Servlet并不是最好的Java WEB架构(最起码不是“唯一”),而且体会到摆脱那些既有的J2EE标准的好处,现在playframework采用了Netty作为它的底层HTTP服务器。

Netty

Netty比其它两个更加“易于入门”,因为它有很多的文档和充足的例子,并且经过简单的代码,你就可以立即获得一个HTTP服务器。Playframework采用了Netty作为它的底层HTTP服务器。

JAVA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class NettyServer {
 
	public static int httpPort;
	public static int httpsPort;
 
	public static void main(String[] args) throws Exception {
    	       new NettyServer(args);//new 操作即是启动服务器的方法
        }
 
	public NettyServer(String[] args) {
		System.setProperty("file.encoding", "utf-8");
		httpPort = 8000;
		ServerBootstrap bootstrap = new ServerBootstrap(
				new NioServerSocketChannelFactory(
						Executors.newCachedThreadPool(),
						Executors.newCachedThreadPool()));
		try {
			bootstrap.setPipelineFactory(new HttpChannelPipelineFactory());//应用的业务逻辑接入点
			bootstrap.bind(new InetSocketAddress(httpPort));
 
		} catch (ChannelException e) {
			Logger.error("Could not bind on port " + httpPort, e);
			System.exit(-1);
		}
 
	}
}

Grizzly

Grizzly宣称自己的框架性能最好,它也是GlassFish的Http引擎(不过GlassFish我用着到不怎么好…)。
下面这个是Playframework grizzly module的一个例子

JAVA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Server {
    final GrizzlyWebServer ws;
    public Server(File applicationDir) {
        Properties p = Play.configuration;
        int httpPort = 80;     
        httpPort = Integer.parseInt(System.getProperty("http.port"));
        ws = new GrizzlyWebServer(httpPort);
        ws.useAsynchronousWrite(true);
        ws.addGrizzlyAdapter(new PlayGrizzlyAdapter());//PlayGrizzlyAdapter是应用业务逻辑接口
        try {
            ws.start();//启动服务器,监听Http请求
        } catch (IOException e) {
            Logger.error("Could not bind on port " + httpPort, e);
            ws.stop();
            System.exit(-1);
        }
    }
 
    public static void main(String[] args) throws Exception {
        File root = new File(System.getProperty("application.path"));
        new Server(root, System.getProperty("play.id", ""));
    }
 
}

AsyncWeb

这个项目好长时间不更新了,原来playframework是用AsyncWeb作为HTTP服务器的,但是最近改成了Netty。AsyncWeb和其它两个框架最不同的地方就是它可以采用Tomcat Native APR驱动底层socket接收框架,由于APR是一种本地库,可能更加有性能优势吧(没测试)。AsyncWeb是基于著名的Java NIO框架Apache Mina的,虽然AsyncWeb的文档很少,但是Mina的文档却很充足,如果你对Mina熟悉的话,AsyncWeb那300多KB的代码很容易阅读,或者定制。

JAVA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Main {
    public static void main(String[] args) throws Exception {
        SocketAcceptor acceptor = new NioSocketAcceptor();//可以选择别的acceptor,比如APR
 
        acceptor.getFilterChain().addLast("codec",
                new ProtocolCodecFilter(new HttpCodecFactory()));
        acceptor.setReuseAddress(true);
        acceptor.getSessionConfig().setReuseAddress(true);
        acceptor.getSessionConfig().setReceiveBufferSize(1024);
        acceptor.getSessionConfig().setSendBufferSize(1024);
        acceptor.getSessionConfig().setTcpNoDelay(true);
 
        acceptor.setHandler(new HttpProtocolHandler());//实现自己的HTTP处理类,应用的接入点
 
        acceptor.bind(new InetSocketAddress(9012));//启动服务器,监听Http请求
    }
}
--EOF--
分享到:
评论

相关推荐

    Jetty中文手册

    使用构建工具 如何在Maven中使用Jetty 如何在Ant中使用Jetty Maven和Ant的更多支持 Jetty Maven插件(Plugin) Jetty Jspc Maven插件(Plugin) Maven web应用工程原型 Ant Jetty插件(Plugin) 使用集成开发环境...

    springboot参考指南

    创建一个非web(non-web)应用 ii. 63. 属性&配置 i. 63.1. 外部化SpringApplication配置 ii. 63.2. 改变应用程序外部配置文件的位置 iii. 63.3. 使用'short'命令行参数 iv. 63.4. 使用YAML配置外部属性 v. 63.5. ...

    浅探《Java程序设计》的教学目标和课程设计(全文).docx

    这门课程的前导课程是《C语言》、《XX页制作》和《计算机XX络》,所以它一般放在第三或第四个学期开设,后续课程是面向服务器编程《JSP》、面向Web通信的《J2EE》、面向移动通信《J2ME》。 3.《Jv程序设计》的课程...

    Springboot心旅售票管理系统(含源码+数据库)

    总的来说,Spring Boot提供了快速开发、简化配置、内嵌服务器、增强生命周期、监控和管理等功能,是用于构建现代化Java应用程序的理想框架。 Vue是用于构建前端页面的一套相当好用的渐进式JavaScript框架,与其他...

    JAVA毕业设计之相亲网站(springboot+mysql)完整源码.zip

    它支持自动配置、内嵌Web服务器等功能,使得开发者可以专注于业务逻辑的实现。 MySQL:作为项目的数据库管理系统,用于存储用户信息、交友需求等数据。MySQL具有较高的性能和稳定性,适合用于构建大型网站。 功能...

    Loadrunner从零开始

    但是对于胖客户端Web应用来说,比如Java applet、AJAX,由于客户端内嵌了大量的逻辑处理,耗费的时间有可能很长,从而成为系统的瓶颈,这是要注意的一个地方。 那么客户感受的响应时间其实是等于客户端响应时间+...

    毕设之基于微信小程序的小微金融企业的设计与实现_r(源码+部署说明+SpringBoot+微信小程序+vue).zip

    SpringBoot的主要优点包括:可以快速创建独立运行的Spring项目、内嵌web服务器、方便做web集成等。 前端部分主要包括两部分:微信小程序和后台管理界面。微信小程序使用微信开发者工具进行开发,主要用于用户端的...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    GCF 谷歌内嵌浏览器框架, 使用此插件,用户可以通过Internet Explorer的用户界面,以Chrome内核的渲染方式浏览网页。Chrome Frame 会把最新版的Chrome Webkit 内核和JavaScript 引擎注入到IE中, IE浏览器将获得...

    springboot学习思维笔记.xmind

    使用容器发布事件 Spring高级话题 Spring Aware BeanNameAware BeanFactoryAware ApplicationContextAware MessageSourceAware ApplicationEventPublisherAware ResourceLoaderAware 多...

    Redis云管理平台CacheCloud.zip

    用于ssh${your machine username}cachecloud.machine.password服务器密码,用于ssh${your machine password}web.portspring-boot内嵌tomcat启动端口80803、启动cachecloud系统 mvn spring-boot:run1. 构建:mvn -...

    Tcl_TK编程权威指南pdf

    我创建的应用程序有HTML编辑器、EMAIL比用户接口程序、Web服务器以及用户数据库,我们的商务应用就建立在它们的基础上。这些经历在本书中有所反映。本书的大部分内容是有关Tcl脚本编程的,而有关使用C语言来创建Tcl...

    基于SpringBoot+Vue的在线考试系统+源代码+文档说明

    | Web服务器 | SpringBoot内嵌的Tomcat | | 数据库 | MySQL 5.7 | ## 运行步骤 1. 数据库导入,新建数据库exam,将`exam.sql`文件导入并运行。 2. 打开项目,打开`src/main/resources/baseApplication.yaml`,修改...

    C#微软培训资料

    第六章 类 型 转 换 .48 6.1 隐式类型转换 .48 6.2 显式类型转换 .53 6.3 小 结 .56 第七章 表 达 式 .58 7.1 操 作 符 .58 7.2 算术操作符和算术表达式.59 7.3 赋值操作符和赋值表达式.64 7.4 关系...

    Grails实战教程-整合版

    现如今,基于Java的网站开发明显过于复杂,...一个内嵌的且已配置为热部署的Tomcat服务器 Spring的依赖注入技术 使用Spring的MessageSource实现国际化(i18n) 一个基于Spring事务抽象的事务层 借助功能强大的Groovy

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    Java EE 框架..................................................................................................................................................................................1 ...

Global site tag (gtag.js) - Google Analytics