萬(wàn)網(wǎng)網(wǎng)站備案多久/免費(fèi)優(yōu)化網(wǎng)站
文章目錄
- 明確的接口定義和文檔化
- 使用RESTful設(shè)計(jì)規(guī)范
- 分頁(yè)和過(guò)濾
- 合理使用緩存
- 限流與熔斷機(jī)制
- 安全性設(shè)計(jì)
- 異步處理與后臺(tái)任務(wù)
- 接口參數(shù)校驗(yàn)(入?yún)⒑统鰠?#xff09;
- 接口擴(kuò)展性考慮
- 核心接口,線程池隔離
- 關(guān)鍵接口,日志打印
- 接口功能單一性原則
- 接口查詢優(yōu)化,串行改為并行
- 確保接口兼容性的策略
- 調(diào)用第三方接口要考慮異常和超時(shí)處理
- 接口實(shí)現(xiàn)過(guò)程中,注意大文件、大事務(wù)、大對(duì)象
- 仔細(xì)檢查代碼避免出現(xiàn)粗心的空指針異常
- 考慮是否存在事務(wù)失效的問(wèn)題場(chǎng)景
明確的接口定義和文檔化
接口的明確定義和完善的文檔能夠減少溝通成本,避免誤用。文檔化還可以方便后續(xù)維護(hù)和擴(kuò)展。
使用RESTful設(shè)計(jì)規(guī)范
遵循RESTful設(shè)計(jì)風(fēng)格,使得接口更具一致性和可讀性,并便于理解和使用。
分頁(yè)和過(guò)濾
對(duì)于返回大量數(shù)據(jù)的接口,使用分頁(yè)和過(guò)濾以減少數(shù)據(jù)傳輸量和提高響應(yīng)速度。
合理使用緩存
在高并發(fā)的后端系統(tǒng)中,合理使用緩存可以顯著提升性能,減輕數(shù)據(jù)庫(kù)的壓力,并縮短接口的響應(yīng)時(shí)間。緩存的核心思想是將一些計(jì)算量大、訪問(wèn)頻繁的數(shù)據(jù)暫時(shí)存儲(chǔ)在內(nèi)存中(如Redis、Memcached等),當(dāng)下次請(qǐng)求相同數(shù)據(jù)時(shí),可以直接從緩存中獲取,而不需要再次訪問(wèn)數(shù)據(jù)庫(kù)或執(zhí)行復(fù)雜的計(jì)算。
限流與熔斷機(jī)制
限流與熔斷機(jī)制旨在防止系統(tǒng)過(guò)載,保護(hù)服務(wù)穩(wěn)定性。限流控制請(qǐng)求頻率,避免瞬間高并發(fā)沖擊;熔斷則在服務(wù)不穩(wěn)定時(shí)主動(dòng)停止請(qǐng)求,防止連鎖故障,并在服務(wù)恢復(fù)后逐步恢復(fù)正常請(qǐng)求。
安全性設(shè)計(jì)
確保接口的安全性,如身份認(rèn)證、權(quán)限校驗(yàn)和數(shù)據(jù)加密,避免數(shù)據(jù)泄露和未授權(quán)訪問(wèn)。
異步處理與后臺(tái)任務(wù)
對(duì)于需要耗時(shí)較長(zhǎng)的操作,可以通過(guò)異步處理或后臺(tái)任務(wù)方式提高接口的響應(yīng)速度。
接口參數(shù)校驗(yàn)(入?yún)⒑统鰠?#xff09;
接口入?yún)⒑统鰠⒍夹枰M(jìn)行校驗(yàn), ① 例如入?yún)⑹欠癫荒転榭?#xff0c;入?yún)?shù)據(jù)長(zhǎng)度,入?yún)⑹欠穹项A(yù)期規(guī)則,很多bug由于未做參數(shù)校驗(yàn)導(dǎo)致,對(duì)于可能改變的參數(shù)建議設(shè)計(jì)為對(duì)象類型;② 對(duì)于返回值,當(dāng)返回值為空時(shí)是否返回為空串、空對(duì)象、空數(shù)組,需要與前端約定好。
接口擴(kuò)展性考慮
在后端接口設(shè)計(jì)中,擴(kuò)展性是非常重要的考慮因素。設(shè)計(jì)良好的接口應(yīng)該能夠適應(yīng)業(yè)務(wù)需求的變化,易于擴(kuò)展而不需要對(duì)現(xiàn)有系統(tǒng)做出大規(guī)模修改。
核心接口,線程池隔離
登錄接口、首頁(yè)數(shù)據(jù)接口、轉(zhuǎn)賬提現(xiàn)接口等,都可能使用到線程池,某些普通接口也會(huì)使用線程池,如果不做線程池隔離,普通接口出bug線程池打滿,會(huì)導(dǎo)致登錄等主要業(yè)務(wù)受到影響。
關(guān)鍵接口,日志打印
關(guān)鍵業(yè)務(wù)代碼,需要打印日志進(jìn)行保駕護(hù)航,在入?yún)⒑统鰠⑽恢没蛘咂渌P(guān)鍵位置,良好的日志打印具有如下好處:① 方便排查定位線上問(wèn)題,劃清問(wèn)題責(zé)任;② 生產(chǎn)環(huán)境不能直接debug,必須依靠日志查問(wèn)題和具體異常。
接口功能單一性原則
單一性是指接口做的事情比較單一、專一。比如一個(gè)登陸接口,它做的事情就只是校驗(yàn)賬戶名密碼,然后返回登陸成功以及userId即可。但是如果你為了減少接口交互,把一些注冊(cè)、一些配置查詢等全放到登陸接口,就不太妥。其實(shí)這也是微服務(wù)一些思想,接口的功能單一、明確。比如訂單服務(wù)、積分、商品信息相關(guān)的接口都是劃分開(kāi)的。將來(lái)拆分微服務(wù)的話,是不是就比較簡(jiǎn)便啦。
接口查詢優(yōu)化,串行改為并行
在設(shè)計(jì)一個(gè)APP首頁(yè)接口時(shí),如果它需要從多個(gè)不同的數(shù)據(jù)源獲取信息(如用戶信息、banner信息、彈窗信息等),通常有兩種常見(jiàn)的調(diào)用方式:串行調(diào)用和并行調(diào)用。為了提高接口的響應(yīng)速度,優(yōu)化用戶體驗(yàn),采用并行調(diào)用是更優(yōu)的選擇,尤其是在這些調(diào)用之間沒(méi)有依賴關(guān)系時(shí)。
并行調(diào)用允許多個(gè)請(qǐng)求同時(shí)執(zhí)行,不必等待彼此完成。Java中的CompletableFuture可以很方便地實(shí)現(xiàn)這一點(diǎn)。
確保接口兼容性的策略
在修改老接口時(shí),接口的兼容性是一個(gè)非常重要的考慮因素,特別是在系統(tǒng)已經(jīng)上線并且被多個(gè)客戶端使用的情況下。以下是一些確保接口兼容性的策略和最佳實(shí)踐。
- 向后兼容性
定義:向后兼容性指的是舊版本的客戶端仍然可以正常使用新版本的接口,而不需要任何修改。
策略:
保持現(xiàn)有字段不變:不要隨意修改或刪除現(xiàn)有的字段或參數(shù),這樣可以保證舊客戶端仍然能按預(yù)期工作。
新增字段:如果需要擴(kuò)展數(shù)據(jù)模型,可以新增字段或參數(shù),但這些新增內(nèi)容應(yīng)該是可選的。舊客戶端可以忽略這些新字段,而新客戶端則可以利用它們。
保持返回類型不變:盡量保持返回的JSON或XML結(jié)構(gòu)不變,尤其是數(shù)據(jù)類型、字段名等。如果必須改變,確保新老結(jié)構(gòu)兼容,或提供降級(jí)邏輯。 - 版本管理
定義:當(dāng)新功能或重大修改不可避免地會(huì)破壞現(xiàn)有客戶端時(shí),應(yīng)該采用接口版本管理策略。
策略:
路徑版本化:在URL路徑中添加版本號(hào),例如/api/v1/user和/api/v2/user。這種方式直觀,客戶端明確知道調(diào)用的是哪個(gè)版本的接口。
請(qǐng)求頭版本化:通過(guò)HTTP請(qǐng)求頭指定版本號(hào),例如Accept: application/vnd.company.v1+json。這種方式不會(huì)影響URL的結(jié)構(gòu)。
API網(wǎng)關(guān):使用API網(wǎng)關(guān)進(jìn)行版本管理和路由,能夠更靈活地處理不同版本的接口。
調(diào)用第三方接口要考慮異常和超時(shí)處理
在調(diào)用第三方接口時(shí),異常和超時(shí)處理是至關(guān)重要的。這些問(wèn)題如果處理不當(dāng),會(huì)導(dǎo)致應(yīng)用程序的不穩(wěn)定,甚至崩潰。為了確保系統(tǒng)的健壯性和用戶體驗(yàn)的穩(wěn)定性,以下是一些關(guān)鍵的考慮和處理策略。
重試機(jī)制:在遇到網(wǎng)絡(luò)異常時(shí),可以嘗試進(jìn)行重試,通常是幾次有限次數(shù)的重試。例如,可以使用指數(shù)退避算法來(lái)增加重試間隔時(shí)間,避免因頻繁重試造成更多的問(wèn)題。
兜底方案:如果多次重試后仍然失敗,返回默認(rèn)值或使用緩存中的數(shù)據(jù),確保系統(tǒng)能夠繼續(xù)工作。
降級(jí)處理:當(dāng)?shù)谌椒?wù)異常時(shí),提供降級(jí)服務(wù)。例如,返回一個(gè)友好的錯(cuò)誤信息或使用本地的備用數(shù)據(jù)。
告警通知:當(dāng)出現(xiàn)服務(wù)異常時(shí),觸發(fā)告警通知運(yùn)維團(tuán)隊(duì),以便快速響應(yīng)。
調(diào)用第三方接口時(shí),必須設(shè)定合理的超時(shí)時(shí)間,以避免長(zhǎng)時(shí)間等待。
超時(shí)重試:在設(shè)定的超時(shí)時(shí)間內(nèi)如果請(qǐng)求未完成,可以嘗試重試,通??梢栽O(shè)置有限次重試,避免無(wú)限循環(huán)。
當(dāng)某個(gè)第三方接口頻繁出現(xiàn)異?;虺瑫r(shí)時(shí),可以采用熔斷機(jī)制,暫時(shí)停止對(duì)該接口的調(diào)用,避免對(duì)系統(tǒng)產(chǎn)生更大的影響。
日志記錄:詳細(xì)記錄每次第三方接口調(diào)用的請(qǐng)求和響應(yīng)信息,特別是在出現(xiàn)異常和超時(shí)時(shí),確??梢赃M(jìn)行后續(xù)的排查。
監(jiān)控與報(bào)警:設(shè)置接口調(diào)用的監(jiān)控指標(biāo),如成功率、平均響應(yīng)時(shí)間等,當(dāng)某些指標(biāo)超過(guò)閾值時(shí),立即報(bào)警通知相關(guān)人員。
接口實(shí)現(xiàn)過(guò)程中,注意大文件、大事務(wù)、大對(duì)象
? 讀取大文件時(shí),不要Files.readAllBytes直接讀取到內(nèi)存,這樣會(huì)OOM的,建議使用BufferedReader一行一行來(lái)。
? 大事務(wù)可能導(dǎo)致死鎖、回滾時(shí)間長(zhǎng)、主從延遲等問(wèn)題,開(kāi)發(fā)中盡量避免大事務(wù)。
? 注意一些大對(duì)象的使用,因?yàn)榇髮?duì)象是直接進(jìn)入老年代的,可能會(huì)觸發(fā)fullGC
仔細(xì)檢查代碼避免出現(xiàn)粗心的空指針異常
空指針異常(NullPointerException)是 Java 開(kāi)發(fā)中常見(jiàn)的錯(cuò)誤之一。它通常發(fā)生在嘗試對(duì)一個(gè) null 對(duì)象引用進(jìn)行操作時(shí)。
使用工具如 IntelliJ IDEA 的代碼分析功能、SonarQube、FindBugs、Checkstyle 等,這些工具可以幫助檢測(cè)可能的空指針異常問(wèn)題。
在方法和構(gòu)造函數(shù)中,進(jìn)行參數(shù) null 檢查,拋出適當(dāng)?shù)漠惓!?br /> 對(duì)可能返回 null 的方法結(jié)果進(jìn)行檢查或處理。
對(duì)可能的參數(shù)值都進(jìn)行null檢查。
考慮是否存在事務(wù)失效的問(wèn)題場(chǎng)景
? 方法的訪問(wèn)權(quán)限必須是public,其他private等權(quán)限,事務(wù)失效
? 方法被定義成了final的,這樣會(huì)導(dǎo)致事務(wù)失效。
? 在同一個(gè)類中的方法直接內(nèi)部調(diào)用,會(huì)導(dǎo)致事務(wù)失效。
? 一個(gè)方法如果沒(méi)交給spring管理,就不會(huì)生成spring事務(wù)。
? 多線程調(diào)用,兩個(gè)方法不在同一個(gè)線程中,獲取到的數(shù)據(jù)庫(kù)連接不一樣的。
? 表的存儲(chǔ)引擎不支持事務(wù)
? 如果自己try…catch誤吞了異常,事務(wù)失效。
? 錯(cuò)誤的傳播特性