1. Kong簡介

那么,Kong是一個什么東東呢?它是一個開源的API網關,或者你可以認為它是一個針對API的一個管理工具。你可以在那些上游service之上,額外去實現一些功能。Kong是開源的,所以你可以在Github找到它,你現在就可以下載使用。
Kong是一款基於OpenResty(Nginx + Lua模塊)編寫的高可用、易擴展的,由Mashape公司開源的API Gateway項目。Kong是基於NGINX和Apache Cassandra或PostgreSQL構建的,能提供易於使用的RESTful API來操作和配置API管理系統,所以它可以水平擴展多個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監控。
2. Kong網關的特性
Kong網關具有以下的特性:
-
可擴展性: 通過簡單地添加更多的服務器,可以輕松地進行橫向擴展,這意味着您的平台可以在一個較低負載的情況下處理任何請求;
-
模塊化: 可以通過添加新的插件進行擴展,這些插件可以通過RESTful Admin API輕松配置;
-
在任何基礎架構上運行: Kong網關可以在任何地方都能運行。您可以在雲或內部網絡環境中部署Kong,包括單個或多個數據中心設置,以及public,private 或invite-only APIs。

-
Kong核心基於OpenResty構建,實現了請求/響應的Lua處理化;
-
Kong插件攔截請求/響應,如果接觸過Java Servlet,等價於攔截器,實現請求/響應的AOP處理;
-
Kong Restful 管理API提供了API/API消費者/插件的管理;
-
數據中心用於存儲Kong集群節點信息、API、消費者、插件等信息,目前提供了PostgreSQL和Cassandra支持,如果需要高可用建議使用Cassandra;
-
Kong集群中的節點通過gossip協議自動發現其他節點,當通過一個Kong節點的管理API進行一些變更時也會通知其他節點。每個Kong節點的配置信息是會緩存的,如插件,那么當在某一個Kong節點修改了插件配置時,需要通知其他節點配置的變更。
3. Kong網關插件
-
身份認證插件:Kong提供了Basic Authentication、Key authentication、OAuth2.0 authentication、HMAC authentication、JWT、LDAP authentication認證實現。
-
安全控制插件:ACL(訪問控制)、CORS(跨域資源共享)、動態SSL、IP限制、爬蟲檢測實現。
-
流量控制插件:請求限流(基於請求計數限流)、上游響應限流(根據upstream響應計數限流)、請求大小限制。限流支持本地、Redis和集群限流模式。
-
分析監控插件:Galileo(記錄請求和響應數據,實現API分析)、Datadog(記錄API Metric如請求次數、請求大小、響應狀態和延遲,可視化API Metric)、Runscope(記錄請求和響應數據,實現API性能測試和監控)。
-
協議轉換插件:請求轉換(在轉發到upstream之前修改請求)、響應轉換(在upstream響應返回給客戶端之前修改響應)。
-
日志應用插件:TCP、UDP、HTTP、File、Syslog、StatsD、Loggly等。
4. Kong網關請求流程
為了更好地理解系統,這是使用Kong網關的API接口的典型請求工作流程:

當Kong運行時,每個對API的請求將先被Kong命中,然后這個請求將會被代理轉發到最終的API接口。在請求(Requests)和響應(Responses)之間,Kong將會執行已經事先安裝和配置好的任何插件,授權您的API訪問操作。Kong是每個API請求的入口點(Endpoint)。
API網關和Kong能為你做些什么

API 網關可以通過實現一些中間件來解決一些問題,這些中間件的功能你就不用再到每個service中實現了。你也是知道的,不同的團隊使用不同的方式來實現了不同的微服務。
如果你不去做一些中心化和抽象化的事情,你將會死於不同的認證方式以及不同的速率限制實現,五花八門。你肯定希望避免這樣的糟糕局面。
API網關不僅可以幫你解決API的管理部分,而且還可以解決下面兩件事情:
- 分析(Analytics) – API網關可以和你的分析基礎設施保持透明的交互和通信,因為API網關是每個請求(request)的入口,必經地。API網關可以看到所有的數據,可以知道經過你的service的流量。這就相當於你有一個集中的地方,你可以把所有的這些信息push到你的監控或分析工具,比如Kibana或者Splunk。
- 自動化(Automation) –網關還有助於自動化部署,還可以幫助你實現自動化登入驗證(on boarding)。 什么是登入(on boarding)呢? 如果你有API,並且你希望有身份驗證,你可能需要一些功能可以允許用戶為該API創建登入憑據(credentials)然后開始使用(消費)API。 開發人員門戶網站或你的文檔中心等都可以與網關集成來配置這些憑據(credentials),這樣你就不用從頭開始構建一些功能了。
5. 總結
Kong作為API網關提供了API管理功能,及圍繞API管理實現了一些默認的插件,另外還具備集群水平擴展能力,從而提升整體吞吐量。Kong本身是基於OpenResty,可以在現有Kong的基礎上進行一些擴展,從而實現更復雜的特性。
雖然有一些特性Kong默認是缺失的,如API級別的超時、重試、fallback策略、緩存、API聚合、AB測試等,這些功能插件需要企業開發人員通過Lua語言進行定制和擴展。
綜上所述,Kong API網關默認提供的插件比較豐富, 適應針對企業級的API網關定位。
