接口設計的五點建議!

本文首發於個人微信公衆號《andyqian》, 期待你的關注!

前言

接口是目前:前後端交互(Rest),系統交互(RPC)最普遍的一種方式。一個好的接口,應該清晰易懂,職責明確,易於維護。反之,則會造成很多困擾。特別是Open API,誰做誰知道。基於這樣的前提以及自己之前踩過的坑,就成了這篇文章的由來。

編寫文檔

文檔與程序員之間有着一種非常奇妙的關係。一句話概括就是:”寫之,痛之。用之,悔之”。怎麼解釋呢?就是:寫的時候覺得很痛苦,不願意寫!用的時候呢,又後悔當初沒有留下文檔! 可見文檔是多麼重要。以Rest接口爲例,文檔需要詳細的記錄請求參數,返回參數,每個字段的意思,是否必填,請求方法等。隨着代碼的更新,文檔也應該及時更新。在很多開發者眼裏(包括我自己),覺得寫文檔是一件浪費時間的事情,寫代碼纔是正經事。隨着工作經驗的積累,愈發覺得文檔的重要性,不但沒浪費時間,反而還在節省時間。

符合最小原則

這個原則其實是有點像設計模式中的迪米特法則(也稱爲:最小知識原則),不過我認爲這其中包含了兩層意思:

其一:在接口設計中,請求參數在保證功能的前提下:儘可能的減少參數,更不允許添加無用的參數。以Rest接口爲例:一旦添加了無用的參數,在後續迭代過程中,就會遇到:棄之可惜,留之無用 的尷尬局面。對於 Client 端也會造成困擾,還會浪費帶寬。

其二:接口粒度應該儘量小且保持單一職責,不要寫大而全的接口。單一職責的好處不必多說,是一個老生常談的問題。

新老兼容

在接口設計中,新老接口的兼容是必須要考慮的,堪稱事故多發地。

常見事故如下所示:

  1. v1 版本 API 上線發佈後。隨着需求變化,需要在v2 接口版本中新增幾個字段。上線後,發現使用v1 版本的客戶端業務中斷。(v1版本沒有兼容V2版本(新字段)導致)。
  2. v1 版本 API 上線發佈後。隨着需求變化,需要刪除某個接口。系統上線後,造成低版本客戶端業務中斷 (沒有兼容老的Client Version 導致)。

對於 Rest 接口,在這方面需要特別注意。因爲客戶端更新的週期是漫長的,以微信Android客戶端爲例。目前最新版本是:V7.0.6,但事實上:並不是每一個Android客戶端的版本都是最新的V7.0.6,有可能是:V6.7.2,也有可能更低。對於微信這類國民軟件而言,每一個版本影響的用戶數都是極大的。如果不兼容,造成影響是巨大的。

對於這種情況,API接口的更新:一般會採用 新老版本並行使用 進行過渡,並在大版本中進行逐步更新,直至沒有Client Version進行使用時,API接口才能進行下線。

同樣的道理,放在內部的 RPC 接口也適用。前一段時間還犯了一個這樣的錯,事情是這樣的:在更新一個必須強制更新RPC接口時,採用了同步發佈法。當時以爲全部理清楚所有調用端,上線後,依然造成了生產事故,因爲還有一個調用端沒有在計劃內。這樣做的弊端包括但不限於以下幾點:

  1. 涉及應用多,(如果該接口爲底層服務,那調用的上層應用都需要同步修改,一旦缺少一個,則會發布失敗)。
  2. 發佈時間長

事實上:我們應該儘量避免這種”同步發佈法”,這也是阿里研究員谷樸老師在 《API 設計最佳實踐的思考》中特別提到的一點。

及時移除不要的代碼

這個確實是一個容易忽略的細節。我自己也有過這樣的經歷,特別是一些策略性的代碼及產品代碼中,非常容易出現這樣的現象。例如:某段代碼一開始是有的,後面因爲優化也好,因爲調整也好,要去掉。但 “ 自認爲 “ 後面還是會使用,則將其註釋之。時而久之,這段註釋的灰代碼就此紮根,誰也不敢修改。代碼中的壞味道就此慢慢的發酵,直至變臭。因此:無論從擴展方面,還是可維護方面考慮,都建議及時清除不必要的代碼


 

相關閱讀:

Seata 分佈式事務框架

Dubbo 線程池源碼解析

你所不知道的 BigDecimal

ThreadPoolExecutor 原理解析

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章