最近呢岸裙,在做 api 的設計
對于設計建芙,一方面是對于后端 server 框架的設計来累,另一方面呢砚作,是對于整個 api 體系的設計
在這里呢,我們來理理思路嘹锁,先來大致分一下塊
風格就不用說了葫录,我們就用 restful
風格,接下來:
- IDL领猾,也就是我們所說的接口描述語言
- server 框架米同,整個 api 服務的核心驅動
- 版本控制
- 還有一些輔助工具,比如說摔竿,自動化工具面粮、認證授權、監(jiān)控上報继低、日志記錄熬苍、檢索等等
然后呢,我們就來分別說說設計開發(fā)中的一些感觸
IDL
顧名思義袁翁,IDL 是我們整個 api 體系的核心模型柴底,基本上所有的東西都是要基于我們的 IDL 的,在使用的選擇上有很多粱胜,比如 Yaml
柄驻、Json
、xml
年柠、PB
等等凿歼,這些都可以作為接口描述語言,同時呢冗恨,各有優(yōu)劣答憔,在這里呢,我們考慮了以下這幾種:
Json:
Json
是一種穩(wěn)定并得到廣泛應用的序列化格式掀抹,瀏覽器包含對該格式的原生解析能力虐拓,瀏覽器內建調試器也能很好地顯示這種內容。唯一不足在于要具備 Json 解析器/序列器傲武,好在基本所有語言都已提供蓉驹。使用 Json 最主要的麻煩在于每條信息會重復包含屬性名城榛,導致傳輸效率低下,同時呢态兴,Json 對于一些 api 開發(fā)過程中可能出現的特殊需求可能會處理不好狠持,比如說,字段之間的依賴關系瞻润,就不容易描述出來
Yaml:使用
Yaml
來定義我們的 api 模型的話喘垂,可謂是非常的簡潔明了,但是對于 api 模型中的一些復雜結構绍撞,以及一些字段的自檢測正勒,并不能夠很好的支持,同時傻铣,這個格式也不容易在開發(fā)中進行約定章贞,可能會引起一些不必要的麻煩
PB:PB 全稱是
Protocol Buffers
,是谷歌創(chuàng)建的一種基于二進制連接格式的接口描述語言非洲。在解析和網絡傳輸方面Protocol Buffers
更高效鸭限,并經歷了谷歌高負荷環(huán)境的考驗,不足在于一些語言的支持并不是很好怪蔑,主要還是對于 C里覆、python 和 java 的支持丧荐,并且呢缆瓣,在.proto
文件的共享和編譯方面會產生些許額外開發(fā)負擔
xml:這個大家就都非常熟悉了,相對于
Json
和Yaml
虹统,xml
就顯得有些笨重了弓坞,但是 xml 能夠很好的應用于各種特殊的場景,能夠根據不斷的線上需求進一步的擴展车荔,并且可以直接通過xsd
進行自校驗渡冻,從功能上來講,或許會更加完善一些
因為 IDL 是我們 api 的核心忧便,以后的各項業(yè)務基本都要圍繞 IDL 展開族吻,所以需要能夠功能完善,便于擴展珠增,并且在開發(fā)中能夠有一些自動化的工具來進行約束超歌,so,最終呢蒂教,還是決定采用 xml 的形式
server 框架
核心代碼非常的簡單巍举,只需要寫一個 route
來實現路由調用就行了,但是凝垛,為了輔助他能夠正常的調用懊悯,我們就不得不實現更多的一些輔助功能了
可以來看一下我的基本的目錄結構
Framework
│
├── Auth 認證蜓谋、鑒權模塊
│
├── Base 基礎服務
│
├── Client 各種端服務
│
├── Common 公共組件
│
├── Core 核心調度邏輯
│
├── Coroutine 協(xié)程調度實現
│
├── Exception 異常處理
│
├── Http 協(xié)議實現
│
├── Log 日志上報,監(jiān)控模塊
│
├── Pool 連接池(資源池)
│
└── Resource 資源模型
同時呢炭分,開發(fā)過程中要降低各模塊間依賴關系桃焕,就比如說,與其 new
一個對象捧毛,不如采用 set
的方式來解耦覆旭,預期繼承,不如采用組合的方式岖妄,保證各個模塊的獨立性型将,同時呢各模塊間又要有一個通訊通道
為了實現一些特殊的需求,我們采用協(xié)程調度來實現非阻塞 IO荐虐,當然七兜,這里我們就需要實現一個單獨的服務端口監(jiān)聽,就好比 swoole 或是 workerman 那樣福扬,編寫獨立的服務進程
ok腕铸,上面也提到了,核心代碼只需要實現一個 route
路由就行了铛碑,但是在路由前后狠裹,要記得留出認證、鑒權接口汽烦,同時呢涛菠,對于運行時的異常也要及時捕獲上報,同時記入日志撇吞,方便調試
對了俗冻,除了這些 server 服務依賴,數據也要注意哦牍颈,最好是能夠在原始數據之上再單獨抽離出來一層數據接口層迄薄,不要直接操作原始數據
這些核心服務完成后,剩下的就是客戶端和服務端代碼煮岁,這個就可以根據實際的服務去自由發(fā)揮了讥蔽,對于 api,我們也可以把客戶端代碼稱之為 SDK
画机,同時呢冶伞,為了方便以后的開發(fā)維護,可以統(tǒng)一編寫自動化工具生成色罚,對于不同語言對應的做支持
OK 了碰缔,上篇就先寫到這里吧,主要說了對于 server 框架以及 IDL 的設計選擇思路
下篇呢戳护,會主要對于 api 的版本控制金抡,發(fā)布瀑焦,以及一些自動化工具進行一些分享
From: 一名熱愛動漫的攻城獅