開放API網關實踐(一)——設計一個API網關

如何設計實現一個輕量的開放API網關.

文章地址: https://blog.piaoruiqing.com/blog/2019/08/05/開放api網關實踐/

前言

隨著業(yè)務的發(fā)展, 所對接的第三方越來越多, 各個業(yè)務系統(tǒng)面臨著同樣一個問題: 如何讓第三方安全快速接入. 此時有一個集驗簽雀久、鑒權宿稀、限流、降級等功能于一身的API網關服務變得尤為重要.

接下來將分享如何設計實現一個輕量級的API開放網關, 包括接口設計赖捌、數據庫設計祝沸、簽名驗簽方案、鑒權等. 本文側重于總體設計, 具體實現細節(jié)將陸續(xù)在后續(xù)的文章中分享.

API網關簡介

API網關在微服務中尤為重要, 其抽象了鑒權越庇、限流罩锐、降級等各個業(yè)務系統(tǒng)通用的功能. 作為眾多內部業(yè)務系統(tǒng)外的一層屏障.

基本需求

  1. 簽名及驗簽
  2. 鑒權
  3. 路由
  4. 權限及資源管理

總體設計

驗簽、鑒權等功能以職責鏈的方式進行處理, 網關根據配置進行路由并附加參數用以配合業(yè)務系統(tǒng)進行處理(如數據過濾等). 簡要請求處理流程如下:

gw-flow-2019-08-05.jpg

接口設計

網關最基本的功能是轉發(fā)請求, 常見的方式是根據配置中的路由規(guī)則將請求轉發(fā)給內部服務, 如:

