在Netty上构建Servlet

众所周知,Netty是一款高性能的I/O框架,那怎么在它之上构建Web服务呢,今天网上搜了一篇文章,学习了一下:

Java Servlets have been vastly used in companies for more than 10 years now. Recently another project from JBoss named Netty has gained on popularity to serve data. From Netty website: "Netty has succeeded to find a way to achieve ease of development, performance, stability, and flexibility without a compromise.".

But at the moment to serve data or to handle requests, you need to choose for the implementation either for a Servlet or for Netty.

As main developer of XINS, an open-source web services framework, I‘ve developed a few years ago a basic Servlet container to be able to run unit tests and to run WAR if you wanted to with java -jar my-api.war or xins run-my-api.

For the release of XINS 3.0, I‘ve decided to put the Servlet container on top of Netty.
Netty takes cares of the IO and the HTTP handling and my Servlet container takes care of the handling of the HTTP request to the Servlet itself.

How to do it

First you need to handle HTTP data with a Netty ChannelPipeline using apipeline factory:

public class DefaultNettyServletPipelineFactory implements ChannelPipelineFactory {
...
public ChannelPipeline getPipeline() throws Exception {
    ChannelPipeline pipeline = pipeline();

    pipeline.addLast("decoder", new HttpRequestDecoder());
    pipeline.addLast("encoder", new HttpResponseEncoder());
    pipeline.addLast("deflater", new HttpContentCompressor());
    pipeline.addLast("handler", servletHandler); // will convert http request to servlet request
    return pipeline;
}

Then you will need a NettyServletHandler that converts Netty HttpRequest to a Servlet request:

public class NettyServletHandler extends SimpleChannelUpstreamHandler {
...
@Override
public void messageReceived(ChannelHandlerContext context, MessageEvent event) throws Exception {
    HttpRequest request = (HttpRequest) event.getMessage();
    // Then get URL, method, headers, ... and pass the values to the Servlet container.
}

You will also need a method to start the server:

   public void startServer(int port, String pipelineFactory) throws Exception {
      ServerBootstrap server = new ServerBootstrap(
              new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));

      if (pipelineFactory == null) { // If the user doesn‘t have a specific pipeline use the default one
         pipelineFactory = "org.xins.common.servlet.container.DefaultNettyServletPipelineFactory";
      }
      DefaultNettyServletPipelineFactory pipelineFactoryClass = (DefaultNettyServletPipelineFactory) Class.forName(pipelineFactory).newInstance();
      pipelineFactoryClass.setServletHandler(this);

      server.setPipelineFactory(pipelineFactoryClass);

