溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何設計實現(xiàn)一個輕量的開放API網(wǎng)關

發(fā)布時間:2022-01-18 16:44:49 來源:億速云 閱讀:310 作者:柒染 欄目:開發(fā)技術

本篇文章給大家分享的是有關如何設計實現(xiàn)一個輕量的開放API網(wǎng)關,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

前言

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

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

API網(wǎng)關簡介

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

基本需求

  1. 簽名及驗簽

  2. 鑒權

  3. 路由

  4. 權限及資源管理

總體設計

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

如何設計實現(xiàn)一個輕量的開放API網(wǎng)關

接口設計

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

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

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

  1. 開放API服務于第三方, 屏蔽內部路徑, 有利于提供命名統(tǒng)一且規(guī)范的接口.

  2. 請求接口的映射由網(wǎng)關的路由表維護, 內部接口升級甚至切換到新服務對外接口不變.

  3. 能夠更細粒度地針對接口進行權限控制、限流、統(tǒng)計等.

地址

開放API網(wǎng)關對外提供唯一入口, 具體請求的資源作為參數(shù)傳入.

公共參數(shù)

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

公共請求參數(shù)

如何設計實現(xiàn)一個輕量的開放API網(wǎng)關

  • app_id: 應用ID, 應用ID是授權的主體, 是調用方的身份標識

  • method: 請求方法, 與內部URL對應, 由網(wǎng)關的路由表維護.

  • timestamp和nonce用來防重放攻擊.

  • biz_content: 業(yè)務參數(shù), 這個參數(shù)將轉發(fā)給內部業(yè)務系統(tǒng).

公共返回參數(shù)

如何設計實現(xiàn)一個輕量的開放API網(wǎng)關

  • biz_content: 返回業(yè)務參數(shù), 網(wǎng)關轉發(fā)業(yè)務系統(tǒng)的返回值.

[版權聲明]

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

簽名方案

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

簽名算法

如何設計實現(xiàn)一個輕量的開放API網(wǎng)關

簽名規(guī)則

簽名參數(shù)內容

剔除sign之后的全部參數(shù).

簽名參數(shù)排序

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

簽名生成方式

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

數(shù)據(jù)庫設計

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

如何設計實現(xiàn)一個輕量的開放API網(wǎng)關

  • app: 調用方主體, 用于標識請求方身份.

  • group: 組, app分組, 可通過group統(tǒng)一進行授權.

  • subject: 主體(app/group).

  • resource: 資源, 維護請求資源與內部接口的映射關系, url+http_method 對應唯一的resource_id.

技術選型

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

  • Spring WebFlux + netty: 響應式Web框架.

  • Spring Data Reactive Redis + Lettuce: 響應式redis客戶端.

  • Guava: Google工具包, 使用LoadingCache作為進程內緩存.

以上就是如何設計實現(xiàn)一個輕量的開放API網(wǎng)關,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

api
AI