微服務基礎——厲害了!API閘道器
微服務剛剛誕生的時候,人們將服務進行拆分,實現服務之間的松耦合,並且每個服務有專門的團隊維護,然後客戶端直接和各個子服務進行互動。比如,訂單,商品,會員服務。
那麼這種客戶端直接和後端服務互動的方式會有什麼問題呢?
1、客戶端需要知道每個服務的地址
2、每個後端服務都需要實現認證、限流、日誌、監控、快取等功能,重複造輪子大大降低了開發效率,而這些公共業務邏輯完全可以拆分出來
3、假如後端某些服務由之前的http/https呼叫變成rpc呼叫,或者某些引數發生改變,則客戶端需要做很大調整。
後來人們為了解決這些問題,引入 API閘道器。
當引入API閘道器後,API閘道器接管了所有的入口流量,就像nginx,將請求路由到對應的後端服務。這樣客戶端無需關心後端服務地址,只需呼叫閘道器即可。不僅如此,閘道器還針對這些流量做了功能的擴充套件,包括鑑權、限流、日誌監控、告警、訪問控制、協議轉換等功能,這樣後端服務只需關注自身的業務邏輯。
我們可以將API閘道器的部分功能做一個簡單的梳理。
註冊API
API閘道器要給後端服務賦能,就需要後端服務(API提供者)將API資訊註冊到閘道器,並且為每個API配置後端服務的地址。但是,這樣遇到的問題是,API之間是獨立的,無法將服務於同一功能的API組織起來,統一管理。為了適應真實的服務場景,API閘道器使用API分組來管理一組API,並配置同一後端,使用者(API提供者)不僅可以管理API也可以管理API分組。
下圖參考了京東雲的API閘道器
當呼叫者(API呼叫者)發起呼叫時,閘道器先判斷請求來自哪個分組,最後判斷請求來自哪個API,如果API提供者對分組新增能力,比如限流,那麼這個限流功能只針對分組生效。
身份認證
基本上每個元件都關聯了使用者資訊,需要識別使用者身份。因此API閘道器接管了身份認證的功能,識別呼叫者資訊,並且將其傳遞給後端服務。常見身份認證的方式有很多,這些方式關注的點是如何攜帶身份資訊,以及如何對資訊做加密,選擇這些認證方式的考量就是安全性和效能。下面分析幾種常見的身份驗證的方式:
1、 HTTP基本認證(Basic Authentication)
就是將使用者名稱、密碼資訊進行base64編碼,放在Authorization header中傳送給閘道器,閘道器驗證使用者名稱密碼是否正確。
好處 :呼叫簡單
不足 :不夠安全,為了防止密碼被洩露,一般使用https傳輸;需要呼叫遠端的使用者中心服務,查詢使用者資訊,驗證使用者名稱密碼的正確性。
2、 HMAC Authentication
客戶端將請求資訊(包含使用者名稱,不包含密碼)與密碼做HMAC,生成一串雜湊值(簽名資訊),傳給閘道器。閘道器透過使用者名稱獲取密碼,再和收到的請求資訊做HMAC,生成簽名資訊,並與客戶端的簽名資訊進行比對,一致則驗證透過。
好處 :安全,客戶端無需傳密碼至閘道器,同時透過簽名的方式防止了請求資訊被篡改。
不足 :需要呼叫遠端的使用者中心服務,查詢使用者密碼等資訊;客戶端每次呼叫前還需要生成簽名資訊,導致呼叫不太方便。
基於HMAC Authentication的簽名認證演算法有很多,如AWS、京東雲、阿里雲API閘道器的基於AK,SK的簽名演算法,就是在HMAC Authentication上改進的。
3、 JWT Authentication
JSON Web Token(JWT)也是一種常用的身份驗證和簽名演算法,客戶端請求登入的時候攜帶使用者名稱密碼請求使用者中心伺服器,獲取token(不包含密碼)儲存到客戶端,客戶端攜帶token呼叫閘道器時,閘道器解析token,透過公鑰驗證token的正確性,獲取使用者資訊。
好處 :安全性高,呼叫簡單,閘道器無需訪問使用者中心服務
不足 :非對稱加密,消耗計算資源
訪問控制(授權)
很多情況下,我們並不希望所有的使用者都能訪問我們的介面,或者只希望某些使用者訪問到部分內容,那麼使用訪問授權就能實現。閘道器在API或API分組級別上對使用者的呼叫做控制,限制使用者訪問某些分組或者API,常用的訪問控制元件有ACL。更為高階的訪問控制功能可以參考各大雲廠商的訪問控制元件,比如AWS的IAM以及阿里雲的RAM。
1、 訪問控制列表(ACL)
ACL是將一組白名單使用者或一組黑名單使用者關聯到具體的API分組或者API,當請求經過閘道器時,閘道器會驗證呼叫者是否為白名單或者黑名單使用者,以此判斷是否允許或拒絕請求。
2、 IAM
訪問控制(Identity and Access Management, IAM)是針對子使用者進行的許可權管理,可以提供更精細化的許可權控制。IAM的特點是使用一組策略來定義許可權,策略包含介面名稱,資源(引數),許可權型別,這樣就將許可權控制在資源(引數)層級。
限流
對於經常出現流量突增的系統,比如618,雙11大促、微博出現重大新聞事件等,我們很難及時的評估流量,做好應對預案,最終導致服務整個不可用。因此做好限流就十分有必要了,當流量突增超過限流閾值時,透過限流降級策略保護核心業務的正常運轉。選擇限流方案,主要考慮使用什麼樣的限流演算法,單擊限流還是分散式限流。
1、 限流演算法
簡單計數法、令牌桶、漏桶等是常見的限流演算法,簡單計數法的特點是統計某一段時間內的請求個數,以此判斷是否拒絕請求,這種簡單粗暴的限流方式無法應對突發流量;令牌桶演算法的特點是,以固定速率往桶裡新增令牌,透過桶裡是否有令牌判斷是否拒絕請求,桶的大小決定了突發流量的大小。漏桶的思想和令牌桶相反,以固定的速率分發請求,實現流量的平滑處理。因此,當我們完全不關心流量突發的情況,選擇簡單計數法即可,當我們無法容忍流量突發,則選擇漏桶演算法,當我們允許一定程度的流量突發,選擇令牌桶演算法。
2、 單機限流
單擊限流,呼叫數儲存在本地,無需頻繁的和遠端節點互動,效能比較高。
3、 分散式限流
分散式限流,呼叫數儲存在遠端節點,如redis。每次需要和遠端節點互動,效能較低。那為啥還要使用分散式限流呢?因為有些場景下(特別是API閘道器),限流值是使用者配置的,需要保證限流的準確性。我們有個折中的方案,先在本機儲存少量的呼叫數,然後同步到遠端節點,這樣就成倍的減少了呼叫遠端的次數,雖然準確性有所降低,但是在可接受的範圍。
安全
安全是API閘道器不可或缺的功能,身份驗證、訪問授權,限流等一定程度上也算是保障後端服務的安全穩定,但是這些遠遠不夠用。API閘道器的安全防範功能還包括IP限制、waf等。
1、IP限制
主要是透過IP白名單和黑名單列表,允許和拒絕某些IP訪問後端服務
2、WAF
網站應用級入侵防禦系統(Web Application Firewal, WAF),是透過安全策略,更細粒度的驗證請求的合法性,從而為後端服務應用級安全性提供保障。
日誌
API閘道器接管了所有的入口流量,包含豐富的呼叫日誌,所以利用好閘道器的日誌,能夠為後端服務做很多事情。API閘道器的日誌通常包括access日誌,error日誌,審計日誌等。access日誌透過會記錄Trace_id標識一個請求的完整鏈路、請求總耗時、閘道器耗時、請求方式、請求體大小、響應體大小、響應狀態碼、使用者標識、API分組標識、API標識、請求是否到後端等。審計日誌更完整,除了記錄access日誌包含的內容,還記錄請求引數,響應引數,使用者資訊等具體內容。下面簡單羅列API閘道器日誌可以做什麼?
1、簡單的日誌查詢。
2、將指定API分組的日誌輸入到指定檔案、http/https後端、TCP後端、UDP後端、kafka等多個位置,供API提供者做進一步處理。
3、將指定API分組的日誌輸入到DataDog、Prometheus、ZipKin等服務,提供日誌統計、分析、監控的功能。
4、接入計費功能,按呼叫次數、輸入輸出流量統一計費。
監控
監控平臺是API閘道器針對API和API分組做統一監控告警,API提供者透過平臺配置告警規則,檢視實時的監控資料,包括QPS、成功失敗次數分佈、響應狀態分佈、響應時間分佈、使用者呼叫次數分佈、流量分佈等。正如日誌部分介紹的,如果API提供者需要定製更多的監控功能,可以將日誌輸入到Prometheus,然後做進一步處理。
API市場
API市場是實現API商業化的有效途徑,API閘道器將API上架到API市場供其他使用者購買使用,並根據呼叫次數或者流量計算費用,最終幫助API提供者獲利。
當然,API閘道器的功能遠遠不止這些,還包括引數校驗、引數轉換、協議轉換、請求體響應體大小限制、請求跨域訪問限制、mock服務、serverless、後端路由、服務發現、快取、容錯降級、金絲雀釋出、藍綠部署等。總之, API閘道器為後端服務提供更好的體驗和保障的同時,也大大縮短了API的上線週期,方便API的運營維護,最終還能實現API的商業化,價值非常之大,意義非常之深遠。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69912185/viewspace-2666042/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 微服務架構基礎之API閘道器微服務架構API
- dotnet core微服務框架Jimu ~ 基礎閘道器微服務框架
- 高效能API閘道器(1)、微服務API閘道器架構設計API微服務架構
- 微服務實踐分享(2)api閘道器微服務API
- 微服務閘道器微服務
- .NET Core 微服務—API閘道器(Ocelot) 教程 [四]微服務API
- 微服務設計中的API閘道器模式微服務API模式
- .NET Core 微服務—API閘道器(Ocelot) 教程 [一]微服務API
- 微服務閘道器- Nginx微服務Nginx
- 微服務中的閘道器微服務
- RestCloud API閘道器,無縫與原微服務框架整合RESTCloudAPI微服務框架
- 《springcloud 二》微服務動態閘道器,閘道器叢集SpringGCCloud微服務
- 微服務(七)Gateway服務閘道器微服務Gateway
- 微服務閘道器 Spring Cloud Gateway微服務SpringCloudGateway
- SpringCloud 微服務閘道器 Gateway 元件SpringGCCloud微服務Gateway元件
- go-kit微服務:一個簡單的API閘道器Go微服務API
- 微服務技術棧:API閘道器中心,落地實現方案微服務API
- 基於gRPC、API閘道器和身份驗證的Go微服務原始碼專案RPCAPIGo微服務原始碼
- .NETCore微服務探尋(一) - 閘道器NetCore微服務
- SpringCloud微服務治理三(Zuul閘道器)SpringGCCloud微服務Zuul
- 微服務6:通訊之閘道器微服務
- 長連線閘道器技術專題(八):B站基於微服務的API閘道器從0到1的演進之路微服務API
- 使用API閘道器幫助單體到微服務的平滑過渡API微服務
- SpringCloud微服務專案實戰 - API閘道器Gateway詳解實現SpringGCCloud微服務APIGateway
- API 閘道器 KongAPI
- 隨行付微服務之基於Zuul自研服務閘道器微服務Zuul
- 《springcloud 二》SrpingCloud Zuul 微服務閘道器搭建SpringGCCloudZuul微服務
- 微服務下的閘道器如何選擇微服務
- 微服務閘道器實戰——Spring Cloud Gateway微服務SpringCloudGateway
- 微服務閘道器Gateway實踐總結微服務Gateway
- SpringCloud微服務系列- 分散式能力建設之微服務閘道器SpringGCCloud微服務分散式
- .Net Core微服務入門全紀錄(五)——Ocelot-API閘道器(下)微服務API
- .Net Core微服務入門全紀錄(四)——Ocelot-API閘道器(上)微服務API
- 利用Spring Boot實現微服務的API閘道器統一日誌Spring Boot微服務API
- RestCloud企業級API閘道器,可與原有微服務框架無縫整合RESTCloudAPI微服務框架
- 微服務閘道器Zuul遷移到Spring Cloud Gateway微服務ZuulSpringCloudGateway
- 微服務與閘道器技術(SIA-GateWay)微服務Gateway
- 微服務閘道器SIA-GateWay使用指南微服務Gateway