      server.bind(new InetSocketAddress(port));
   }

And voilà! Your server code has the best of both worlds: it uses a standard API and it runs on Netty.

时间: 2024-10-06 23:04:50

在Netty上构建Servlet的相关文章

龙芯GO!龙芯平台上构建Go语言环境指南

龙芯软件生态系列——龙芯GO!龙芯平台上构建Go语言环境指南2016-07-05 龙芯中科1初识Go语言Go语言是Google公司于2009年正式推出的一款开源的编程语言,是由Robert Griesemer.KenThompson和Rob Pike等世界顶尖计算科学家精心打造的系统编程语言.Go语言最显著的特点是编码简洁迅速.支持高效并发和自动内存管理等.此外,Go语言还面向网络服务器.存储系统和数据库等领域的编程进行了优化设计,并且简化了应用系统的安装和部署.因此,Go语言受到了广大程序员的

通用上传Servlet

java判断文件类型参考: http://blog.csdn.net/shixing_11/article/details/5708145 目前使用的项目结构是:spring+springmvc+mybatis. 文件上传需要考虑两个地方: 1. 文件上传的安全性,脚本等文件是可以通过更改文件的后缀来提交的,这也是大多数网站通过上传渗入的方式. 2. 对非保存的文件删除,上传的文件,如果操作人没有进行保存或其他操作,需要清除文件. 本上传使用的包: commons-fileupload java

亚马逊AWS在线系列讲座——如何在AWS云平台上构建千万级用户应用

用户选择云计算平台来构建应用的一个重要原因是云平台的高弹性和高扩展性.面向互联网的应用往往需要支撑大量用户的使用,但是构建一个高扩展性的.高可用的应用具有一一定的挑战,不过基于AWS云平台来构建应用可以相对简化这个事情.这个在线讲座将讨论如何如何充分利用云平台的特性和AWS的相关服务来构建一个可以支撑千万级用户的应用.通过讨论不同用户数量级别的应用需求和架构特点,然后结合不同的AWS的服务来满足用户访问,并最终逐渐把架构优化成为可以支持千万级用户的设计.这个演讲的目的是帮助对AWS服务有一定基础

Cocos2d-x 3.0 - Eclipse上构建一个Android项目

Cocos2d-x 3.0 - Eclipse上构建一个Android项目 2014年4月30日 4月末 本篇继续介绍Cocos2d-x 3.0的一些基础内容,前面一篇博客介绍了如何在Visual Studio 2012上编译我们的Cocos2d-x项目,也成功把Helloworld运行起来了.跟以往的版本是类似的,只不过创建空项目的时候命令变成了cocos.本篇博客带给大家的是,如何在Eclipse运行起我们的Cocos2d-x项目,如果童鞋们有看我写的Cocos2d-x 2.2.3版本的交叉

Centos 6.5上构建Git Lab服务及问题总结

前言: 官方上面说并不推荐在CentOS上面安装GitLab,无奈公司的服务器都是CentOS的系统..... 不过,好在经历了三天才算把GitLab搭建起来,查了N多参考教程,发现一个问题,并不是每个教程都是通用的.总会遇到某些未知的错误是其他作者没有碰到的,毕竟每台服务器的环境是不一样的,问题百出,很是让人很是头痛. 下面总结了自己在CentOS搭建GitLab的教程以及某些错误的解决办法,算是对自己的总结吧!或许那天就用到了...... --------------------------

在CentOS 7上构建RAID5、LVM和SAMBA服务器(5)——架设SAMBA服务器

在CentOS 7上构建RAID5.LVM和SAMBA服务器(5)--架设SAMBA服务器 6. 架设SAMBA服务器 6.1. 预备 本节的任务是配置SAMBA服务,共享/home/shared目录,使指定的Windows用户可以远程访问该共享. 首先要在CentOS上运行yum命令安装SAMBA服务: yum install samba 安装之后,执行systemctl命令来启动smb和nmb两个samba的守护进程. 图37 启动SAMBA 6.2. 修改smb.conf文件 修改/etc

Citrix Synergy 2014:在HP Moonshot服务器上构建XenDesktop

今天想和大家分享一下Citrix Synergy 2014昨天的大会上HP发布的一个技术亮点:HP Moonshot CS100 for XenDesktop服务器.这东东可是个很有创新的技术,不得不介绍一下. 我记得第一天的Keynote中,Citrix全球总裁兼CEO Mark T就提出了一个新的名词:Software Defined Workspace,我们姑且把它翻译成软件定义工作空间吧,它将移动办公所能涉及到的人.业务.应用.数据.桌面整合起来,实现工作负载的变革.工作人员的参与互动以

如何在阿里云上构建一个合适的Kubernetes集群

摘要: 声明 本文主要介绍如何在阿里云上构建一个K8S集群的实践,只是作为参考,大家可以根据实际情况做出调整. 集群规划 在实际案例中发现,有不少同学使用了很多的小规格的ECS来构建K8S集群,这样其实即没有达到省钱的目的,也没有很好的发挥K8S集群的优势. 声明 本文主要介绍如何在阿里云上构建一个K8S集群的实践,只是作为参考,大家可以根据实际情况做出调整. 集群规划 在实际案例中发现,有不少同学使用了很多的小规格的ECS来构建K8S集群,这样其实即没有达到省钱的目的,也没有很好的发挥K8S集

Hbuilder用ajax连接阿里服务器上的servlet以及注意事项

Hbuiler连接服务器上的servlet的步骤与连接本地项目中的servlet基本一致,详细内容参考上一片博客:https://www.cnblogs.com/ljysy/p/10294640.html 需要将上篇博客中的ajax请求中的ip地址写成自己阿里服务器的相应的ip地址即可 在本片博客中主要是简述一些注意事项 要先在本地测试项目,可以用Hbuider正确访问,然后将本地项目导出一个war包,上传至阿里服务器的tomcat安装目录的webapps目录下(当然,需要事先安装好tomcat