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. [IOI2011]Race 点分治

    [IOI2011]Race LG传送门 点分治板子题. 直接点分治统计,统计的时候开个桶维护下就好了. 注(tiao)意(le)细(hen)节(jiu). #include<cstdio> ...

  2. cogs1439 货车运输

    cogs1439 货车运输 一道傻逼板子题. 边一定在最大生成树上,这个可以用消圈证明 然后kruskal跑一遍再搜一遍再建ST表再跑LCA这题就做完了. RT PS.交上去的代码把Kruskal打成 ...

  3. java模拟http请求

    java模拟http发送请求,第一种是HttpURLConnection发送post请求,第二种是使用httpclient模拟post请求, 方法一: package main.utils; impo ...

  4. Tp框架之命名空间

    命名空间,相当于虚拟目录 实现自动加载类的机制 初始命名空间:Library文件夹 初始命名空间下面有很多根命名空间: 1.Library里面的文件夹 2.APP的模块文件夹 在tp框架中,只有这两个 ...

  5. PHP Redis 缓存数据

    // 注:只是在此做下记录,有兴趣的可以参考,不做实际教程文档// 配置文件define('CONFIG', [ 'redis-server' => '127.0.0.1', 'redis-po ...

  6. JavaScript的数组和字符串应用

    函数search实现在一个已排序的数字类型数组中查找指定数字的功能. 可以采用数组的内置方法,二分查找法等进行操作 //方法一 var search = function(arr,dst){ var ...

  7. 4星|《亿万》:FBI大战华尔街对冲基金大鳄

    亿万:围剿华尔街大白鲨 全书尝试还原2008-2013年前后FBI指控赛克资本老板科恩通过内幕交易盈利的案件细节. 作者花了数年时间,采访了200多位当事人,阅读了海量的相关资料.书中交代了科恩的发家 ...

  8. PPM、PGM、PBM图像格式剖析

    今天突然需要用到PPM这个图像文件格式,之前没见过,在此记录一下. PPM.PGM.PBM这三个图像文件格式很少见,其实也不难,分别用于彩色图像.灰度图像.二值图像.这里以PPM格式为例. PPM格式 ...

  9. Python爬虫入门(5):URLError异常处理

    大家好,本节在这里主要说的是URLError还有HTTPError,以及对它们的一些处理. 1.URLError 首先解释下URLError可能产生的原因: 网络无连接,即本机无法上网 连接不到特定的 ...

  10. 团队作业——王者光耀:team

    光耀101  <光耀101>是福州大学数计学院计算机专业推出的中国首部程序猿脱发养成节目.由张栋担任发起人,刘晨瑶.畅畅担任导师.  该节目召集了你猜多少位选手,通过任务.训练.考核,让选 ...