MAVEN3.9.x中301問(wèn)題及解決方法
本文主要是針對(duì)“構(gòu)建加速”需求交付過(guò)程中,針對(duì)maven depoy “301”響應(yīng)碼的現(xiàn)象分析、原因查找、解決方案、技術(shù)改造及驗(yàn)證的過(guò)程。改造之后,支持用戶(hù)基于mvnd的構(gòu)建方式,提升代碼構(gòu)建速度。
01、背景
為了提升maven客戶(hù)端的構(gòu)建速度,經(jīng)過(guò)調(diào)研,了解到mvnd存在以下技術(shù)特性:
- GraalVM的使用,mvnd使用GraalVM替代了傳統(tǒng)的JVM,使得啟動(dòng)速度更快,占用的內(nèi)存更少。GraalVM是一個(gè)高性能的運(yùn)行時(shí),它能夠快速啟動(dòng),并且具有較低的內(nèi)存占用。這意味著mvnd在啟動(dòng)和運(yùn)行時(shí)的性能都優(yōu)于使用傳統(tǒng)JVM的mvn。
- 緩存機(jī)制,mvnd對(duì)于Maven插件的緩存機(jī)制也有所改進(jìn)。在mvn構(gòu)建過(guò)程中,每次構(gòu)建都需要重新加載和編譯所有的Maven插件。而在mvnd中,這些插件被緩存在多個(gè)構(gòu)建中,只有當(dāng)插件的版本發(fā)生變化時(shí),才會(huì)重新加載和編譯。
基于以上優(yōu)點(diǎn),為支持mvnd功能,實(shí)現(xiàn)加速構(gòu)建能力,用戶(hù)需要將maven版本從3.6.x版本升級(jí)到3.9.x版本,用戶(hù)升級(jí)之后在提交構(gòu)建二進(jìn)制制品過(guò)程當(dāng)中發(fā)現(xiàn)maven 3.9.x版本的兼容性問(wèn)題。后續(xù)就兼容性問(wèn)題進(jìn)行識(shí)別改造,完成需求交付。
02、現(xiàn)象
基于maven3.6.x版本執(zhí)行deploy動(dòng)作,所構(gòu)建制品可以正常發(fā)布到nexus倉(cāng)庫(kù)。
基于maven3.9.x版本提交所構(gòu)建制品失敗,收到nexus服務(wù)“301”返回碼。
03、分析原因
Figure 1 DEPLOY請(qǐng)求示意
用戶(hù)在本地執(zhí)行“mvn deploy” 命令之后,本地開(kāi)始編譯構(gòu)建制品,構(gòu)建完成之后開(kāi)始交付所構(gòu)建制品部署到nexus服務(wù),在部署到nexus之前經(jīng)由nginx進(jìn)行代理,之后上傳到nexus倉(cāng)庫(kù)。
Nginx.conf 配置片段
用戶(hù)本地pom.xml配置片段
早期版本根據(jù)護(hù)網(wǎng)安全需求,需要把應(yīng)用的原始請(qǐng)求資源路徑屏蔽掉,在nginx.conf層面進(jìn)行轉(zhuǎn)發(fā)配置,針對(duì)用戶(hù)在pomxml當(dāng)中配置的屏蔽原始路徑之后的倉(cāng)庫(kù)地址進(jìn)行重定向。
針對(duì)maven3.6.x版本的交互過(guò)程進(jìn)行分析
- 在maven3.6.x版本的場(chǎng)景下,執(zhí)行DEPLOY,觀察到第一次請(qǐng)求打到nginx之后,nginx響應(yīng)301永久重定向,并且在響應(yīng)頭location字段返回新的URL地址;
- Maven3.6.x 拿到301重定向,根據(jù)location的地址,重新發(fā)起請(qǐng)求新的URL;
- 后續(xù)交互過(guò)程以相同方式完成交互,直至deploy完成。
針對(duì)maven3.9.x版本的交互過(guò)程進(jìn)行分析
- 在maven3.9.x場(chǎng)景下,執(zhí)行deploy命令,請(qǐng)求到達(dá)nginx之后,給出相同的301響應(yīng),并且在響應(yīng)頭的location當(dāng)中指定重定向之后的URL;
- Maven在拿到重定向響應(yīng)之后,忽略301,直接開(kāi)啟下一個(gè)步驟的請(qǐng)求;
- 在下一個(gè)步驟的交互里面,nginx濤聲依舊……,然后就是我們?cè)赾md上面看到的最終的失敗的執(zhí)行結(jié)果。
04、解決方案及驗(yàn)證
根據(jù)上面現(xiàn)象分析,經(jīng)過(guò)驗(yàn)證發(fā)現(xiàn)是maven 3.9版本不處理301重定向,根據(jù)這個(gè)特性,針對(duì)nginx進(jìn)行改造:
upstream nexus_server { server xxx.xxx.xxx.xxx:xxx max_fails=3 fail_timeout=900s weight=10; } server { listen 80; server_name test.repo.htsc; access_log /var/log/nginx/access.log ; error_log /var/log/nginx/access.log ; location / { # 摘除/nexus或/nexus/content rewrite ^/nexus/content/(.*)$ /$1 last; rewrite ^/nexus/(.*)$ /$1 last; # 將repositories替換為repository rewrite ^/(.*)repositories(.*)$ /$1repository$2 last; …… expires -1; } }
針對(duì)nginx.conf進(jìn)行改造,將rewrite 中permannet 永久重定向調(diào)整為last,在重寫(xiě)URI之后再次進(jìn)入locate過(guò)濾,直至proxy_pass,將原來(lái)依賴(lài)客戶(hù)端處理301的邏輯調(diào)整為nginx自身完成URI轉(zhuǎn)換和請(qǐng)求處理,改造之后既減少網(wǎng)絡(luò)IO,每個(gè)請(qǐng)求省了一次交互,又提升了用戶(hù)的使用體驗(yàn),提升了deploy的效率。
05、結(jié)語(yǔ)
本次改造針對(duì)若干主要的用戶(hù)使用deploy的存量和增量場(chǎng)景進(jìn)行兼容,實(shí)現(xiàn)mvnd命令的支持,從IO角度的來(lái)說(shuō),相比于改造前,省去了重定向請(qǐng)求的網(wǎng)絡(luò)開(kāi)銷(xiāo),客戶(hù)端請(qǐng)求次數(shù)減半;從構(gòu)建加速的角度來(lái)說(shuō),基于maven3.9.x mvnd方式構(gòu)建提升構(gòu)建速度提升10%-20%;有效實(shí)現(xiàn)構(gòu)建環(huán)節(jié)的加速增效。
到此這篇關(guān)于MAVEN3.9.x中301問(wèn)題及解決方法的文章就介紹到這了,更多相關(guān)MAVEN3.9.x 301問(wèn)題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot整合ip2region獲取客戶(hù)端IP地理位置信息
在我們?nèi)粘EB開(kāi)發(fā)工作中,經(jīng)常會(huì)有需要獲取客戶(hù)端地理位置的需求,本文主要介紹了SpringBoot整合ip2region獲取客戶(hù)端IP地理位置信息,具有一定的參考價(jià)值,感興趣的可以了解一下2024-08-08Java實(shí)現(xiàn)圖書(shū)館借閱系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)圖書(shū)館借閱系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Java實(shí)現(xiàn)兩人五子棋游戲(五) 判斷是否有一方勝出
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)兩人五子棋游戲,判斷是否有一方勝出,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03Java使用Arrays.asList報(bào)UnsupportedOperationException的解決
這篇文章主要介紹了Java使用Arrays.asList報(bào)UnsupportedOperationException的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Java中CAS機(jī)制實(shí)現(xiàn)方法詳解
傳統(tǒng)的并發(fā)控制手段如synchronized和ReentrantLock雖有效防止資源競(jìng)爭(zhēng),卻可能引起性能開(kāi)銷(xiāo),相比之下,CAS(CompareAndSwap)提供一種輕量級(jí)的樂(lè)觀鎖策略,通過(guò)硬件級(jí)別的原子指令實(shí)現(xiàn)無(wú)鎖并發(fā),提高性能,需要的朋友可以參考下2024-09-09