1、封裝統(tǒng)一的http請求工具類
集成apache httpclient開源框架响牛;
集成okhttp開源框架妓湘;
2查蓉、打印請求接口入?yún)ⅰ⒊鰠裉⒑臅r日志(可以在請求工具類統(tǒng)一打印)
在請求工具類統(tǒng)一打印豌研,例如:
long start = System.currentTimeMillis();
// todo 請求接口返回result結(jié)果
looinfo("耗時:{}ms,url:{},param:{},result:{}",System.currentTimeMillis()-start,result,reqUrl,param,result);
3、參數(shù)合法性校驗(減少對下游無效的調(diào)用)
- 數(shù)據(jù)格式的校驗(例如非空唬党、合法性判斷)
- 業(yè)務(wù)合法性的校驗
4、接口設(shè)置超時時間
http工具類提供配置的超時時間參數(shù)驶拱,供其他業(yè)務(wù)場景傳遞霜浴;
- 不同的業(yè)務(wù)場景設(shè)置不同的超時時間;
- 禁止不設(shè)置超時間蓝纲,設(shè)置默認(rèn)的超時時間;
- 評估超時時間缸匪,要結(jié)合業(yè)務(wù),不能拍腦袋闯冷,比如可以根據(jù)接口監(jiān)控,看一下P95辩诞、P99的響應(yīng)時間纺涤,然后在這個基礎(chǔ)上放大一點撩炊;
5伯顶、接口是否需要重試以及重試次數(shù)
- 事務(wù)類接口不要隨便重試,如果下游沒做好接口冪等容易超發(fā)掐暮,像活動的獎品發(fā)放愉择。但是一定要有業(yè)務(wù)告警衷戈,通過人工接入的方式殖妇,進行補發(fā)處理查詢類接口的重試谦趣;
- 查詢類接口的重試,也要慎重考慮摘悴,如果下游接口支持的QPS有限舰绘,重試放量口四,容易把下游的接口打垮驳概,所以如果決定重試探膊,要調(diào)研下游接口的并發(fā)能力流济,酌情處理;
6、事務(wù)一致性保障
自身服務(wù):
- 調(diào)用下游接口失敗斤彼,根據(jù)業(yè)務(wù)需要判斷是否回滾其他的業(yè)務(wù)或者記錄業(yè)務(wù)數(shù)據(jù)到本地事務(wù)消息表悦施,然后啟動一個job定時補償數(shù)據(jù)土陪;
- 管理后臺提供一個事務(wù)消息表查詢的功能⊥芾簦可以在界面上手工點擊進行人工補償璧疗;
數(shù)據(jù)下游服務(wù):
- 提供的接口定義一個唯一值的字段却音,接口做好冪等處理;
- 提供一個根據(jù)唯一值的字段查詢業(yè)務(wù)數(shù)據(jù)的接口,便于上游對賬;
7、接口實現(xiàn)熔斷返回兜底值及降級
自動熔斷實現(xiàn)方案:
接入開源的Hystrx或sentne框架酬土,配置合理斷的值(例如1分鐘接口100個報錯叽唱,斷30s),實現(xiàn)超時或接口報錯自動熔斷钟鸵,同時跟業(yè)務(wù)商量給出一個默認(rèn)兜底值蒙袍。例如調(diào)用大數(shù)據(jù)客群接口岂昭,如果第三方提供的客群接口大量報錯或服務(wù)超時,為了保護我們自己的系統(tǒng)恰矩,框架自動熔斷同時返回默認(rèn)不命中的兜底值纪吮;
手動熔斷實現(xiàn)方案:
接入開源的動態(tài)配置中心apollo或disconf,配置熔斷開關(guān),當(dāng)收到大量業(yè)務(wù)告警,動態(tài)秒級關(guān)閉,恢復(fù)后打開開關(guān)谭贪;
無論是自動或手動套媚,都需要配置業(yè)務(wù)告警浆熔。
8师郑、多次調(diào)用改為單次批量調(diào)用
for循環(huán)根據(jù)id調(diào)用外部接口改為單次批量根據(jù)id調(diào)用,減少多次網(wǎng)絡(luò)io帶來的時間消耗;
要考慮單次批量調(diào)用參數(shù)的大小,比如單次傳1000個id參數(shù),這個也不行聘裁,可能導(dǎo)致接口直接超時衡便,所以要對參數(shù)進行分組切割批量調(diào)用姻政,比如1000個參善镰,1次100個品洛,分10次調(diào)用;
9、接口返回的數(shù)據(jù)考慮是否緩存(防止對下游接口造成流量沖擊)
查詢客戶命中的客群標(biāo)簽缓苛,同一人一天內(nèi)理論上都是不變的,可以使用redis緩存,但是過期時間不適合太長染乌,因為同一個人使用系統(tǒng)的時間也不長台颠;