SpringBoot中使用undertow

4 篇文章 0 订阅
3 篇文章 0 订阅

首先说一下undertow是个啥?

undertow是一个采用Java开发的灵活的高性能web服务器。其提供包括阻塞和基于NIO的非阻塞机制。

它是红帽公司的开源产品,是一个完全为嵌入式设计的web服务器。

优点:

  • 轻量:undertow只有几百KB,在嵌入式模式下运行,占用的堆内存也只有4MB左右
  • servlet兼容:完美兼容servlet3.1
  • Web Socket:支持Web Socket
  • 长连接:默认情况下,undertow通过keep-alive的response header来支持长连接。它通过重用连接信息(connection details)来改善长连接的性能

上面有提到,undertow是一个完全为嵌入式设计的web服务器,而恰巧,SpringBoot的核心点之一就是嵌入式的web服务器。于是undertow快速的在SpringBoot项目中流行了起来。

SpringBoot默认是使用的Tomcat作为web服务器,其还支持undertow和jetty两种服务器。那么为什么undertow的使用率在逐渐升高呢。

作为web服务器,最让人关心的无外乎就是并发和资源消耗。而undertow、Tomcat、jetty的压测结果以及资源消耗都证明,undertow是较好的选择。当然,具体选择什么还是看实际业务和项目情况。

这里直接展示给大家,网上大佬测试的结果:

  • 压测结果:在面对并发的情况下,Tomcat和jetty差距不大,undertow略高一筹
  • 资源消耗:在容器启动时,jetty消耗最大,undertow比Tomcat略微低一点点

如果对压测和资源消耗的详细结果有兴趣的,可以参考如下文章SpringBoot服务器压测对比。当然,也可以自己去测试一下。

那么,如果我们选择了undertow,那要如何使用它呢。下面就详细的说明一下。

依赖

引入undertow的依赖,同时要排除掉默认的Tomcat依赖:

<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>
参数配置
# access log目录
server.undertow.accesslog.dir=
# 是否打开access log
server.undertow.accesslog.enabled=false
# access log的输出格式化模板
server.undertow.accesslog.pattern=common
# 日志文件名称前缀
server.undertow.accesslog.prefix=access_log.
# 是否开启access log rotation
server.undertow.accesslog.rotate=true
# 日志文件名称后缀
server.undertow.accesslog.suffix=log
# 每个buffer可以存储的字节数,buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理,设置越小越好,根据实际业务尽量设置的小一点
server.undertow.buffer-size=1024
# 每个域的buffer数
server.undertow.buffers-per-region=
# 是否直接分配堆外内存
server.undertow.direct-buffers=true
# 置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程,设置太大会使项目启动失败
server.undertow.io-threads=16
# http发送的请求内容的最大字节数
server.undertow.max-http-post-size=0
# 阻塞任务线程池, 当执行类似servlet请求阻塞IO操作, undertow会从这个线程池中取得线程,它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8
server.undertow.worker-threads=256
多端口监听

如果有需要多端口监听的时候,可以通过UndertowEmbeddedServletContainerFactory去定义:

@Bean
public UndertowEmbeddedServletContainerFactory embeddedServletContainerFactory() {
    UndertowEmbeddedServletContainerFactory factory = new UndertowEmbeddedServletContainerFactory();
    factory.addBuilderCustomizers(new UndertowBuilderCustomizer() {

        @Override
        public void customize(Builder builder) {
            builder.addHttpListener(8080, "0.0.0.0");
        }

    });
    return factory;
}

一般而言,引入依赖后,除日志相关的配置,其它都使用默认的即可。当项目需要对密集IO操作或者并发进行优化时,再去考虑通过配置去优化undertow,让其更适合自己的项目。

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值