業界有很多流行的 API 網關,開源的有 Nginx、Netflix Zuul、Kong 等。當然 Kong 還有商業版,類似的商業版網關還有 GoKu API Gateway 和 Tyk 等。
GoKu API Gateway 是由國內公司 eolinker 使用 Go 語言研發,擁有社區版和商業版,包含 API Gateway 和 Dashboard 兩部分。其中社區版本包含大量基礎功能,可以滿足中型企業和產品的使用;企業版本包含更多擴展;比較適合大型軟件和大型組織使用。
Tyk 由國外的 TykTechnologies 公司研發,也是基于 Go 語言。Tyk 一切均導向收費版本,免費版本第一次申請有一年的使用授權。
下面將會介紹常用的 API 網關組件 Nginx、Zuul 和 Kong 的相關特性。
Nginx
Nginx 可以說是互聯網應用的標配組件,主要的使用場景包括負載均衡、反向代理、代理緩存、限流等。
Nginx 由內核和模塊組成,內核的設計非常微小和簡潔,完成的工作也非常簡單,僅僅通過查找配置文件與客戶端請求進行 URL 匹配,用于啟動不同的模塊去完成相應的工作。
Nginx 在啟動后,會有一個 Master 進程和多個 Worker 進程,Master 進程和 Worker 進程之間是通過進程間通信進行交互的,如圖所示。Worker 工作進程的阻塞點是在像 select()、epoll_wait() 等這樣的 I/O 多路復用函數調用處,以等待發生數據可讀 / 寫事件。Nginx 采用了異步非阻塞的方式來處理請求,也就是說,Nginx 是可以同時處理成千上萬個請求的。
還可以將 Lua 嵌入到 Nginx 中,從而可以使用 Lua 來編寫腳本,這樣就可以使用 Lua 編寫應用腳本,部署到 Nginx 中運行,即 Nginx 變成了一個 Web 容器;這樣開發人員就可以使用 Lua 語言開發高性能Web應用了。在開發的時候使用 OpenResty 來搭建開發環境,OpenResty 將 Nginx 核心、LuaJIT、許多有用的 Lua 庫和 Nginx 第三方模塊打包在一起;這樣只需要安裝 OpenResty,不需要了解 Nginx 核心和寫復雜的 C/C++ 模塊就可以,只需要使用 Lua 語言進行 Web 應用開發了。
使用 Nginx 的反向代理和負載均衡可實現負載均衡及高可用,除此之外還需要我們解決自注冊和網關本身的擴展性。
Springcloud-gateway
Spring Cloud Gateway 是 Spring Cloud 微服務生態下的網關組件。Spring Cloud Gateway 是基于 Spring 5 和 Spring Boot 2 搭建的
Netflix Zuul
Zuul 是 Netflix 開源的微服務網關組件,它可以和 Eureka、Ribbon、Hystrix 等組件配合使用。社區活躍,融合于 SpringCloud 完整生態,是構建微服務體系前置網關服務的最佳選型。Zuul 的核心是一系列的過濾器,這些過濾器可以完成以下功能:
- 身份認證與安全:識別每個資源的驗證要求,并拒絕那些與要求不符的請求。
- 審查與監控:與邊緣位置追蹤有意義的數據和統計結果,從而帶來精確的生產視圖。
- 動態路由:動態地將請求路由到不同的后端集群。
- 壓力測試:逐漸增加指向集群的流量,以了解性能。
- 負載分配:為每一種負載類型分配對應容量,并棄用超出限定值的請求。
- 靜態響應處理:在邊緣位置直接建立部分響應,從而避免其轉發到內部集群。
- 多區域彈性:跨越 AWS Region 進行請求路由,旨在實現 ELB(Elastic Load Balancing,彈性負載均衡)使用的多樣化,以及讓系統的邊緣更貼近系統的使用者。
上面提及的這些特性是 Nigix 所沒有的,Netflix 公司研發 Zuul 是為了解決云端的諸多問題(特別是幫助 AWS 解決跨 Region 情況下的這些特性實現),而不僅僅是做一個類似于 Nigix 的反向代理,當然,我們可以僅使用反向代理功能,這里不多做描述。
Zuul 目前有兩個大的版本:Zuul1 和 Zuul2。
- Zuul1 是基于 Servlet 框架構建,如圖所示,采用的是阻塞和多線程方式,即一個線程處理一次連接請求,這種方式在內部延遲嚴重、設備故障較多情況下會引起存活的連接增多和線程增加的情況發生。
- Netflix 發布的 Zuul2 有重大的更新,它運行在異步和無阻塞框架上,每個 CPU 核一個線程,處理所有的請求和響應,請求和響應的生命周期是通過事件和回調來處理的,這種方式減少了線程數量,因此開銷較小。
Kong
Kong 是 Mashape 開源的高性能高可用 API 網關和 API 服務管理層,一款基于 Nginx_Lua 模塊寫的高可用服務網關,由于 Kong 是基于 Nginx 的,所以可以水平擴展多個 Kong 服務器。通過前置的負載均衡配置把請求均勻地分發到各個 Server,來應對大批量的網絡請求。
Nginx、Zuul 和 Kong 這三種 API 網關組件的功能和特性,并制作了如下的對比表格:
組件/指標 | Nginx | Zuul(1.x)/springcloud gateway | Kong 社區版 |
---|---|---|---|
API 注冊/動態路由 | 在Nginx中配置 | 動態路由 | 通過 Admin API 管理 |
支持協議 | RESTful API | RESTful API | RESTful API |
插件機制 | Lua 插件機制 | 可以基于源碼定制開發,基于 Servlet/Filter | Lua 插件機制 |
安全認證 & 鑒權 | 插件支持 | 支持 OAuth、JWT 等 | 支持OAuth2.0、黑白名單、ACL、JWT、SSL 等 |
限流 | 插件 | 插件 | 支持Rate Limiting |
高可用集群 | 配合硬件負載均衡 | 可以通過部署多個 Zuul 做負載均衡 | 支持集群 |
可管理性 | 無 | 沒有 GUI 管理臺 | 提供 Rest API 交互 |
性能 | 高 | 一般 | 高 |
日志記錄 | Nginx 可靈活記日志 | 可自行配置 | 日志可以記錄到磁盤,或者HTTP、TCP、UDP發出去 |
總得來說,Zuul 復雜度較低,上手簡單,可以自定義開發,但是高并發場景下的性能相對較差;Nginx 性能經受得住考驗,配合 Lua 可以引入各種插件,但是功能性相對較弱,需要開發者自身去完善很多功能;Kong 基于 Nginx、OpenResty 和 Lua,對性能要求高,需要對外開放,建議考慮使用 Kong。下面我們將重點介紹。
Kong網關介紹:
- 為什么需要云原生網關?
- Kong 介紹
- Kong 的基本架構
- 使用 Kong 構建服務網關
- 幾種常用插件應用
- 自定義插件的實踐
為什么需要 API 網關?
當使用單體應用程序架構時,客戶端(Web 或移動端)通過向后端應用程序發起一次 REST 調用來獲取數據。負載均衡器將請求路由給 N 個相同的應用程序實例中的一個。然后應用程序會查詢各種數據庫表,并將響應返回給客戶端。微服務架構下,單體應用被切割成多個微服務,如果將所有的微服務直接對外暴露,勢必會出現安全方面的各種問題。
客戶端可以直接向每個微服務發送請求,其問題主要如下:
- 客戶端需求和每個微服務暴露的細粒度 API 不匹配。
- 部分服務使用的協議不是Web友好協議??赡苁褂?Thrift 二進制 RPC,也可能使用 AMQP 消息傳遞協議。
- 微服務難以重構。如果合并兩個服務,或者將一個服務拆分成兩個或更多服務,這類重構就非常困難了。
服務端的各個服務直接暴露給客戶端調用勢必會引起各種問題。同時,服務端的各個服務可擴展和伸縮性很差。API 網關是微服務架構中的基礎組件,位于接入層之下和業務服務層之上,如前所述的這些功能適合在 API 網關實現。
關于服務網關的開源組件,有 Netflix Zuul、Spring Cloud Gateway、Kong、Traefik、NGINX 和服務網關類型的 Envoy 等。我們現在使用的是可編程的新型網關:Spring Cloud Gateway, Spring Cloud Gateway是基于WebFlux異步編程技術。本文主要介紹現代微服務網關 Kong,在 Kong 的官網介紹中,第一條特性便是 Kong 的云原生屬性:與平臺無關,Kong 可以從裸機運行到 Kubernetes。本文基于 Kong 1.2.1,自定義插件部分會涉及部分 Lua 編碼,適合服務端開發和運維人員。
-
什么是 Kong
當我們決定對應用進行微服務改造時,應用客戶端如何與微服務交互的問題也隨之而來,畢竟服務數量的增加會直接導致部署授權、負載均衡、通信管理、分析和改變的難度增加。
面對以上問題,API GATEWAY是一個不錯的解決方案,其所提供的訪問限制、安全、流量控制、分析監控、日志、請求轉發、合成和協議轉換功能,可以解放開發者去把精力集中在具體邏輯的代碼,而不是把時間花費在考慮如何解決應用和其他微服務鏈接的問題上。
-
為什么使用Kong
在眾多 API GATEWAY 框架中,Mashape 開源的高性能高可用API網關和API服務管理層——KONG(基于 NGINX)特點尤為突出,它可以通過插件擴展已有功能,這些插件(使用 lua 編寫)在API請求響應循環的生命周期中被執行。于此同時,KONG本身提供包括 HTTP 基本認證、密鑰認證、CORS、TCP、UDP、文件日志、API請求限流、請求轉發及 NGINX 監控等基本功能。目前,Kong 在 Mashape 管理了超過 15,000 個 API,為 200,000 開發者提供了每月數十億的請求支持。
Kong 的基本架構
Kong 是基于 Nginx 的,所以可以水平擴展多個 Kong 服務器。通過前置的負載均衡配置把請求均勻地分發到各個 Server,來應對大批量的網絡請求。
Kong 主要有三個組件:
- Kong Server :基于nginx的服務器,用來接收 API 請求。
- Apache Cassandra/PostgreSQL:用來存儲操作數據。
- Kong dashboard:官方推薦 UI 管理工具,當然,也可以使用 restfull 方式管理 admin api。
Kong 采用插件機制進行功能定制,插件集(可以是 0 或 N 個)在 API 請求響應循環的生命周期中被執行。插件使用 Lua 編寫,基礎功能包括:HTTP 基本認證、密鑰認證、CORS(Cross-Origin Resource Sharing,跨域資源共享)、TCP、UDP、文件日志、API 請求限流、請求轉發以及 Nginx 監控等。
Kong 網關具有以下的特性:
- 可擴展性: 通過簡單地添加更多的服務器,可以輕松地進行橫向擴展,這意味著您的平臺可以在一個較低負載的情況下處理任何請求;
- 模塊化: 可以通過添加新的插件進行擴展,這些插件可以通過RESTful Admin API輕松配置;
- 在任何基礎架構上運行: Kong 網關可以在任何地方都能運行??梢栽谠苹騼炔烤W絡環境中部署 Kong,包括單個或多個數據中心設置,以及 public,private 或 invite-only APIs。
常用概念
Kong 中常用的術語介紹,這些術語會在下面的實踐中經常用到。
- Route:請求的轉發規則,按照 Hostname 和 PATH,將請求轉發給 Service;
- Services:多個 Upstream 的集合,是 Route 的轉發目標;
- Consumer:API 的用戶,記錄用戶信息;
- Plugin:插件,可以是全局的,也可以綁定到 Service、Router 或者 Consumer;
- Certificate:https 配置的證書;
- Sni:域名與 Certificate 的綁定,指定了一個域名對應的 https 證書;
- Upstream:上游對象用來表示虛擬主機名,擁有多個服務(目標)時,會對請求進行負載均衡;
- Target:最終處理請求的 Backend 服務。
使用 Kong 構建服務網關
客戶端的請求將會首先經由微服務網關處理,一些通用的功能切面將會在網關生效,即 Kong 中的插件,之后才會將請求進行轉發到對應的 Backend 服務,如下圖所示。
安裝實踐
目前 Kong 的最新版本 1.2,Kong 的安裝支持多種方式。官方支持如下列出方式的安裝:
除了官方提供的安裝方式,還有社區提供的安裝方式,詳細了解參見:https://konghq.com/install/。
一、安裝Kong
1.構建 Kong 的容器網絡
首先我們創建一個 Docker 自定義網絡,以允許容器相互發現和通信。在下面的創建命令中 kong-net 是我們創建的 Docker 網絡名稱。
docker network create kong-net
2.搭建數據庫環境
Kong 目前使用 Cassandra 或者 PostgreSQL,你可以執行以下命令中的一個來選擇你的 Database。請注意定義網絡 --network=kong-net 。
使用 PostgreSQL:
docker pull postgres:9.6
docker run -d --name kong-database \\
--network=kong-net \\
-p 5432:5432 \\
-e "POSTGRES_USER=kong" \\
-e "POSTGRES_DB=kong" \\
-e "POSTGRES_PASSWORD=kong" \\
postgres:9.6
3.初始化或者遷移數據庫
我們使用 docker run --rm 來初始化數據庫,該命令執行后會退出容器而保留內部的數據卷(volume)。這個命令我們還是要注意的,一定要跟你聲明的網絡,數據庫類型、host 名稱一致。
下面指定的數據庫是 PostgreSQL:
docker run --rm \\
--network=kong-net \\
-e "KONG_DATABASE=postgres" \\
-e "KONG_PG_HOST=kong-database" \\
-e "KONG_PG_PASSWORD=kong" \\
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \\
kong:1.5.1 kong migrations bootstrap
4.啟動 Kong 容器
完成初始化或者遷移數據庫后,我們就可以啟動一個連接到數據庫容器的 Kong 容器,請務必保證你的數據庫容器啟動狀態,同時檢查所有的環境參數 -e 是否是你定義的環境。
docker pull kong:1.5.1
docker run -d --name kong \\
--network=kong-net \\
-e "KONG_DATABASE=postgres" \\
-e "KONG_PG_HOST=kong-database" \\
-e "KONG_PG_PASSWORD=kong" \\
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \\
-e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \\
-e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \\
-e "KONG_PROXY_ERROR_LOG=/dev/stderr" \\
-e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \\
-e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \\
-p 8000:8000 \\
-p 8443:8443 \\
-p 8001:8001 \\
-p 8444:8444 \\
kong:1.5.1
Kong 默認綁定 4 個端口:
8000:用來接收客戶端的 HTTP 請求,并轉發到 upstream。
8443:用來接收客戶端的 HTTPS 請求,并轉發到 upstream。
8001:HTTP 監聽的 API 管理接口。
8444:HTTPS 監聽的 API 管理接口。
到這里,Kong 已經安裝完畢,我們可以使用 docker ps 命令查看當前運行容器,正常情況下可以看到 Kong 和 PostgreSQL 的兩個容器:
docker ps
我們可以通過 curl -i http://192.168.1.200:8001 來查看 Kong 是否運行完好。
二、安裝Kong UI
Kong 企業版提供了管理 UI,開源版本是沒有的。但是有很多的開源的管理 UI ,其中比較流行的有Kong Dashboard 和 Konga。簡單介紹一下 Kong Dashboard 和 Konga。
1.Kong Dashboard
docker 環境中安裝運行如下:
docker pull pgbi/kong-dashboard
docker run --rm \\
--network=kong-net \\
-p 8080:8080 \\
pgbi/kong-dashboard start \\
--kong-url http://kong:8001
啟動之后,可以在瀏覽器中輸入 http://192.168.1.200:8080/ 來訪問 Kong Dashboard 管理界面。
2.Konga
Konga(官網地址:pantsel.github.io/konga/,Github地址:github.com/pantsel/kon… )可以很好地通過 UI 觀察到現在 Kong 的所有的配置,并且可以對于管理Kong節點情況進行查看、監控和預警。Konga主要是用 AngularJS 寫的,運行于 nodejs 服務端。具有以下特性:
- 管理所有 Kong Admin API 對象。
- 支持從遠程源(數據庫,文件,API等)導入使用者。
- 管理多個 Kong 節點。使用快照備份,還原和遷移 Kong 節點。
- 使用運行狀況檢查監視節點和 API 狀態。
- 支持電子郵件和閑置通知。
- 支持多用戶。
- 易于數據庫集成(MySQL,PostgresSQL,MongoDB,SQL Server)。
下面使用的 PostgreSQL 是和上面在 docker 環境中安裝 Kong 時的是一致的,注意用戶名、密碼、數據庫名稱等配置,docker 環境安裝啟動 Konga:
docker pull pantsel/konga
docker run -d -p 1337:1337 \\
--network kong-net \\
--name konga \\
-e "DB_ADAPTER=postgres" \\
-e "DB_URI=postgresql://kong:kong@kong-database/kong" \\
pantsel/konga
如果 Konga 容器啟動成功,可以通過 http://192.168.1.200:1337/ 訪問管理界面。通過注冊后進入,然后在 CONNECTIONS 中添加 Kong 服務的管理路徑 http://192.168.1.200:8001。Konga 管理界面示例如下:
-
網關
+關注
關注
9文章
4558瀏覽量
51301 -
API
+關注
關注
2文章
1507瀏覽量
62217 -
nginx
+關注
關注
0文章
151瀏覽量
12195 -
go語言
+關注
關注
1文章
158瀏覽量
9059
發布評論請先 登錄
相關推薦
評論