10 微服務架構學習與思考:微服務網關和開源 API 網關01-以 Nginx 為基礎的 API 網關詳細介紹

微服務架構學習與思考(10):微服務網關和開源 API 網關01-以 Nginx 為基礎的 API 網關詳細介紹
一、為什么會有 API Gateway 網關隨著微服務架構的流行 , 很多公司把原有的單體架構改造成了微服務架構 。
第一步:拆分
微服務架構就是把一個大單體改造成一個一個小的應用 。比如把一個電商網站,從單體改造成微服務架構 , 如下圖:

10 微服務架構學習與思考:微服務網關和開源 API 網關01-以 Nginx 為基礎的 API 網關詳細介紹

文章插圖
改造成微服務后,用戶通過 PC 和手機訪問電商應用,都是調用后面的微服務 API,而且各自要調用多個后端 API 服務才能拿到需要的數據 。業務量小的時候,這種訪問方式沒有多大問題 。用戶多了訪問量大了呢?這種方式就不能持續 。
第二步:API 功能逐漸增多
如果后面業務發展較快,用戶需要的功能越來越多,那么相應的后端微服務的數量也會越來越多 , 用上面這種方式來訪問,調用的微服務 API 數量越來越多,如果訪問量大服務器壓力就會加大,那能不能縮減下調用 API 的數量,減輕服務器訪問壓力?聚合服務 , 內部聚合一些 API 服務接口形成一個聚合服務,PC 或手機客戶端訪問這個聚合服務,是不是就減少了訪問次數?提高訪問性能,提升用戶體驗 。
為了提高 API 服務的可用性,還會給 API 加上限流控制,超時控制,熔斷降級,API 隔離等功能 。
為了提高 API 服務訪問安全性 , 還會給 API 加上訪問控制 , 比如進行 JWT 驗證,黑白名單機制 。如下圖:
10 微服務架構學習與思考:微服務網關和開源 API 網關01-以 Nginx 為基礎的 API 網關詳細介紹

文章插圖
第三步:API 網關
想一想,每一個 API 服務都需要這些功能,那能不能把這些功能集和在一起?后面就不需要給每個 API 添加同樣的功能 。減少開發時間 。
這些功能都可以集成到 API Gateway 網關中,如下圖:
10 微服務架構學習與思考:微服務網關和開源 API 網關01-以 Nginx 為基礎的 API 網關詳細介紹

文章插圖
還有,要上線服務或重構 API 服務時,這種用戶直接訪問的方式,就會造成用戶訪問出現錯誤,對用戶體驗是很大傷害 。API 網關屏蔽用戶直接訪問后端服務,它就可以平滑過渡這種發布需求或重構 API 需求 。
它還有負載均衡,后端服務可以進行相應擴展 。
二、API 網關功能通過上面介紹可以看到,API 網關可以統一后端的訪問,也就是用戶訪問后端服務必須通過 API 網關才能夠訪問到 。API 網關統一管理了后端的服務接入服務 。
它就相當于一尊門神 , 守護著后端的所有服務 。
API 網關的功能:
  • API 管理:API 上線、下線,API 路由轉發
  • 【10 微服務架構學習與思考:微服務網關和開源 API 網關01-以 Nginx 為基礎的 API 網關詳細介紹】服務治理:限流控制,超時控制,熔斷降級
  • 安全策略:統一身份認證,黑白名單機制
  • 協議轉換:REST、gRPC、Dubbo 不同協議轉換
  • API 發布策略:灰度發布,流量染色
  • 負載均衡:服務擴展,服務伸縮
其他一些功能:監控報警、鏈路追蹤、日志收集審查等 。
三、常見開源 API 網關介紹在前面寫的關于微服務文章:微服務架構學習與思考(04):微服務技術體系 一文中又提到過一些開源網關軟件 。這次再來詳細介紹下開源 API 網關軟件 。
3.1 以 Nginx 為基礎的網關以 Nginx 為基礎 , 在加上 Lua 語言來進行擴展編程的網關 。
3.1.1 OpenResty介紹:OpenResty 是一個基于 Nginx 與 Lua 的高性能 Web 平臺 , 其內部集成了大量精良的 Lua 庫、第三方模塊以及大多數的依賴項 。用于方便地搭建能夠處理超高并發、擴展性極高的動態 Web 應用、Web 服務和動態網關 。
OpenResty 官網:官網地址
github:OpenResty github
看這個介紹,OpenResty 的功能不止于網關功能,還有高性能動態 Web 應用和服務 。
它內部集成了大量精良的 Lua 庫,庫地址。
有很多 Nginx API for lua,你可以自己用 lua 來編寫相關功能 。
當然 , 它還提供一個企業級(收費服務)產品 , 提供了很多關于 API 網關功能,Web 界面的操作 。
沒有找到與開源產品功能對比 , 只有企業級產品功能介紹 。
3.1.2 KongKong 網關介紹kong 是一個高性能高可用易擴展的 API 網關和 API 服務管理的軟件,它基于 OpenResty(Nginx+Lua) 。

推薦閱讀