【SpringBoot技术专题】「开发实战系列」Undertow web容器的入门实战及调优方案精讲

本文主要是介绍【SpringBoot技术专题】「开发实战系列」Undertow web容器的入门实战及调优方案精讲,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Undertow web容器的入门实战及调优方案精讲

    • Undertow web容器
      • Undertow 介绍
      • 官网API给出一句话概述Undertow:
      • 官网API总结特点:
        • Lightweight(轻量级)
        • HTTP Upgrade Support(支持http升级)、HTTP/2 Support
        • 支持HTTP 2.0
        • Servlet 4.0
        • Embeddable(可嵌入的)
        • Flexible(灵活性)
      • 总结
      • Spring Boot项目中的引入方式 :
        • 添加如下依赖
        • application.properties配置 :
      • Undertow,Tomcat和Jetty服务器配置详解与性能测试
        • NIO(非阻塞式输入输出)
      • 自定义undertow对象模型0
          • Undertow类是入口点
        • 参考资料

Undertow web容器

Undertow 介绍

Undertow 是红帽公司开发的一款基于 NIO 的高性能 Web 嵌入式服务器,红帽公司(RedHat)的开源产品,且是 WildFly8(JBoss)默认的 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/2 Support

支持HTTP升级,允许多个协议通过HTTP端口进行多路复用。

支持HTTP 2.0
  • Web Socket Support(支持WebSocket)

  • Undertow提供对Web Socket的全面支持,包括JSR-356支持

Servlet 4.0

Undertow提供对Servlet 4.0的支持,并兼容之前版本,包括对嵌入式servlet的支持。 还可以在同一部署中混合Servlet和本机Undertow非阻塞处理程序

Embeddable(可嵌入的)

Undertow可以嵌入在应用程序中或独立运行,只需几行代码

Flexible(灵活性)

Undertow框架jar包: undertow-core.jar undertow-servlet.jar

总结

  1. Undertow是一个Web服务器,那么它就需要具备的现代Web服务器的基本特性,比如Servlet,JSP,文件服务器,代理服务器,安全认证等。undertow目前已经实现了绝大多数功能,并且因为wildfly通过了JavaEE7 TCK认证,即通过Servlet 3.1认证的Web服务器和容器,最新版本对servlet 4.0 也支持。
  2. Undertow的一个设计目的就是为了嵌入当作web服务器使用。当前,很多Java和其他语言的开源项目,都内嵌一个小型的web server,来提供服务能力,可以是输出html,也可以是输出REST方式的json文本。支持HTTP(s)协议,对于很多应用程序已能够满足需要;
  3. 默认情况下 Spring Cloud 使用 Tomcat 作为内嵌 Servlet 容器,可启动一个 Tomcat 的 Spring Boot 程序与一个 Undertow 的 Spring Boot 程序,通过 VisualVM 工具进行比较,可看到 Undertow 性能优于 Tomcat;
  4. 官网参考:http://undertow.io

Spring Boot项目中的引入方式 :

Spring Boot 内嵌 Jetty , Tomcat , Undertow , 默认是Tomcat

添加如下依赖

项目中Tomcat 服务器移除,新增了Untertow

<!--移除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>
<!--引入undertow-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

注意: undertow要引入要排在后面,否则会加载失败!

application.properties配置 :

与原来使用tomcat时配置无太大差别 , 将tomcat字段改为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

Undertow,Tomcat和Jetty服务器配置详解与性能测试

undertow,jetty和tomcat可以说是javaweb项目当下最火的三款服务器,tomcat是apache下的一款重量级的服务器,不用多说历史悠久,经得起实践的考验。然而:当下微服务兴起,spring boot ,spring cloud 越来越热的情况下,选择一款轻量级而性能优越的服务器是必要的选择。spring boot 完美集成了tomcat,jetty和undertow,本文将通过对jetty和undertow服务器的分析以及测试,来比较两款服务器的性能如何。

值得一提的是jetty和undertow都是基于NIO实现的高并发轻量级的服务器,支持servlet3.1和websocket。所以,有必要先了解下什么是NIO。

NIO(非阻塞式输入输出)
  • Channel
  • Selector
  • Buffer
  • Acceptor

Client和Server只向Buffer读写数据不关注数据的流向,数据通过Channel通道进行流转。而Selector是存在与服务端的,用于Channel的注册以此实现数据I/O操作。Acceptor负责接受所以的连接通道并且注册到Channel中。而整个过程客户端与服务端是非阻塞的也就是异步操作

结论 : 在并发量不高的情况下 , Tomcat与undertow的吞吐量区别不大 , 并发量高的情况下 , undertow的性能要优于Jetty与Tomcat。

自定义undertow对象模型0

自定义一个简单的内嵌WebServer的代码例子

