一、問(wèn)題背景
服務(wù)器和調(diào)用方都是Java程序,SpringBoot框架。
服務(wù)器是集群部署,上了新功能,負(fù)載均衡使用的F5。
調(diào)用方----------->F5---------->單臺(tái)服務(wù)器
新功能是,返回文件的同時(shí),將文件信息放在Http的Header里面。
二、原因分析
因?yàn)閲?guó)內(nèi)外網(wǎng)上都沒(méi)有類(lèi)似的報(bào)錯(cuò),所以解決起來(lái)耗費(fèi)時(shí)間有點(diǎn)久,特記錄下來(lái)。
服務(wù)端報(bào)錯(cuò)如下:
com.ibm.wsspi.webcontainer.ClosedConnectionException: OutputStream encountered error during write
at com.ibm.ws.webcontainer.channel.WCCByteBufferOutputStream.write(WCCByteBufferOutputStream.java:188) ~[com.ibm.ws.webcontainer.jar:na]
at ...(手打的后面就不寫(xiě)了)
Caused by: java.io.IOException: Async IO operation failed (2), reason: RC: 104 Connection reset by peer
at com.ibm.io.async.AsyncLibrary$IOExceptionCache.<init>(AsyncLibrary.java:924) ~[com.ibm.ws.runtime.jar:na]
at com.ibm.io.async.AsyncLibrary$IOExceptionCache.get(AsyncLibrary.java:937) ~[com.ibm.ws.runtime.jar:na]
at com.ibm.io.async.AsyncLibrary.getIOException(AsyncLibrary.java:951) ~[com.ibm.ws.runtime.jar:na]
at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:213) [com.ibm.ws.runtime.jar:na]
... 3 common frames omitted
調(diào)用端報(bào)錯(cuò)如下:
Connection reset; nested exception is java.net.SocketException: Connection reset
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:748)
at ...
Caused by: java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:210)
at ...
三、問(wèn)題定位
通過(guò)查看WebSphere控制臺(tái)配置,以及F5抓包,最后定位到問(wèn)題是由于:F5負(fù)載均衡對(duì)Http的響應(yīng)頭(Header)有32KB大小限制,但WebSphere控制臺(tái)沒(méi)有大小限制(可能有,但是沒(méi)觸發(fā)上限,不清楚),導(dǎo)致響應(yīng)被F5主動(dòng)中斷。
四、解決方案
1、請(qǐng)求不經(jīng)過(guò)F5,我們的做法是直接通過(guò)應(yīng)用單點(diǎn)進(jìn)行調(diào)用,因?yàn)樾枨筇厥猓@套應(yīng)用不需要HA,所以可以簡(jiǎn)單粗暴這么做。
2、修改F5負(fù)載均衡配置(不確定能否修改)、或換其他負(fù)載均衡,Nginx等。
3、修改程序,將“下載文件實(shí)體”和“獲取文件信息”拆成兩個(gè)接口,不要將文件信息放在請(qǐng)求頭,放到請(qǐng)求體,即可。