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