六個(gè)調(diào)用第三方接口遇到的大坑
今天的行情相信大家都感受到了,而面試也是越來(lái)越卷了,從技術(shù)八股卷到業(yè)務(wù)場(chǎng)景。今天呢,給大家?guī)?lái)了6個(gè)關(guān)于第三方接口調(diào)用相關(guān)的坑。問(wèn)題點(diǎn)不難,但是面試中突然問(wèn)到可能回答起來(lái)會(huì)有點(diǎn)懵,雖然都知道,但是不一定能回答好。
接下來(lái)呢,我會(huì)帶領(lǐng)大家整體的過(guò)一遍,大家刷到了就留個(gè)印象,后邊的筆記呢,我也準(zhǔn)備好了,評(píng)論區(qū)扣1然后私信我領(lǐng)取哈。大家也可以來(lái)吐槽吐槽自己遇到的一些坑,讓更多的小伙伴看到,一起交流。
閑話少說(shuō),接下來(lái)我們就進(jìn)入正題。
域名訪問(wèn)不到
首先第一個(gè)問(wèn)題,域名訪問(wèn)不通,一般我們?cè)诘谝淮螌?duì)接第三方平臺(tái)的API接口時(shí),可能會(huì)先通過(guò)瀏覽器或者postman調(diào)用一下。
對(duì)于這個(gè)點(diǎn)分兩個(gè)方面看,要么是我有問(wèn)題,要么是對(duì)方有問(wèn)題。
- 自己的網(wǎng)絡(luò)問(wèn)題
- 對(duì)方域名訪問(wèn)不通
- 對(duì)方DNS解析有問(wèn)題
- 對(duì)方服務(wù)未部署等等
- 對(duì)方設(shè)置了訪問(wèn)白名單
有可能你調(diào)用第三方平臺(tái)的API接口時(shí),他們的接口真的掛了,他們還不知道。還有一種最重要的情況,就是你的工作網(wǎng)絡(luò),是否可以訪問(wèn)這個(gè)外網(wǎng)的接口。
有些公司為了安全考慮,對(duì)內(nèi)網(wǎng)的開(kāi)發(fā)環(huán)境,是設(shè)置了防火墻的,或者有一些其他的限制,有些ip白名單,只能訪問(wèn)一些指定的外網(wǎng)接口。
如果你發(fā)現(xiàn)你訪問(wèn)的域名,在開(kāi)發(fā)環(huán)境訪問(wèn)不通,就要到運(yùn)維同學(xué)給你添加ip白名單了。
接口突然沒(méi)返回?cái)?shù)據(jù)
如果你調(diào)用第三方平臺(tái)的某個(gè)API接口查詢數(shù)據(jù),剛開(kāi)始一直都有數(shù)據(jù)返回。但突然某一天沒(méi)返回?cái)?shù)據(jù)了。但是該API接口能夠正常響應(yīng)。不要感到意外,有可能是第三方平臺(tái)將數(shù)據(jù)刪除了。
我對(duì)接完第三方平臺(tái)的API接口后,部署到了測(cè)試環(huán)境,發(fā)現(xiàn)他們接口竟然沒(méi)有返回?cái)?shù)據(jù),原因是他們有一天將測(cè)試環(huán)境的數(shù)據(jù)刪完了。因此,在部署測(cè)試環(huán)境之前,要先跟對(duì)方溝通,要用哪些數(shù)據(jù)測(cè)試,不能刪除。
還有一點(diǎn),在我們自己程序中,我們永遠(yuǎn)不要相信三方平臺(tái)的數(shù)據(jù),如果出錯(cuò)了,我們要寫(xiě)容錯(cuò)策略。不能因?yàn)槿降腻e(cuò)誤,把自己系統(tǒng)給拖死。
token失效
有些平臺(tái)的API接口在請(qǐng)求之前,先要調(diào)用另外一個(gè)API接口獲取token,然后再header中攜帶該token信息才能訪問(wèn)其他的業(yè)務(wù)API接口。其實(shí)大多數(shù)我們自己的系統(tǒng)也是這么設(shè)計(jì)的。
在獲取token的API接口中,我們需要傳入賬號(hào)、密碼和密鑰等信息。每個(gè)接口對(duì)接方,這些信息都不一樣。
我們?cè)谡?qǐng)求其他的API接口之前,每次都實(shí)時(shí)調(diào)用一次獲取token的接口獲取token?還是請(qǐng)求一次token,將其緩存到redis中,后面直接從redis獲取數(shù)據(jù)呢?
很顯然我們更傾向于后者,因?yàn)槿绻看握?qǐng)求其他的API接口之前,都實(shí)時(shí)調(diào)用一次獲取token的接口獲取token,這樣每次都會(huì)請(qǐng)求兩次接口,性能上會(huì)有一些影響。
如果將請(qǐng)求的token,保存到redis,又會(huì)出現(xiàn)另外一個(gè)問(wèn)題:token失效的問(wèn)題。
我們調(diào)用第三方平臺(tái)獲取token的接口獲取到的token,一般都有個(gè)有效期,比如:1天,1個(gè)月等。
在有效期內(nèi),該API接口能夠正常訪問(wèn)。如果超過(guò)了token的有效期,則該API接口不允許訪問(wèn)。
好辦,我們把redis的失效時(shí)間設(shè)置成跟token的有效期一樣不就OK了?
想法是不錯(cuò),但是有問(wèn)題。
你咋保證,你們系統(tǒng)的服務(wù)器時(shí)間,跟第三方平臺(tái)的服務(wù)器時(shí)間一模一樣?
我之前遇到過(guò)某大廠,提供了獲取token接口,在30天內(nèi)發(fā)起請(qǐng)求,每次都返回相同的token值。如果超過(guò)了30天,則返回一個(gè)新的。
有可能出現(xiàn)這種情況,你們系統(tǒng)的服務(wù)器時(shí)間要快一些,第三方平臺(tái)的時(shí)間要慢一些。結(jié)果到了30天,你們系統(tǒng)調(diào)用第三方平臺(tái)的獲取token接口獲取到了token還是老的token,更新到redis中了。
過(guò)一段時(shí)間,token失效了,你們系統(tǒng)還是用老的token訪問(wèn)第三方平臺(tái)的其他API接口,一直都返回失敗。但獲取新的token卻要等30天,這個(gè)時(shí)間太漫長(zhǎng)了。
對(duì)于具體的錯(cuò)誤碼要設(shè)計(jì)重試機(jī)制:
為了解決這個(gè)問(wèn)題,需要捕獲token失效的異常。如果在調(diào)用其他的API接口是發(fā)現(xiàn)token失效了,馬上請(qǐng)求一次獲取token接口,將新的token立刻更新到redis中。
這樣基本可以解決token失效問(wèn)題,也能盡可能保證訪問(wèn)其他接口的穩(wěn)定性和性能。
接口超時(shí)
系統(tǒng)上線之后,調(diào)用第三方API接口,最容易出現(xiàn)的問(wèn)題,應(yīng)該是接口超時(shí)問(wèn)題了。系統(tǒng)到外部系統(tǒng)之間,有一條很復(fù)雜的鏈路,中間有很多環(huán)節(jié)出現(xiàn)問(wèn)題,都可能影響API接口的相應(yīng)時(shí)間。
這點(diǎn)很尷尬,別人的系統(tǒng),咱們控制不了,你說(shuō)讓別人優(yōu)化系統(tǒng),人家立項(xiàng)調(diào)整上線估計(jì)就半個(gè)月,這還是情況好的,拖個(gè)半年的都有。別人體驗(yàn)的是你的系統(tǒng),速度慢一點(diǎn)還能說(shuō)得過(guò)去,要是老是超時(shí)失敗反饋到用戶層面。用戶第一個(gè)找的就是你。。。。
作為API接口的調(diào)用方,面對(duì)第三方API接口超時(shí)問(wèn)題,除了給他們反饋問(wèn)題,優(yōu)化接口性能之外。
我們更有效的方式,可能是增加接口調(diào)用的失敗重試機(jī)制。
例如:
- 如果接口調(diào)用失敗,則程序會(huì)立刻自動(dòng)重試3次。
- 如果重試之后成功了,則該API接口調(diào)用成功。
- 如果重試3次之后還是失敗,則該API接口調(diào)用失敗。
偷偷改參數(shù)了
我之前調(diào)用過(guò)某平臺(tái)的API接口獲取指標(biāo)的狀態(tài),之前根據(jù)雙方約定的狀態(tài)有:正常和禁用 兩種。
然后將狀態(tài)更新到我們的指標(biāo)表中。后來(lái),雙方系統(tǒng)上線運(yùn)行了好幾個(gè)月。突然有一天,用戶反饋說(shuō)某一條數(shù)據(jù)明明刪除了,為什么在頁(yè)面上還是可以查到。此時(shí),我查我們這邊的指標(biāo)表,發(fā)現(xiàn)狀態(tài)是正常的。
然后查看調(diào)用該平臺(tái)的API接口日志,發(fā)現(xiàn)返回的該指標(biāo)的狀態(tài)是:下架。
什么鬼,心里已經(jīng)問(wèn)候了八百遍了。。。
跟該平臺(tái)的開(kāi)發(fā)人員溝通后,發(fā)現(xiàn)他們改了狀態(tài)的枚舉,增加了:上架、下架等多個(gè)值,而且沒(méi)有通知我們。這就坑了。我們這邊的代碼中判斷,如果狀態(tài)非禁用狀態(tài),都認(rèn)為是正常狀態(tài)。
而下架狀態(tài),自動(dòng)被判斷為正常狀態(tài)。經(jīng)過(guò)跟對(duì)方溝通后,他們確認(rèn)下架狀態(tài),是非正常狀態(tài),不應(yīng)該顯示指標(biāo)。他們改了數(shù)據(jù),臨時(shí)解決了該指標(biāo)的問(wèn)題。后來(lái),他們按接口文檔又改回了之前的狀態(tài)枚舉值。
這里還有一種其他的方案,把枚舉信息也通過(guò)一個(gè)接口返回,然后做展示,這樣就能避免前面提到的問(wèn)題了。
接口時(shí)好時(shí)壞
不知道你在調(diào)用第三方接口時(shí),有沒(méi)有遇到過(guò)接口時(shí)好時(shí)壞的情況。5分鐘前,該接口還能正常返回?cái)?shù)據(jù)。
5分鐘后,該接口返回503不可用。又過(guò)了幾分鐘,該接口又能正常返回?cái)?shù)據(jù)了。
可能情況:
- 這種情況大概率是第三方平臺(tái)在重啟服務(wù),在重啟的過(guò)程中,可能會(huì)出現(xiàn)服務(wù)暫時(shí)不可用的情況。
- 第三方接口部署了多個(gè)服務(wù)節(jié)點(diǎn),有一部分服務(wù)節(jié)點(diǎn)掛了。也會(huì)導(dǎo)致請(qǐng)求第三方接口時(shí),返回值時(shí)好時(shí)壞的情況。
- 網(wǎng)關(guān)的配置沒(méi)有及時(shí)更新,沒(méi)有把已經(jīng)下線的服務(wù)剔除掉。這樣用戶請(qǐng)求經(jīng)過(guò)網(wǎng)關(guān)時(shí),網(wǎng)關(guān)轉(zhuǎn)發(fā)到了已經(jīng)下線的服務(wù),導(dǎo)致服務(wù)不可用。網(wǎng)關(guān)轉(zhuǎn)發(fā)請(qǐng)求到正常的服務(wù),該服務(wù)能夠正常返回。
如果遇到該問(wèn)題,要盡快將問(wèn)題反饋給第三方平臺(tái),然后增加接口失敗重試機(jī)制。