专栏首页ImportSource快速了解 Spring Boot 内嵌容器 Undertow

快速了解 Spring Boot 内嵌容器 Undertow

1、简介

Undertow是一个非常轻量并高性能的web server,它来自 JBoss。支持blocking和non-blocking两种NIO API。

由于它是用Java写的,所以它可以被那些JVM-based 的应用通过内嵌的方式来使用。甚至JBoss的WilfFly服务器在内部使用Undertow来提高服务器的性能。

在本文中,我们将介绍Undertow的主要功能并给出使用代码。

2. 为什么要选择Undertow?

  • 轻量级:Undertow 是非常小的,只有不到1MB。在内嵌模式下,运行时只占heap空间的4MB左右。
  • Servlet 3.1:完美支持 Servlet 3.1
  • Web Socket:支持 Web Socket (包括JSR-356)
  • 长连接:默认情况下 ,Undertow 通过添加keep-alive 的response header来支持长连接。它通过重用连接信息(connection details)来改善长连接的性能。

3. 使用Undertow

不多说,让我们使用Undertow来创建一个简单的web server吧!

3.1. Maven 依赖

加入如下依赖:

要构建一个可运行的jar,我们还需要添加一个maven-shade-plugin。像下面这样:

最新版的Undertow已经放到了maven 中央仓库,随便玩耍吧。

3.2. 简单的Server

仅仅需要下面的几行代码,就可以创建一个简单的web server,Undertow的入口使用的是Builder API。

这里我们使用Builder API把server绑定到8080端口上。同时我们使用了lambda表达式配置了一个handler。你也可以不用lambda表达式做同样的事情:

最主要的事情就是这里对HttpHandler API的使用。这个是根据我们的需要定制Undertow应用程序的最重要的武器。

在这里,我们添加了一个自定义的handler,逻辑就是让每个request都有一个Content-Type: text/plain response header。

同样的,如果你想让每个response都返回默认的text文本,你可以像下面这样来定义:

3.3.安全访问

在大多数情况下,我们不希望所有的用户都可以访问我们的server。通常,只有那些携带了合法“护照”的才可以访问。在Undertow上,我们同样可以实现这样的机制。

要想实现这个,我们只需要创建一个认证管理器,这个管理器会检查每个请求的用户信息。

下面我们就来实现一个自定义的IdentityManager:

一旦认证mananger被创建,我们需要创建一个“领地”来保存用户的信息。

这里我们使用了 AuthenticationMode.PRO_ACTIVE,表示每个来到这个server的请求都将会经过我们指定的认证机制来踊跃的进行认证。

如果我们使用了AuthenticationMode.CONSTRAINT_DRIVEN模式,那么只有那些被明确要求过滤的请求才会经过认证机制。

现在,我们只需要把保存用户信息的“领地”和认证管理器关联起来就可以了。

截止目前,我们已经创建了两个用户实例。一旦server启动了以后,要想访问,我们就需要使用这个两个证书才行。

3.4. Web Socket

使用Undertow的WebSocketHttpExchange API创建web socket exchange channel 同样非常简单。

下面,我们就打开一个socket通信channel,在/importsourceApp path上:

然后我们就可以创建一个HTML页面 index.html,然后使用js的WebSocket API来连接到这个channel上了。

3.5. File Server

使用Undertow,我们也可以创建一个文件服务器(file server),它可以显示目录内容,并直接从目录中提供文件:

你甚至都不需要穿件任何UI来显示目录。Undertow 为你提供了一个开箱即用的页面。

4. Spring Boot Plugin

Spring Boot把Undertow也内嵌进去了,作为继Tomcat和Jetty之后第三个内嵌的servlet 容器。要想在Spring Boot中使用Undertow只需要加下面的依赖就是了:

5. 总结

在本文中,我们了解了Undertow以及如何使用它创建不同类型的服务器。

本文分享自微信公众号 - ImportSource(importsource),作者:贺卓凡

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-11-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 读懂一行GC日志

    en ..... ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

    ImportSource
  • 使用Unsafe实现“无锁”的原子数据结构 | 锁系列-Java中的锁

    现在市面上很少有关于Unsafe的话题。这个Unsafe有个compareAndSwap方法是原子的,并且使用这个方法可以实现高性能的lock-free的数据结...

    ImportSource
  • 是时候忘掉finalize方法了

    故事要从jdk11 early access版说起。 近日,发现jdk11发布了一个早鸟版。心想,jdk10刚刚发布没多久(JDK10要来了:下一代 Java...

    ImportSource
  • CVE-2020-7471 漏洞详细分析原理以及POC

    这几天疫情爆发,只能待在家里为社会多做些贡献,一天深夜无意逛安全资讯的时候发现最新的一个漏洞:CVE-2020-7471 Potential SQL injec...

    周俊辉
  • vue2.5入门(推荐,差代码) 原

    晓歌
  • 入门:构建简单的Web API

    WCF Web API支持多个宿主环境:自宿主(windows服务或者控制台)和IIS宿主(asp.net webform/mvc)。这个入门文章主要演示在AS...

    张善友
  • 运维开发和测试中常见的8个问题

    今天集中精力,一门心思来做一些后端功能的改造,在这个过程中摸索出了一些实践经验。

    jeanron100
  • 混合云环境的最佳应用程序、工作负载和策略指南

    企业在内部部署数据中心的服务器上运行其应用程序、数据和计算功能。一些企业将虚拟化技术用于其IT基础设施,目的是优化内部部署运营环境。随着越来越多的企业构建自己的...

    静一
  • AI 在病理学上的突破,对图片染色「以假乱真」

    场景描述:利用机器学习的方法,对病理学中的组织样本切片显微图像,进行虚拟染色,从而来避免传统染色方法的弊端。辅助医疗人员更便捷的进行诊断。

    HyperAI超神经
  • Vue入门实例

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    程裕强

扫码关注云+社区

领取腾讯云代金券