/order/*的請求轉發(fā)給內部的訂單系統(tǒng)卤唉、/user/*的請求轉發(fā)給內部的用戶系統(tǒng), 這種做法常用于對整個業(yè)務系統(tǒng)負責的基礎網關.

而本文所設計的是服務于第三方的開放API網關, 并未使用上述做法, 而是將請求的資源作為參數放到請求體中, 其原因如下:

  1. 開放API服務于第三方, 屏蔽內部路徑, 有利于提供命名統(tǒng)一且規(guī)范的接口.
  2. 請求接口的映射由網關的路由表維護, 內部接口升級甚至切換到新服務對外接口不變.
  3. 能夠更細粒度地針對接口進行權限控制涩惑、限流、統(tǒng)計等.

地址

開放API網關對外提供唯一入口, 具體請求的資源作為參數傳入.

公共參數

為了簡化簽名和驗簽的操作, 同時也提高靈活度, 唯一入口的約定了固定的公共參數和返回值, 如下:

公共請求參數

參數名稱 是否必須 類型 示例 備注
app_id string 應用ID
method string aaa.bbb.ccc 請求方法
charset string UTF-8 編碼
format string JSON 業(yè)務參數格式
sign_type string RSA2 簽名類型
sign string 簽名
timestamp number 1564929661796 時間戳, 單位: 毫秒
nonce string 63DCB93D270E44D49499F9E5D55705FE 隨機字串(建議使用UUID)
version string 1.0 接口版本
biz_content string {"start_time":"1564929661796", ...} 請求業(yè)務參數
  • app_id: 應用ID, 應用ID是授權的主體, 是調用方的身份標識
  • method: 請求方法, 與內部URL對應, 由網關的路由表維護.
  • timestampnonce用來防重放攻擊.
  • biz_content: 業(yè)務參數, 這個參數將轉發(fā)給內部業(yè)務系統(tǒng).

公共返回參數

參數名稱 是否必須 類型 示例 備注
code number 0 錯誤碼
message string 錯誤信息
charset string UTF-8 編碼
format string JSON 返回參數格式
sign_type string RSA2 簽名類型
sign string 簽名
timestamp number 時間戳, 單位: 毫秒
biz_content string {"id":"1564929661796", ...} 返回業(yè)務參數
  • biz_content: 返回業(yè)務參數, 網關轉發(fā)業(yè)務系統(tǒng)的返回值.

[版權聲明]
本文發(fā)布于樸瑞卿的博客, 允許非商業(yè)用途轉載, 但轉載必須保留原作者樸瑞卿 及鏈接:blog.piaoruiqing.com. 如有授權方面的協(xié)商或合作, 請聯(lián)系郵箱: piaoruiqing@gmail.com.

簽名方案

調用方和服務方均生成2048RSA秘鑰, 交換公鑰. 私鑰用于簽名, 公鑰用于驗簽, 開放API網關對外接口使用https, 故暫不需額外做加密處理.

簽名算法

簽名算法名稱 標準簽名算法名稱 備注
RSA2 SHA256WithRSA 強制要求 RSA 密鑰的長度至少為 2048

簽名規(guī)則

簽名參數內容

剔除sign之后的全部參數.

簽名參數排序

按照參數名的ASCII碼遞增排序(字母升序排序).

簽名生成方式

排序后的參數列表組合成參數名a=參數值a&參數名b=參數值b&...&參數名z=參數值z的字符串, 并使用私鑰生成sign.

數據庫設計

數據庫用于存儲秘鑰權限等配置, 程序和數據庫之間有多級緩存用以提高訪問速度. 簡要ER圖如下:

api_er_2019-08-05_22-34-00.jpg
  • app: 調用方主體, 用于標識請求方身份.
  • group: 組, app分組, 可通過group統(tǒng)一進行授權.
  • subject: 主體(app/group).
  • resource: 資源, 維護請求資源與內部接口的映射關系, url+http_method 對應唯一的resource_id.

技術選型

網關除了滿足功能上的需求外, 性能上的需求也需要著重考慮, 畢竟作為各個業(yè)務系統(tǒng)對外的唯一入口, 網關的性能可能會成為整個業(yè)務系統(tǒng)的瓶頸. 業(yè)務并不復雜, 性能要求高, 響應式編程正是一個不錯的選擇.

  • Spring WebFlux + netty: 響應式Web框架.
  • Spring Data Reactive Redis + Lettuce: 響應式redis客戶端.
  • Guava: Google工具包, 使用LoadingCache作為進程內緩存.

結語

網關作為內部系統(tǒng)外面的一層屏障和入口, 除基本功能和性能上的需求外, 監(jiān)控搬味、統(tǒng)計境氢、日志等都是需要考慮到的問題, 網關方面開源產品眾多, 但選擇時一定要考慮自身業(yè)務, 適合自身的前提下參考各個成熟的方案進行實踐.

系列文章:

歡迎關注公眾號: 代碼如詩


business_card.jpg

[版權聲明]
本文發(fā)布于樸瑞卿的博客, 允許非商業(yè)用途轉載, 但轉載必須保留原作者樸瑞卿 及鏈接:blog.piaoruiqing.com. 如有授權方面的協(xié)商或合作, 請聯(lián)系郵箱: piaoruiqing@gmail.com.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市碰纬,隨后出現的幾起案子萍聊,更是在濱河造成了極大的恐慌,老刑警劉巖悦析,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寿桨,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機亭螟,發(fā)現死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門挡鞍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人预烙,你說我怎么就攤上這事墨微。” “怎么了扁掸?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵翘县,是天一觀的道長。 經常有香客問我谴分,道長锈麸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任牺蹄,我火速辦了婚禮忘伞,結果婚禮上,老公的妹妹穿的比我還像新娘沙兰。我一直安慰自己氓奈,他們只是感情好,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布僧凰。 她就那樣靜靜地躺著探颈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪训措。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天光羞,我揣著相機與錄音绩鸣,去河邊找鬼。 笑死纱兑,一個胖子當著我的面吹牛呀闻,可吹牛的內容都是我干的。 我是一名探鬼主播潜慎,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼捡多,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了铐炫?” 一聲冷哼從身側響起垒手,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎倒信,沒想到半個月后科贬,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡鳖悠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年榜掌,在試婚紗的時候發(fā)現自己被綠了优妙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡憎账,死狀恐怖套硼,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情胞皱,我是刑警寧澤熟菲,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站朴恳,受9級特大地震影響抄罕,放射性物質發(fā)生泄漏。R本人自食惡果不足惜于颖,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一呆贿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧森渐,春花似錦做入、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至耐齐,卻和暖如春浪秘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背埠况。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工耸携, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辕翰。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓夺衍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親喜命。 傳聞我的和親對象是個殘疾皇子沟沙,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351