HTTP API網(wǎng)關(guān)選擇之一Kong介紹
Kong是Mashape開(kāi)源的高性能高可用API網(wǎng)關(guān)和API服務(wù)管理層。它基于OpenResty,進(jìn)行API管理,并提供了插件實(shí)現(xiàn)API的AOP。Kong在Mashape 管理了超過(guò)15,000 個(gè)API,為200,000開(kāi)發(fā)者提供了每月數(shù)十億的請(qǐng)求支持。本文將從架構(gòu)、API管理、插件三個(gè)層面介紹Kong。
一、架構(gòu)
按照康威定律,我們系統(tǒng)架構(gòu)會(huì)拆的很散,系統(tǒng)由一堆服務(wù)組成,如下圖所示:
如在訪問(wèn)庫(kù)存服務(wù)、優(yōu)惠券服務(wù)、價(jià)格服務(wù)時(shí)之前都會(huì)做一些特殊處理,如限流、緩存、日志、請(qǐng)求統(tǒng)計(jì)。而這些處理幾乎是所有服務(wù)都需要的,這不就是我們常說(shuō)的AOP嘛,當(dāng)我們服務(wù)多起來(lái)的時(shí)候,應(yīng)該將這些通用處理集中到一個(gè)地方進(jìn)行管理,如下圖所示:
即通過(guò)Kong統(tǒng)一管理通用功能。
Kong的安裝請(qǐng)參考官網(wǎng)示例。Kong整體架構(gòu)如下所示:
- Kong核心基于OpenResty構(gòu)建,實(shí)現(xiàn)了請(qǐng)求/響應(yīng)的Lua處理化;
- Kong插件攔截請(qǐng)求/響應(yīng),如果接觸過(guò)Java Servlet,等價(jià)于攔截器,實(shí)現(xiàn)請(qǐng)求/響應(yīng)的AOP處理;
- Kong Restful 管理API提供了API/API消費(fèi)者/插件的管理;
- 數(shù)據(jù)中心用于存儲(chǔ)Kong集群節(jié)點(diǎn)信息、API、消費(fèi)者、插件等信息,目前提供了PostgreSQL和Cassandra支持,如果需要高可用建議使用Cassandra;
- dnsmasq用于提供給Nginx DNS解析功能;
- Kong集群中的節(jié)點(diǎn)通過(guò)gossip協(xié)議自動(dòng)發(fā)現(xiàn)其他節(jié)點(diǎn),當(dāng)通過(guò)一個(gè)Kong節(jié)點(diǎn)的管理API進(jìn)行一些變更時(shí)也會(huì)通知其他節(jié)點(diǎn)。每個(gè)Kong節(jié)點(diǎn)的配置信息是會(huì)緩存的,如插件,那么當(dāng)在某一個(gè)Kong節(jié)點(diǎn)修改了插件配置時(shí),需要通知其他節(jié)點(diǎn)配置的變更。
二、API/API消費(fèi)者/插件管理
Kong的整體流程架構(gòu)如下圖所示:
1. 添加API服務(wù)
首先我們需要通過(guò)Kong管理API向Kong注冊(cè)API服務(wù),如下所示:
- curl –I –X POST \
- --url http://kong:8001/apis/ \
- --data ‘name=queryStockService’\
- --data ‘upstream_url=http://stock.jd.local/’\
- --data ‘request_host=api.jd.com’
- --data ‘request_path=queryStock’
向Kong添加了一個(gè)API,全局***名字為queryStockService,當(dāng)我們?cè)L問(wèn)http://api.jd.com/queryStock時(shí)會(huì)upstream到http://stock.jd.local/queryStock處理,這不就是Nginx反向代理的功能,Kong實(shí)現(xiàn)了API的動(dòng)態(tài)添加。
2. 添加API消費(fèi)者
我們的API中有些是公開(kāi)的,所有人都可以訪問(wèn),而有些API是私有的,只有授權(quán)才能訪問(wèn)。在開(kāi)放平臺(tái)中,只有授權(quán)的開(kāi)發(fā)者才能訪問(wèn)API,且有些高級(jí)API是只針對(duì)部分開(kāi)發(fā)者可用,還有如對(duì)不同開(kāi)發(fā)者有不同的API調(diào)用次數(shù)限制,等等。在這些非公開(kāi)場(chǎng)景下,需要有一個(gè)API消費(fèi)者。
- curl -i -X POST \
- --url http://kong:8001/consumers/ \
- --data "username=zhangkaitao"\
其會(huì)生成一個(gè)consumer_id “e5da92dd-fbe8-4031-bebf-34c741e209b1”,添加插件章節(jié)會(huì)用到該ID。
3. 添加插件
插件可以是全局的,也可以是局部的。如限流插件,我們可以配置為全局限流。目前支持:所有API和所有消費(fèi)者、所有API和特定消費(fèi)者、所有消費(fèi)者和特定API、特定消費(fèi)者和特定API。
為queryStockService添加50次/秒的限流。特定API和所有消費(fèi)者配置。
- curl -X POSThttp://kong:8001/apis/queryStockService/plugins \
- --data "name=rate-limiting"\
- --data "config.second=50"
目前Kong的限流實(shí)現(xiàn)是基于計(jì)數(shù)器,默認(rèn)是本地限流,可以配置為如使用Redis,實(shí)現(xiàn)集群限流。
為queryStockService添加密鑰身份認(rèn)證。
- curl -i -X POST \
- --url http://kong:8001/apis/queryStockService/plugins/ \
- --data 'name=key-auth'
為消費(fèi)者添加秘鑰。
- curl -i -X POST \
- --url http://kong:8001/consumers/zhangkaitao/key-auth/\
- --data 'key=myKey'
通過(guò)秘鑰訪問(wèn)API。
- curl -i -X GET \
- --url http://api.jd.com/queryStock \
- --header "Host: api.jd.com"\
- --header "apikey: myKey"
特定API和特定消費(fèi)者限流,需要配合身份認(rèn)證模塊。
- curl -X POST http://kong:8001/apis/abc/plugins \
- --data "name=rate-limiting"\
- --data "consumer_id=e5da92dd-fbe8-4031-bebf-34c741e209b1"\
- --data "config.second=1"
到此添加API、添加API消費(fèi)、添加API插件就介紹完了。
三、Kong默認(rèn)插件
身份認(rèn)證:Kong提供了Basic Authentication、Key authentication、OAuth2.0 authentication、HMAC authentication、JWT、LDAP authentication認(rèn)證實(shí)現(xiàn)。
安全:ACL(訪問(wèn)控制)、CORS(跨域資源共享)、動(dòng)態(tài)SSL、IP限制、爬蟲(chóng)檢測(cè)實(shí)現(xiàn)。
流量控制:請(qǐng)求限流(基于請(qǐng)求計(jì)數(shù)限流)、上游響應(yīng)限流(根據(jù)upstream響應(yīng)計(jì)數(shù)限流)、請(qǐng)求大小限制。限流支持本地、Redis和集群限流模式。
分析監(jiān)控:Galileo(記錄請(qǐng)求和響應(yīng)數(shù)據(jù),實(shí)現(xiàn)API分析)、Datadog(記錄API Metric如請(qǐng)求次數(shù)、請(qǐng)求大小、響應(yīng)狀態(tài)和延遲,可視化API Metric)、Runscope(記錄請(qǐng)求和響應(yīng)數(shù)據(jù),實(shí)現(xiàn)API性能測(cè)試和監(jiān)控)。
轉(zhuǎn)換:請(qǐng)求轉(zhuǎn)換(在轉(zhuǎn)發(fā)到upstream之前修改請(qǐng)求)、響應(yīng)轉(zhuǎn)換(在upstream響應(yīng)返回給客戶端之前修改響應(yīng))。
日志:TCP、UDP、HTTP、File、Syslog、StatsD、Loggly等。
也可以開(kāi)發(fā)自己的插件,如緩存等。
四、總結(jié)
Kong作為API網(wǎng)關(guān)提供了API管理功能,及圍繞API管理實(shí)現(xiàn)了一些默認(rèn)的插件,另外還具備集群水平擴(kuò)展能力,從而提升整體吞吐量。Kong本身是基于OpenResty,可以在現(xiàn)有Kong的基礎(chǔ)上進(jìn)行一些擴(kuò)展,從而實(shí)現(xiàn)更復(fù)雜的特性。
有一些特性Kong默認(rèn)是缺失的,如API級(jí)別的超時(shí)、重試、fallback策略、緩存、API聚合、ABTest等,這些需要開(kāi)發(fā)者自己定制和擴(kuò)展。
如果你要做開(kāi)放平臺(tái),你要做HTTP API網(wǎng)關(guān),Kong是您的一個(gè)選擇。
【本文是51CTO專欄作者張開(kāi)濤的原創(chuàng)文章,作者微信公眾號(hào):開(kāi)濤的博客( kaitao-1234567)】