Spring Boot - Undertow容器启动

Undertow

  • Undertow 是红帽公司开发的一款基于 NIO 的高性能 Web 嵌入式服务器
  • Untertow 的特点: 轻量级:它是一个 Web 服务器,但不像传统的 Web 服务器有容器概念,它由两个核心 Jar 包组成,加载一个 Web 应 用可以小于 10MB 内存 Servlet3.1 支持:它提供了对 Servlet3.1 的支持 WebSocket 支持:对 Web Socket 完全支持,用以满足 Web 应用巨大数量的客户端 嵌套性:它不需要容器,只需通过 API 即可快速搭建 Web 服务器
  • 默认情况下 Spring Cloud 使用 Tomcat 作为内嵌 Servlet 容器,可启动一个 Tomcat 的 Spring Boot 程序与一个 Undertow 的 Spring Boot 程序,通过 VisualVM 工具进行比较,可看到 Undertow 性能优于 Tomcat

使用 Undertow

添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

支持 HTTP2

// 在@Configuration的类中添加@bean
@Bean
UndertowEmbeddedServletContainerFactory embeddedServletContainerFactory() {

    UndertowEmbeddedServletContainerFactory factory = new UndertowEmbeddedServletContainerFactory();

    // 这里也可以做其他配置
    factory.addBuilderCustomizers(builder -> builder.setServerOption(UndertowOptions.ENABLE_HTTP2, true));

    return factory;
}

配置 Undertow

    # Undertow 日志存放目录
    server.undertow.accesslog.dir
    # 是否启动日志
    server.undertow.accesslog.enabled=false 
    # 日志格式
    server.undertow.accesslog.pattern=common
    # 日志文件名前缀
    server.undertow.accesslog.prefix=access_log
    # 日志文件名后缀
    server.undertow.accesslog.suffix=log
    # HTTP POST请求最大的大小
    server.undertow.max-http-post-size=0 
    # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
    server.undertow.io-threads=4
    # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
    server.undertow.worker-threads=20
    # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
    # 每块buffer的空间大小,越小的空间被利用越充分
    server.undertow.buffer-size=1024
    # 每个区分配的buffer数量 , 所以pool的大小是buffer-size * buffers-per-region
    server.undertow.buffers-per-region=1024
    # 是否分配的直接内存
    server.undertow.direct-buffers=true

本文分享自微信公众号 - 国产程序员(Monday_lida)

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

原始发表时间:2019-08-14

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏EffectiveCoding

Java Concurrent 偏向锁&轻量级锁&重量级锁

再说偏向锁之前先来看一下Java 对象头,Java 对象是分为 对象头、实例数据、对齐填充三部分,创建一个Java 对象所消耗和占用的cpu和内存代价都是很高的...

19420
来自专栏渔夫

java在调用System.out.println()打印一个新new的对象时,为什么会调用toString方法?

版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)

16920
来自专栏EffectiveCoding

Go 语言基础--反射 浅析

反射是众多编程语言中的一个非常实用的功能,毫不意外go 也是对于反射提供了友好的支持,反射官方描述是一种能够自描述、自控制的应用。go 中的反射就是在运行时动态...

7720
来自专栏EffectiveCoding

Go 语言进阶--基础概念

本系列文章到现在已经将Go非常基础的部分介绍完成了,后面就开始设计非常具有Go特色的内容了,因为之后会出现一系列的名词和概念,为了方便本篇先把这些基础概念和我的...

6810
来自专栏月小水长

Java系列 | 十分钟学会JAVA IO

不知道大家在学JAVA IO的时候,有没有被各种五花八门的构造函数之间的组合和嵌套弄得头昏脑涨,比如BufferedReader br=new Buff...

13730
来自专栏EffectiveCoding

Java Concurrent AQS原理&源码概要(Java 10)

开始说AQS之前,继续说上一篇没说完的建议,相对于看一些不知道时效性的blog,说实话,理解一个知识点最简便的方式就是看论文及源码实现了,解决一个问题最好的方式...

10630
来自专栏渔夫

算法:有效括号

版权声明: ...

11230
来自专栏call_me_R

JavaScript糟粕部分

JavaScript有两组相等的运算符:===和!==,以及他们邪恶的孪生兄弟==和!=。===和!==运算符能够按照你期望的方式工作。如果两个运算数类型一致且...

8010
来自专栏无敌码农

一张图看懂JVM(升级版)

JVM总体上是由类装载子系统(ClassLoader)、运行时数据区、执行引擎、内存回收这四个部分组成。其中我们最为关注的运行时数据区,也就是JVM的内存部分则...

7530
来自专栏渔夫

Java-创建自定义ArrayList

版权声明: ...

8410

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励