服務(wù)之間遠(yuǎn)程Feign調(diào)用,出現(xiàn)參數(shù)丟失
最近有同事反映生產(chǎn)上,服務(wù)與服務(wù)之間遠(yuǎn)程調(diào)用,偶爾會(huì)出現(xiàn) 參數(shù)丟失 的情況。但是,不是所有服務(wù)之間都會(huì)出現(xiàn)參數(shù)丟失,是固定有2個(gè)服務(wù)之間有這種情況。之前也發(fā)現(xiàn)過(guò)有這種情況出現(xiàn),還以為是真的沒傳參數(shù),這一次大家合力一起研究了下,發(fā)現(xiàn)是偶發(fā)情況。
打斷點(diǎn),壓力測(cè),網(wǎng)上尋求答案。終于找到了問(wèn)題所在,先貼個(gè)大佬的解釋 偶現(xiàn)的MissingServletRequestParameterException,誰(shuí)動(dòng)了我的參數(shù)?,解析得很詳細(xì)。一查發(fā)現(xiàn),果然,這兩個(gè)出現(xiàn)參數(shù)丟失的服務(wù)里,有在異步方法中傳遞使用 HttpServletRequest 的情況。
總結(jié)下:
在Tomcat中,Request以及Response對(duì)象是會(huì)被 循環(huán)使用 的。如果在 異步 方法里(比如使用 @Async等)使用 HtttpServletRequest 對(duì)象,有可能會(huì)導(dǎo)致請(qǐng)求參數(shù)不被解析,從而報(bào)錯(cuò) org.springframework.web.bind.MissingServletRequestParameterException: Required long parameter 'xxx' is not present。
所以,我們切記在異步方法中 不要傳遞使用 HttpServletRequest。
與其花許多時(shí)間和精力去鑿許多淺井,不如花同樣的時(shí)間和精力去鑿一口深井。-- 煙沙九洲
?
浙公網(wǎng)安備 33010602011771號(hào)