当前位置:   article > 正文

springboot中用undertow踩坑记_spring-boot-starter-undertow

spring-boot-starter-undertow

场景:准备基于springboot的静态资源实现mp4资源的播放,不同版本的springboot下效果不一样,可能导致正常的资源不可用。本文测试了几个版本,也针对这种情况提出了解决建议,希望对你的工作有所帮助。

 

众所周知,springboot内置类web中间件,将web服务器管理权交给了容器。在使用时只需要进行申明即可。

本文实验的环境如下:

windows7+JDK1.8+Eclipse+Maven3.3.9+SpringBoot2.2.x+Undertow2.2.x

一、环境准备

第一步、配置maven环境

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.yelang</groupId>
  6. <artifactId>undertowdemo</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <name>Undertow测试</name>
  9. <description>Undertow中间件测试</description>
  10. <parent>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-starter-parent</artifactId>
  13. <version>2.2.10.RELEASE</version>
  14. <relativePath />
  15. </parent>
  16. <dependencies>
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-web</artifactId>
  20. <!-- 移除掉默认支持的 Tomcat -->
  21. <exclusions>
  22. <exclusion>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-starter-tomcat</artifactId>
  25. </exclusion>
  26. </exclusions>
  27. </dependency>
  28. <!-- 添加 Undertow 容器 -->
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-undertow</artifactId>
  32. </dependency>
  33. </dependencies>
  34. </project>

第二步、配置申明

  1. # 开发环境配置
  2. server:
  3. # 服务器的HTTP端口,默认为8080
  4. port: 8080
  5. servlet:
  6. # 应用的访问路径
  7. context-path: /
  8. # undertow 配置
  9. undertow:
  10. # HTTP post内容的最大大小。当值为-1时,默认值为大小是无限的
  11. max-http-post-size: -1
  12. # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
  13. # 每块buffer的空间大小,越小的空间被利用越充分
  14. buffer-size: 512
  15. # 是否分配的直接内存
  16. direct-buffers: true
  17. threads:
  18. # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
  19. io: 8
  20. # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
  21. worker: 256
  22. # # tomcat 配置
  23. # tomcat:
  24. # # tomcat的URI编码
  25. # uri-encoding: UTF-8
  26. # # tomcat最大线程数,默认为200
  27. # max-threads: 500
  28. # # Tomcat启动初始化的线程数,默认值25
  29. # min-spare-threads: 30

第三步、静态资源映射

  1. package com.yelang.config;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
  4. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  5. /**
  6. * 通用配置
  7. * @author wzh
  8. */
  9. @Configuration
  10. public class ResourcesConfig implements WebMvcConfigurer {
  11. @Override
  12. public void addResourceHandlers(ResourceHandlerRegistry registry) {
  13. /** 本地文件上传路径 */
  14. registry.addResourceHandler("/profile/**").addResourceLocations("file:D:/wzh/uploadPath/");
  15. /** swagger配置 */
  16. registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
  17. registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
  18. }
  19. }

以上代码标注了系统对外开放的静态资源,正常情况下,将资源拷贝到相应的目录下,就可以访问相应资源。

http://localhost:8080/profile/2.mp4

图片

二、使用springboot2.2.11、springboot2.2.12、springboot2.2.13这三个版本正常mp4也会无法加载。估计是这几个版本存在一些设置。

三、如果是生产采用了上述几个版本的sringboot,如果需要对mp4等资源进行预览查看的话。

建议如下:第一、调整springboot的版本,调整到支持的版本。第二、不再使用profile的方式提供视频资源,采用nginx等组件。第三、采用第三方文件系统。第四种、将undertow容器替换成tomcat等其他容器也可以。

小调查:在你的生产环境中,是使用内置容器吗?使用undertow这种nio的容器的有多少?欢迎大家反馈。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/102544
推荐阅读
相关标签
  

闽ICP备14008679号