Java微服务框架之Undertow

一、Undertow简介:

Undertow 是红帽公司(RedHat)的开源产品,是 WildFly8(JBoos) 默认的 Web 服务器。

官网API给出一句话概述Undertow:

Undertow is a flexible performant web server written in java, providing both blocking and non-blocking API’s based on NIO.

译文: Undertow是一个用java编写的灵活的高性能Web服务器,提供基于NIO的阻塞和非阻塞API。

官网API总结特点:

 Lightweight(轻量级)

Undertow非常轻量级,Undertow核心jar包在1Mb以下。 它在运行时也是轻量级的,有一个简单的嵌入式服务器使用少于4Mb的堆空间

 HTTP Upgrade Support(支持http升级)

支持HTTP升级,允许多个协议通过HTTP端口进行多路复用

 Web Socket Support(支持WebScoket)

Undertow提供对Web Socket的全面支持,包括JSR-356支持

 Servlet 3.1

Undertow提供对Servlet 3.1的支持,包括对嵌入式servlet的支持。 还可以在同一部署中混合Servlet和本机Undertow非阻塞处理程序

 Embeddable(可嵌入的)

Undertow可以嵌入在应用程序中或独立运行,只需几行代码

 6. Flexible(灵活性)

Undertow框架jar包: undertow-core.jar undertow-servlet.jar

二、Undertow示例:

1.官网给出一个Undertow Web 服务器使用异步IO的方式向界面输出字符串

 import io.undertow.Undertow;
import io.undertow.server.HttpHandler;
import io.undertow.server.HttpServerExchange;
import io.undertow.util.Headers; public class HelloWorldServer {
public static void main(String[] args) {
Undertow server=Undertow.builder()
.addHttpListener(8080, "localhost").setHandler(new HttpHandler(){//设置HttpHandler的回调方法
@Override
public void handleRequest(HttpServerExchange exchange)
throws Exception {
exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
exchange.getResponseSender().send("This is my first insert server!");
}
}).build();
server.start();
}
}

   运行后打开浏览器输入 http://localhost:8080 ,则页面输出“Hello World”字符串

2.Undertow来部署Servlet

 import io.undertow.Handlers;
import io.undertow.Undertow;
import io.undertow.server.HttpHandler;
import io.undertow.server.handlers.PathHandler;
import io.undertow.servlet.Servlets;
import io.undertow.servlet.api.DeploymentInfo;
import io.undertow.servlet.api.DeploymentManager;
import io.undertow.servlet.api.ServletContainer;
import io.undertow.servlet.api.ServletInfo; import javax.servlet.ServletException; import org.wildfly.undertow.quickstart.servlet.MyServlet; public class ServletServer { public static void main(String[] args) { /*
* 创建ServletInfo,Servelt的最小单位。是对javax.servlet.Servlet具体实现的再次封装。
* 注意:ServletInfo的name必须是唯一的
*/
ServletInfo servletInfo1 = Servlets.servlet("MyServlet",
MyServlet.class);
// 创建servletInfo的初始化参数
servletInfo1.addInitParam("message", "This is my first MyServlet!");
// 绑定映射为/myServlet
servletInfo1.addMapping("/myServlet");
/**
* 创建包部署对象,包含多个servletInfo。可以认为是servletInfo的集合
*/
DeploymentInfo deploymentInfo1 = Servlets.deployment();
// 指定ClassLoader
deploymentInfo1.setClassLoader(ServletServer.class.getClassLoader());
// 应用上下文(必须与映射路径一致,否则sessionId会出现问题,每次都会新建)
deploymentInfo1.setContextPath("/myapp");
// 设置部署包名
deploymentInfo1.setDeploymentName("myServlet.war");
// 添加servletInfo到部署对象中
deploymentInfo1.addServlets(servletInfo1);
/**
* 使用默认的servlet容器,并将部署添加至容器
* 容器,用来管理DeploymentInfo,一个容器可以添加多个DeploymentInfo
*/
ServletContainer container = Servlets.defaultContainer();
/**
* 将部署添加至容器并生成对应的容器管理对象
* 包部署管理。是对添加到ServletContaint中DeploymentInfo的一个引用,用于运行发布和启动容器
*/
DeploymentManager manager = container.addDeployment(deploymentInfo1);
// 实施部署
manager.deploy();
/**
* 分发器:将用户请求分发给对应的HttpHandler
*/
PathHandler pathHandler = Handlers.path();
/**
* servlet path处理器,DeploymentManager启动后返回的Servlet处理器。
*/
HttpHandler myApp=null;
try {
//启动容器,生成请求处理器
myApp=manager.start();
} catch (ServletException e) {
throw new RuntimeException("容器启动失败!");
}
//绑定映射关系
pathHandler.addPrefixPath("/myapp", myApp); Undertow server=Undertow.builder().
//绑定端口号和主机
addHttpListener(8081, "localhost")
//设置分发处理器
.setHandler(pathHandler).build();
//启动server
server.start();
}
}

 
自定义MyServlet
 import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class MyServlet extends HttpServlet { private static final long serialVersionUID = 2378494112650465478L; 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("<p style='color:red;text-align:center;'>"+this.getInitParameter("message")+"</p>");
writer.close();
} }

如下图,是本人抽象出Undertow生成应用的架构:


示例运行:

