您好,登錄后才能下訂單哦!
這篇“springboot中用undertow的坑怎么解決”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“springboot中用undertow的坑怎么解決”文章吧。
場景:準(zhǔn)備基于springboot的靜態(tài)資源實(shí)現(xiàn)mp4資源的播放,不同版本的springboot下效果不一樣,可能導(dǎo)致正常的資源不可用。本文測試了幾個(gè)版本,也針對(duì)這種情況提出了解決建議,希望對(duì)你的工作有所幫助。
眾所周知,springboot內(nèi)置類web中間件,將web服務(wù)器管理權(quán)交給了容器。在使用時(shí)只需要進(jìn)行申明即可。
windows7+JDK1.8+Eclipse+Maven3.3.9+SpringBoot2.2.x+Undertow2.2.x
第一步、配置maven環(huán)境
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.yelang</groupId> <artifactId>undertowdemo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>Undertow測試</name> <description>Undertow中間件測試</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.10.RELEASE</version> <relativePath /> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!-- 移除掉默認(rèn)支持的 Tomcat --> <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> </dependencies> </project>
第二步、配置申明
# 開發(fā)環(huán)境配置 server: # 服務(wù)器的HTTP端口,默認(rèn)為8080 port: 8080 servlet: # 應(yīng)用的訪問路徑 context-path: / # undertow 配置 undertow: # HTTP post內(nèi)容的最大大小。當(dāng)值為-1時(shí),默認(rèn)值為大小是無限的 max-http-post-size: -1 # 以下的配置會(huì)影響buffer,這些buffer會(huì)用于服務(wù)器連接的IO操作,有點(diǎn)類似netty的池化內(nèi)存管理 # 每塊buffer的空間大小,越小的空間被利用越充分 buffer-size: 512 # 是否分配的直接內(nèi)存 direct-buffers: true threads: # 設(shè)置IO線程數(shù), 它主要執(zhí)行非阻塞的任務(wù),它們會(huì)負(fù)責(zé)多個(gè)連接, 默認(rèn)設(shè)置每個(gè)CPU核心一個(gè)線程 io: 8 # 阻塞任務(wù)線程池, 當(dāng)執(zhí)行類似servlet請(qǐng)求阻塞操作, undertow會(huì)從這個(gè)線程池中取得線程,它的值設(shè)置取決于系統(tǒng)的負(fù)載 worker: 256 # # tomcat 配置 # tomcat: # # tomcat的URI編碼 # uri-encoding: UTF-8 # # tomcat最大線程數(shù),默認(rèn)為200 # max-threads: 500 # # Tomcat啟動(dòng)初始化的線程數(shù),默認(rèn)值25 # min-spare-threads: 30
第三步、靜態(tài)資源映射
package com.yelang.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** * 通用配置 * @author wzh */ @Configuration public class ResourcesConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { /** 本地文件上傳路徑 */ registry.addResourceHandler("/profile/**").addResourceLocations("file:D:/wzh/uploadPath/"); /** swagger配置 */ registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); } }
以上代碼標(biāo)注了系統(tǒng)對(duì)外開放的靜態(tài)資源,正常情況下,將資源拷貝到相應(yīng)的目錄下,就可以訪問相應(yīng)資源。
http://localhost:8080/profile/2.mp4
這三個(gè)版本正常mp4也會(huì)無法加載。估計(jì)是這幾個(gè)版本存在一些設(shè)置。
如果需要對(duì)mp4等資源進(jìn)行預(yù)覽查看的話。
建議如下:第一、調(diào)整springboot的版本,調(diào)整到支持的版本。第二、不再使用profile的方式提供視頻資源,采用nginx等組件。第三、采用第三方文件系統(tǒng)。第四種、將undertow容器替換成tomcat等其他容器也可以。
小調(diào)查:在你的生產(chǎn)環(huán)境中,是使用內(nèi)置容器嗎?使用undertow這種nio的容器的有多少?
在SpringBoot框架中,我們使用最多的是Tomcat,這是SpringBoot默認(rèn)的容器技術(shù),而且是內(nèi)嵌式的Tomcat。
同時(shí),SpringBoot也支持Undertow容器,我們可以很方便的用Undertow替換Tomcat,而Undertow的性能和內(nèi)存使用方面都優(yōu)于Tomcat,那我們?nèi)绾问褂肬ndertow技術(shù)呢?本文將為大家細(xì)細(xì)講解。
SpringBoot可以說是目前最火的Java Web框架了。它將開發(fā)者從繁重的xml解救了出來,讓開發(fā)者在幾分鐘內(nèi)就可以創(chuàng)建一個(gè)完整的Web服務(wù),極大的提高了開發(fā)者的工作效率。Web容器技術(shù)是Web項(xiàng)目必不可少的組成部分,因?yàn)槿蜽eb項(xiàng)目都要借助容器技術(shù)來運(yùn)行起來。
在SpringBoot框架中,我們使用最多的是Tomcat,這是SpringBoot默認(rèn)的容器技術(shù),而且是內(nèi)嵌式的Tomcat。
對(duì)于Tomcat技術(shù),Java程序員應(yīng)該都非常熟悉,它是Web應(yīng)用最常用的容器技術(shù)。我們最早的開發(fā)的項(xiàng)目基本都是部署在Tomcat下運(yùn)行,那除了Tomcat容器,SpringBoot中我們還可以使用什么容器技術(shù)呢?沒錯(cuò),就是題目中的Undertow容器技術(shù)。SrpingBoot已經(jīng)完全繼承了Undertow技術(shù),我們只需要引入U(xiǎn)ndertow的依賴即可,如下圖所示。
配置好以后,我們啟動(dòng)應(yīng)用程序,發(fā)現(xiàn)容器已經(jīng)替換為Undertow。
那我們?yōu)槭裁葱枰鎿QTomcat為Undertow技術(shù)呢?
Tomcat是Apache基金下的一個(gè)輕量級(jí)的Servlet容器,支持Servlet和JSP。Tomcat具有Web服務(wù)器特有的功能,包括 Tomcat管理和控制平臺(tái)、安全局管理和Tomcat閥等。Tomcat本身包含了HTTP服務(wù)器,因此也可以視作單獨(dú)的Web服務(wù)器。
但是,Tomcat和ApacheHTTP服務(wù)器不是一個(gè)東西,ApacheHTTP服務(wù)器是用C語言實(shí)現(xiàn)的HTTP Web服務(wù)器。Tomcat是完全免費(fèi)的,深受開發(fā)者的喜愛。
Undertow是Red Hat公司的開源產(chǎn)品, 它完全采用Java語言開發(fā),是一款靈活的高性能Web服務(wù)器,支持阻塞IO和非阻塞IO。由于Undertow采用Java語言開發(fā),可以直接嵌入到Java項(xiàng)目中使用。同時(shí), Undertow完全支持Servlet和Web Socket,在高并發(fā)情況下表現(xiàn)非常出色。
我們?cè)谙嗤瑱C(jī)器配置下壓測Tomcat和Undertow,得到的測試結(jié)果如下所示:
QPS測試結(jié)果對(duì)比:
Tomcat
Undertow
內(nèi)存使用對(duì)比:
Tomcat
Undertow
通過測試發(fā)現(xiàn),在高并發(fā)系統(tǒng)中,Tomcat相對(duì)來說比較弱。在相同的機(jī)器配置下,模擬相等的請(qǐng)求數(shù),Undertow在性能和內(nèi)存使用方面都是最優(yōu)的。并且Undertow新版本默認(rèn)使用持久連接,這將會(huì)進(jìn)一步提高它的并發(fā)吞吐能力。所以,如果是高并發(fā)的業(yè)務(wù)系統(tǒng),Undertow是最佳選擇。
以上就是關(guān)于“springboot中用undertow的坑怎么解決”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。