SpringBoot中使用undertow

undertow

            • 依赖
            • 参数配置
            • 多端口监听

首先说一下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.bootgroupId>
    <artifactId>spring-boot-starter-webartifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-tomcatartifactId>
        exclusion>
    exclusions>
dependency>

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-undertowartifactId>
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,让其更适合自己的项目。

你可能感兴趣的:(Web开发,Java,SpringBoot)