在浏览器地址栏里输入:http://localhost:8081/myapp/myServlet,界面上会显示ServletInfo的初始化参数message数据


Undertow jar包:点击下载

Undertow 官网API地址:http://undertow.io/index.html


WildFly8(JBoss)默认web服务器-------Undertow的更多相关文章

  1. 高性能非阻塞 Web 服务器 Undertow

    Undertow 简介 Undertow是一个用java编写的.灵活的.高性能的Web服务器,提供基于NIO的阻塞和非阻塞API. Undertow的架构是组合式的,可以通过组合各种小型的目的单一的处 ...

  2. [ 转 ] 为 phpstorm 自定义默认 Web 服务器

    phpstorm自带web 服务器,可以直接执行调试,这个之前的文章专门讲过,可以看下. 同时你也可以选择在phpstorm集成apache服务器,下面是我自己的亲测的步骤. 如何修改apache默认 ...

  3. 转:Red Hat JBoss团队发布WildFly 8,全面支持Java EE 7并包含全新的嵌入式Web服务器

    原文来自于:http://www.infoq.com/cn/news/2014/02/wildfly8-launch Red Hat的JBoss部门今天宣布WildFly 8正式发布.其前身是JBos ...

  4. asp.net core 系列 18 web服务器实现

    一. ASP.NET Core Module 在介绍ASP.NET Core Web实现之前,先来了解下ASP.NET Core Module.该模块是插入 IIS 管道的本机 IIS 模块(本机是指 ...

  5. net core web服务器实现

    net core 系列 18 web服务器实现 一. ASP.NET Core Module 在介绍ASP.NET Core Web实现之前,先来了解下ASP.NET Core Module.该模块是 ...

  6. Visual Studio中用于ASP.NET Web项目的Web服务器

    当您在 Visual Studio 中开发 Web 项目时,需要 Web 服务器才能测试或运行它们. 利用 Visual Studio,您可以使用不同的 Web 服务器进行测试,包括 IIS Expr ...

  7. ASP.NET Core技术研究-全面认识Web服务器Kestrel

    因为IIS不支持跨平台的原因,我们在升级到ASP.NET Core后,会接触到一个新的Web服务器Kestrel.相信大家刚接触这个Kestrel时,会有各种各样的疑问. 今天我们全面认识一下ASP. ...

  8. WEB服务器:Apache、Tomcat、JBoss、WebLogic、Websphere、IIS的区别与关系

    1)Apache  免费,世界使用排名第一的Web服务器.它可以运行在几乎所有广泛使用的计算机平台上.Apache的特点是简单.速度快.性能稳定,并可做代理服务器来使用.Apache是以进程为基础的结 ...

  9. web服务器-nginx默认网站

    web服务器-nginx默认网站 一 默认网站 server { listen 80; server_name localhost; location / { root html; index ind ...

随机推荐

  1. mongdb基础

    查看数据库 show dbs; 切换到需要使用的数据库:use local; 显示集合中的数据库表:show collections; 切换到数据库test,如果数据库不存在,则自动创建 插入数据 d ...

  2. toString()方法简单分析

    问题描述 今天在使用spotbugs代码走查时发现这样一个问题,如下, String[] myArray=new String[] {"1","2"," ...

  3. HashMap 和 HashTable 到底哪不同 ?

    HashMap 和 HashTable 到底哪不同 ? 2017/05/29 | 分类: 基础技术 | 1 条评论 | 标签: HASHMAP, HASHTABLE 分享到: 原文出处: 程序员赵鑫 ...

  4. Linux sync命令的作用分析

    Sync命令   在用reboot命令启动unix系统后,系统提示出错信息,部分应用程序不能正常工作.经仔细检查系统文件,并和初始的正确备份进行比较,发现某些文件确实被破坏了,翻来覆去找不到文件遭破坏 ...

  5. eclipse技巧-快捷键

    ctrl + 1,快速修复 ctrl + d, 快捷删除行 shift + Enter,快速移动光标到下一行 ctrl + F11,运行代码 alt + ↑/↓,快速移动行 ctrl + alt + ...

  6. ES6的新特性(11)——Class 的继承

    Class 的继承 简介 Class 可以通过extends关键字实现继承,这比 ES5 的通过修改原型链实现继承,要清晰和方便很多. class Point { } class ColorPoint ...

  7. 撤销 git merge

    由于太多人问怎么撤销 merge 了,于是 git 官方出了这份教程,表示在 git 现有的思想体系下怎么达到撤销 merge 的目标. 方法一,reset 到 merge 前的版本,然后再重做接下来 ...

  8. php异步学习(2)

    PHP开启异步多线程执行脚本   场景要求 客户端调用服务器a.php接口,需要执行一个长达5s-20s不等的耗资源操作,但是客户端响应请求时间为5秒(微信公众账号服务器请求响应超时时间),5s以上无 ...

  9. c# dataGridView排序

    一.对阿拉伯数字进行自定义排序: 简单有效方法: 1.该列的sortmode属性为auto...(一般默认) 2.比如首列序号,添加该列数据的时候直接添加int即可.切忌不要用string. obje ...

  10. C++:const用法的简单总结

    一.对变量的修饰 在c++中,如果我们希望定义一个值不会被改变的变量,那么可以用关键字const对它进行修饰,被修饰后的变量其作用相当于一个常量 //这两种方式等价 2 语法1:const 类型名 变 ...