asp 企業(yè)網(wǎng)站百度推廣退款電話
問題背景:
客戶的問題是部分訂單收不到回調(diào),部分訂單能正常收到回調(diào),而回調(diào)的字段其實都是一樣的,這不是很奇怪么?
分析過程:
網(wǎng)絡(luò)拓撲大概如下圖
找到一筆回調(diào)異常的訂單,在阿里云日志服務(wù)器搜索相應(yīng)關(guān)鍵字,日志顯示400 bad request。
????????從字面上好理解,可能是nginx等代理層因為客戶端請求參數(shù)不合法返回的?那接下來需要先看下接收回調(diào)的負載nginx的日志。
????????經(jīng)過溝通通過遠程客戶的內(nèi)網(wǎng)服務(wù)器【包括負載層,應(yīng)用層(服務(wù)器上部署的java服務(wù)是我們提供的)】,但從云端發(fā)起該訂單的回調(diào)時(也就是界面點擊重試補償回調(diào),底層觸發(fā)客戶回調(diào)地址http請求),并未看到客戶內(nèi)網(wǎng)nginx的accesslog有請求日志,errorlog也沒有;
????????而其他回調(diào)正常的訂單是有accesslog日志的,可以看到回調(diào)的報文json串。nginx沒日志,難道nginx層上層還有其他代理或防火墻攔截了?但同事和醫(yī)院網(wǎng)絡(luò)管理員聯(lián)系也沒有其他代理了。那是為什么?
????????我想到云端服務(wù)器上直接觸發(fā)下http請求試試,拼回調(diào)字段json串,在云端的回調(diào)服務(wù)機器上curl發(fā)起請求? ,結(jié)果返回還是400 badrequest(和生產(chǎn)阿里云上400日志一致)
????????再到客戶內(nèi)網(wǎng)的負載層直接內(nèi)網(wǎng)ip訪問試試呢,結(jié)果在對方服務(wù)器上直接內(nèi)網(wǎng)curl? 返回了正常的json,只不過是一個錯誤碼的json,如下圖所示。
????????本想著內(nèi)網(wǎng)curl如果正常,外網(wǎng)400的話就可以說明還是nginx上層哪兒有攔截,結(jié)果內(nèi)網(wǎng)回調(diào)結(jié)果通是通,但結(jié)果不是success。
????????為什么外網(wǎng)不是和內(nèi)網(wǎng)一樣返回 {"status":""}這種格式,而是返回了400?這個暫擱置,先看看內(nèi)網(wǎng)為啥報參數(shù)不合法。這個錯誤碼搜了下代碼,是一個自定義的全局異常類,當(dāng)controller層拋出異常后,由這個全局異常類將異常轉(zhuǎn)換成錯誤碼輸出。
????????參數(shù)為什么不合法呢,搜了下這個IllegalArgumentException異常,大概的意思就是傳入的參數(shù)和controller里定義的requestbody對應(yīng)的dto可能字段類型不對應(yīng),但怎么會不對應(yīng)呢。難道我傳的字段不對?想起了我的curl命令是這么寫的
curl -XPOST -d '請求json串' http://內(nèi)網(wǎng)nginxip/接口url,會不會是因為沒有指定請求頭是json的原因?qū)е耲son參數(shù)沒有對齊呢,本著試試看的態(tài)度,加上json的請求頭,再次觸發(fā)curl -XPOST -H 'Content-Type:application/json' -d '請求json串' http://內(nèi)網(wǎng)nginxip/接口url 后確實正常了!
????????再回到云端服務(wù)器,同樣加上請求頭再次curl也正常了。
遺留問題:
????????但有個遺留問題并未想明白。不加請求頭之前是400 badrequest 但這會兒我又試了下,變成和內(nèi)網(wǎng)請求返回一樣的錯誤碼了?這才是正常的!但為什么之前是400 如上面第三個圖。
????????這是什么神奇操作,期間我一直都是探測接口,并未調(diào)整nginx什么配置,怎么就又是這個結(jié)果?有神力?不可能,寫代碼的人都是很務(wù)實和客觀的,咱不相信那個,肯定還是誰動了啥?不然為啥之前一直訂單重試回調(diào)(因為回調(diào)是mq消費,階梯式間隔重試16次,11日的日志還顯示一直都是400 bad request,今天怎么就好了呢,雖然問題今天最終解決了,回調(diào)都正常了,但誰解決的呢,滿心疑惑...)