public class HelloWorldServer {public static void main(final String[] args) {  Undertow server = Undertow.builder()  .addHttpListener(8080, "localhost")  .setHandler(new HttpHandler() { //设置HttpHandler回调方法  @Override  public void handleRequest(final HttpServerExchange exchange) throws Exception {  exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");  exchange.getResponseSender().send("Hello World");  }  }).build();  server.start();  }  
}  
  • 在undertow里,最主要的接口就是HttpHandler,和XNIO中的ChannelListener概念相似。HttpHandler也是只有一个方法handleRequest,参数是HttpServerExchange。
  • 这个程序内嵌一个Web服务器,打开本机的8080端口接受请求,当有浏览器连上之后,就发送一个纯文本"Hello World"。
  • HttpServerExchange携带所有的上下文状态信息,这个类也是目前undertow里面最长代码,有2000多行。同时包含了request和response的相关信息,可以通过getRequestHeaders()/getResponseHeaders()获取对应头部信息。
Undertow类是入口点

Undertow类是入口点,通过builder传入参数来构建Web容器。

  • 一种最简单的是使用API即io.undertow.Undertow;
  • 另外一种,是直接使用XNIO和Undertow侦听器类来组装服务器。若使用此法需要更多的代码,但是给出更多的灵活性。

大多数情况下,通过API构建就行了。

参考资料
  • https://www.cnblogs.com/maybo/p/7784687.html

  • https://blog.csdn.net/fayeyiwang/article/details/54729514

  • http://blog.hubwiz.com/2016/12/01/webserver-Undertow/

这篇关于【SpringBoot技术专题】「开发实战系列」Undertow web容器的入门实战及调优方案精讲的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/633500

相关文章

SpringBoot集成图片验证码框架easy-captcha的详细过程

《SpringBoot集成图片验证码框架easy-captcha的详细过程》本文介绍了如何将Easy-Captcha框架集成到SpringBoot项目中,实现图片验证码功能,Easy-Captcha是... 目录SpringBoot集成图片验证码框架easy-captcha一、引言二、依赖三、代码1. Ea

Springboot控制反转与Bean对象的方法

《Springboot控制反转与Bean对象的方法》文章介绍了SpringBoot中的控制反转(IoC)概念,描述了IoC容器如何管理Bean的生命周期和依赖关系,它详细讲解了Bean的注册过程,包括... 目录1 控制反转1.1 什么是控制反转1.2 SpringBoot中的控制反转2 Ioc容器对Bea

Vue中动态权限到按钮的完整实现方案详解

《Vue中动态权限到按钮的完整实现方案详解》这篇文章主要为大家详细介绍了Vue如何在现有方案的基础上加入对路由的增、删、改、查权限控制,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、数据库设计扩展1.1 修改路由表(routes)1.2 修改角色与路由权限表(role_routes)二、后端接口设计

mysql线上查询之前要性能调优的技巧及示例

《mysql线上查询之前要性能调优的技巧及示例》文章介绍了查询优化的几种方法,包括使用索引、避免不必要的列和行、有效的JOIN策略、子查询和派生表的优化、查询提示和优化器提示等,这些方法可以帮助提高数... 目录避免不必要的列和行使用有效的JOIN策略使用子查询和派生表时要小心使用查询提示和优化器提示其他常

Spring Cloud Hystrix原理与注意事项小结

《SpringCloudHystrix原理与注意事项小结》本文介绍了Hystrix的基本概念、工作原理以及其在实际开发中的应用方式,通过对Hystrix的深入学习,开发者可以在分布式系统中实现精细... 目录一、Spring Cloud Hystrix概述和设计目标(一)Spring Cloud Hystr

Spring Boot整合消息队列RabbitMQ的实现示例

《SpringBoot整合消息队列RabbitMQ的实现示例》本文主要介绍了SpringBoot整合消息队列RabbitMQ的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装Spring

springMVC返回Http响应的实现

《springMVC返回Http响应的实现》本文主要介绍了在SpringBoot中使用@Controller、@ResponseBody和@RestController注解进行HTTP响应返回的方法,... 目录一、返回页面二、@Controller和@ResponseBody与RestController

JAVA集成本地部署的DeepSeek的图文教程

《JAVA集成本地部署的DeepSeek的图文教程》本文主要介绍了JAVA集成本地部署的DeepSeek的图文教程,包含配置环境变量及下载DeepSeek-R1模型并启动,具有一定的参考价值,感兴趣的... 目录一、下载部署DeepSeek1.下载ollama2.下载DeepSeek-R1模型并启动 二、J

springboot rocketmq配置生产者和消息者的步骤

《springbootrocketmq配置生产者和消息者的步骤》本文介绍了如何在SpringBoot中集成RocketMQ,包括添加依赖、配置application.yml、创建生产者和消费者,并展... 目录1. 添加依赖2. 配置application.yml3. 创建生产者4. 创建消费者5. 使用在

Spring Retry 实现乐观锁重试实践记录

《SpringRetry实现乐观锁重试实践记录》本文介绍了在秒杀商品SKU表中使用乐观锁和MybatisPlus配置乐观锁的方法,并分析了测试环境和生产环境的隔离级别对乐观锁的影响,通过简单验证,... 目录一、场景分析 二、简单验证 2.1、可重复读 2.2、读已提交 三、最佳实践 3.1、配置重试模板