Kong(一)

Kong最佳實踐(一)- Kong網(wǎng)關初體驗

簡介

在本篇文章中跨新,我們會帶大家進入API網(wǎng)關Kong的世界,對比于傳統(tǒng)網(wǎng)關慧库,Kong網(wǎng)關的優(yōu)勢體現(xiàn)在哪旺芽、會給我們架構帶來了哪些變化、大型公司是如何使用Kong網(wǎng)關解決痛點問題擅这、對于運維人員來說進行二次開發(fā)功能與維護服務的成本如何等等澈魄,本篇文章均會一一講述,文章的大致內(nèi)容包括:

  1. 發(fā)展歷程
  2. 網(wǎng)關由來 & 網(wǎng)關演化過程
  3. Kong網(wǎng)關優(yōu)缺點
  4. Kong網(wǎng)關架構
  5. 配置方式 & 存儲模式
  6. 運維成本
  7. 企業(yè)應用場景
  8. 未來發(fā)展歷程

1 發(fā)展歷程

發(fā)展歷程圖.png

Kong最初起源于2009年7月仲翎,Augusto痹扇、MarcoMichele三人在意大利的一個小車庫中溯香,開發(fā)出了Mashup平臺[1]鲫构;在七年的時間內(nèi),Mashup平臺占據(jù)了API市場的主導地位玫坛,2017年5月结笨,三人將Mashup平臺中的產(chǎn)品出售給RapidAPI[2];10月,Mashape改名為Kong炕吸,并推出了Kong Enterprise [3]伐憾,2018年Kong第一家公司成立,并發(fā)布了Kong1.0版本算途,隨后塞耕,Kong進一步擴張版圖,收購了lnsomnia[4]嘴瓤,并推出Kuma[5]等新產(chǎn)品扫外。

2 網(wǎng)關由來 & 網(wǎng)關演化過程

2.1 網(wǎng)關由來

網(wǎng)關其實我們并不陌生,在我們所熟知的前后端分離架構中就涉及到了網(wǎng)關廓脆,例如筛谚,前端頁面調(diào)用后端API接口進行交互,傳統(tǒng)做法中停忿,我們使用Nginx反向代理暴露后端接口驾讲,當我們需要對某個后端接口做一些定制時,會使用Nginx對應的模塊來實現(xiàn)席赂,而現(xiàn)代網(wǎng)關的做法就是在傳統(tǒng)的基礎上加以改進吮铭,在網(wǎng)關層中引入鑒權日志颅停、熔斷谓晌、限流等這些通用功能。

2.2 網(wǎng)關演化過程

網(wǎng)關演化過程.png

從圖中我們可以看出癞揉,這一整套系統(tǒng)中包含多個業(yè)務模塊纸肉,隨著業(yè)務逐漸發(fā)展,這些業(yè)務模塊拆解成多個微服務喊熟,分離部署柏肪,雖然這樣減輕了每個服務的壓力,同時也增加一些業(yè)務外的工作芥牌,例如烦味,當我們需要對多個業(yè)務添加鑒權、日志等一些通用功能時壁拉,我們就需要對每一個業(yè)務模塊單獨添加拐叉,這樣顯得非常繁瑣。在這樣的體系下扇商,網(wǎng)關產(chǎn)品就能夠很輕松地幫我們解決這些問題,并統(tǒng)一管理這些功能宿礁。

2.2.1 傳統(tǒng)網(wǎng)關方式
傳統(tǒng)網(wǎng)關方式圖.png

從圖中我們可以看出案铺,每個服務都重復添加相同的功能,顯得極為繁瑣梆靖,同時給服務的統(tǒng)一管理增加了難度控汉,在此體系下笔诵,鑒權、限流姑子、日志乎婿、監(jiān)控等通用功能需要在每個服務中單獨實現(xiàn),這使得維護者沒有一個全局的視圖來統(tǒng)一管理這些功能街佑。

2.2.2 Kong 網(wǎng)關方式
Kong網(wǎng)關方式圖.png

從圖中我們可以清晰地看到谢翎,Kong網(wǎng)關中統(tǒng)一管理了這些通用功能,相較于傳統(tǒng)網(wǎng)關模式沐旨,每個微服務不需要重復添加相同的功能森逮,并且方便后期維護。

3 Kong網(wǎng)關優(yōu)缺點

3.1 優(yōu)點

  1. 可安裝于多操作系統(tǒng)磁携,開箱即用褒侧;
  2. 快速入門,啟動簡單谊迄;
  3. 適用于云原生環(huán)境闷供;
  4. 快速升級,操作簡單统诺;
  5. 配置項注解清晰歪脏、易懂;
  6. 自帶健康檢查功能篙议;
  7. 內(nèi)置支持集群模式唾糯;
  8. 插件功能豐富,易定制化鬼贱。

3.2 缺點

  1. 不支持常用MySql數(shù)據(jù)庫移怯,僅支持PostgreSQL與Cassandra數(shù)據(jù)庫;
  2. 在不修改源碼的情況下这难,無法自定義Nginx配置文件舟误,重啟后重新初始化所有變更的Nginx配置文件。

4 Kong網(wǎng)關架構

4.1 單節(jié)點架構

單節(jié)點架構圖.png

結構簡單姻乓,僅需單個節(jié)點嵌溢。

4.2 多節(jié)點架構

多節(jié)點架構圖.png

Kong內(nèi)置支持集群模式,可以通過添加更多節(jié)點實現(xiàn)橫向水平擴展蹋岩,處理更多流量赖草,各節(jié)點指向相同數(shù)據(jù)源,共享相同配置剪个,在Kong集群上游需安裝負載均衡器秧骑,以便在各節(jié)點間分配流量。

4.3 高可用架構

高可用架構圖.png

高可用的意義在于減少系統(tǒng)停機的時間,從而保持其服務的高度可用性乎折,圖中的這套架構中绒疗,我們借助了Keeplived[6] VIP漂移功能,保證了單個機器宕機時骂澄,系統(tǒng)也能正常使用吓蘑。

5 配置方式 & 存儲模式

5.1 配置方式

5.1.1 API 配置方式

特征如下:

  1. 通過調(diào)用API的方式,能夠更友好的集成進用戶自定義的系統(tǒng)中坟冲;
  2. 易于配置實體磨镶,當實體增多時,配置文件過于復雜樱衷,通過API調(diào)用簡單直觀棋嘲;
  3. 修改后不需要重啟服務即能生效
5.1.2 聲明式配置[7]方式

特征如下:

  1. 在單個 YAML 或 JSON 文件中整合整個 Kong 配置矩桂,以減少出錯的可能性并簡化管理沸移;
  2. 降低配置實體的復雜性,配置文件中將會清晰羅列出實體間的層次關系侄榴。

5.2 存儲模式

5.2.1 無DB存儲模式

特征如下:

  1. 創(chuàng)建的配置數(shù)據(jù)存儲于內(nèi)存中雹锣,機器宕機重啟后,配置數(shù)據(jù)會根據(jù)配置文件重新加載癞蚕;
  2. 該模式不支持API調(diào)用方式修改配置蕊爵;
  3. 消除了對數(shù)據(jù)庫的依賴,利于快速搭建桦山,不利于集群擴展攒射。
5.2.2 DB存儲模式

特征如下:

  1. 創(chuàng)建的配置數(shù)據(jù)存儲于數(shù)據(jù)庫中,機器宕機重啟后恒水,配置數(shù)據(jù)不丟失会放;
  2. 配置數(shù)據(jù)可控,利于集群擴展钉凌。

6 運維成本

6.1 使用成本

Kong開箱即用咧最,Docker安裝方式非常簡單,安裝過程中我們數(shù)據(jù)庫使用PostgreSQL9.6版本

# 創(chuàng)建網(wǎng)絡
docker network create kong-net
# 創(chuàng)建一個PostgreSQL數(shù)據(jù)庫
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
# 初始化數(shù)據(jù)庫
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:latest kong migrations bootstrap
# 啟動Kong
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 127.0.0.1:8001:8001 -p 127.0.0.1:8444:8444 kong:latest

安裝完成后御雕,我們只需訪問localhost:8001矢沿,就可以看到Kong啟動成功:

{
  +  plugins:{...},
      tagline:  "Welcome to kong",
  +  configuration:{...},
      version:  "1.2.1",
      node_id:  "22d7aed7-1d9b-4696-8aec-69d49a0aa98c",
      lua_version:  "LuaJIT 2.1.0-beta3",
  +  prng_seeds:{...},
  +  timers:{...},
      hostname:  "kong
}

CentOS安裝方式更為簡便

# 安裝
wget https://bintray.com/kong/kong-rpm/download_file?file_path=centos/7/kong-2.0.4.el7.amd64.rpm
rpm -ivh download_file\?file_path\=centos%2F7%2Fkong-2.0.4.el7.amd64.rpm
# 修改配置文件
cp /etc/kong/kong.conf.default /etc/kong/kong.conf
echo "database = off" >> /etc/kong/kong.conf
# 啟動
kong start

6.2 開發(fā)成本

Kong由Lua[8]編寫而成,對于二次開發(fā)Kong插件功能來說酸纲,減少了開發(fā)人員的開發(fā)時間捣鲸,降低學習成本。Kong 插件可以當作是一組Lua模塊闽坡,寫完一個簡單模塊就能立即在現(xiàn)有的環(huán)境中加載使用摄狱,開發(fā)周期短脓诡。測試也非常方便。

6.3 維護成本

Kong 本身支持 prometheushttp-log 插件媒役,可以很好的集成進ELK[9]與Grafana[10]之中。prometheus插件中監(jiān)控指標較為齊全宪迟,對于代理的延遲酣衷、緩存、請求率支持的相當完善次泽;http-log插件中日志信息較為詳細穿仪,能夠準確快速的定位詳細的問題

7 企業(yè)應用場景

7.1 SoulCycle[11]公司案例

背景:SoulCycle公司在制定目標時意荤,需要利用技術與合作伙伴更好地集成啊片,并能夠擴展到新的業(yè)務模式。SoulCycle的整體架構在服務開發(fā)與可伸縮性中有非常大的困難玖像。2019年使用網(wǎng)關產(chǎn)品Kong來解決其整體架構中開發(fā)與可伸縮性問題紫谷。

解決方案:

  • Kong與Kubernetes支持30多種微服務和9種環(huán)境
  • 單一API平臺統(tǒng)一了跨多云的Kubernetes微服務和整體
  • 具有高可用性Kong集群的水平和垂直縮放

結果:

  • AWS[12]和GCP[13]中跨服務的無縫通信
  • 可在所有環(huán)境中水平擴展

7.2 Digicel [14] 公司案例

背景:Digicel于2001年在牙買加成立,為客戶提供最佳網(wǎng)絡捐寥、服務和價值笤昨。為了保持競爭力并滿足日益增長的客戶對全數(shù)字服務的需求,致力于在法屬的西印度群島地區(qū)啟用全數(shù)字移動網(wǎng)絡握恳。2020年使用網(wǎng)關產(chǎn)品Kong 完成微服務架構轉型瞒窒。

解決方案:

  • 使用Kong Enterprise作為API網(wǎng)關,包括身份驗證乡洼、日志記錄崇裁、指標和相關插件

結果:

  • 加快上市時間
  • 改善服務觀

8 未來發(fā)展歷程

Kong公司在2019年就宣布了許多新產(chǎn)品開發(fā)。在官網(wǎng)中束昵,Kong部署方式增加了許多拔稳,更多的傾向于微服務架構之中,例如:與Kubernetes結合:通過使用Kong作為入口控制器來擁有整個Kubernetes集群妻怎。Kuma:通過基于Envoy的Service Mesh[15]壳炎,降低了復雜性并提高了服務可靠性。相信在未來逼侦,Kong網(wǎng)關會更多的向Faas[16]方向發(fā)展匿辩。


注解:


  1. Mashup平臺:Kong 最初的原型。Augusto榛丢、Marco铲球、Michele為三位創(chuàng)始人。 ?

  2. RapidAPI:RapidAPI成立于2014年11月晰赞,致力于幫助開發(fā)者尋找稼病、測試和管理希望集成至應用的 API(應用程序接口)选侨。 ?

  3. Kong Enterprise:Kong的企業(yè)版本。 ?

  4. lnsomnia:是一個跨平臺的 REST API 客戶端然走,基于 Electron 而構建援制。 ?

  5. Kuma:新的、開源的芍瑞、通用的服務網(wǎng)格晨仑。 ?

  6. Keeplived:作用是檢測服務器的狀態(tài),如果有一臺web服務器宕機拆檬,或工作出現(xiàn)故障洪己,Keepalived將檢測到,并將有故障的服務器從系統(tǒng)中剔除竟贯,同時使用其它服務器代替該服務器的工作答捕,當服務器工作正常后Keepalived自動將服務器加入到服務器群中,這些工作全部自動完成屑那,不需要人工干涉拱镐,需要人工做的只是修復故障的服務器。 ?

  7. 聲明式配置:關鍵思想在于聲明式概念齐莲,而不是命令性配置痢站。 ?

  8. Lua:是一個小巧的腳本語言,可以很容易被C/C++調(diào)用选酗,也可以反過來調(diào)用C/C++方法阵难,它不僅可以作為腳本語言、也可以作為普通的配置文件芒填、代替XML呜叫、ini等,文件格式更容易理解與維護殿衰,Lua是由標準C編寫而成朱庆,代碼簡潔優(yōu)美,它是巴西里約熱內(nèi)盧天主教大學(Pontifical Catholic University of Rio de Janeiro)里的一個由Roberto Ierusalimschy闷祥、Waldemar Celes 和 Luiz Henrique de Figueiredo三人所組成的研究小組于1993年開發(fā)的娱颊。 ?

  9. ELK:Elasticsearch、Logstash 和 Kibana 的簡稱凯砍,是一套日志分析系統(tǒng)箱硕。 ?

  10. Grafana:是一款采用 go 語言編寫的開源應用,主要用于大規(guī)模指標數(shù)據(jù)的可視化展現(xiàn)悟衩,是網(wǎng)絡架構和應用分析中最流行的時序數(shù)據(jù)展示工具剧罩,目前已經(jīng)支持絕大部分常用的時序數(shù)據(jù)庫。 ?

  11. SoulCycle:是一家總部位于紐約的健身公司座泳,提供室內(nèi)自行車鍛煉課程惠昔。 ?

  12. AWS:亞馬遜公司旗下云計算服務平臺幕与,為全世界各個國家和地區(qū)的客戶提供一整套基礎設施和云解決方案。 ?

  13. GCP:Google云端平臺(英文:Google Cloud Platform)镇防。 ?

  14. Digicel:加勒比海地區(qū)移動電話網(wǎng)絡和家庭娛樂的提供商啦鸣。 ?

  15. Service Mesh: 一種微服務的基礎架構。 ?

  16. FaaS:Function as a service(函數(shù)即服務)来氧,無服務器計算赏陵,當前使用最廣泛的是AWS的Lambada。 ?

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末饲漾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子缕溉,更是在濱河造成了極大的恐慌考传,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件证鸥,死亡現(xiàn)場離奇詭異僚楞,居然都是意外死亡,警方通過查閱死者的電腦和手機枉层,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門泉褐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鸟蜡,你說我怎么就攤上這事膜赃。” “怎么了揉忘?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵跳座,是天一觀的道長。 經(jīng)常有香客問我泣矛,道長疲眷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任您朽,我火速辦了婚禮狂丝,結果婚禮上,老公的妹妹穿的比我還像新娘哗总。我一直安慰自己几颜,他們只是感情好,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布魂奥。 她就那樣靜靜地躺著菠剩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耻煤。 梳的紋絲不亂的頭發(fā)上具壮,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天准颓,我揣著相機與錄音,去河邊找鬼棺妓。 笑死攘已,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的怜跑。 我是一名探鬼主播样勃,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼性芬!你這毒婦竟也來了峡眶?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤植锉,失蹤者是張志新(化名)和其女友劉穎辫樱,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俊庇,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡狮暑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了辉饱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搬男。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖彭沼,靈堂內(nèi)的尸體忽然破棺而出玫锋,到底是詐尸還是另有隱情祥绞,我是刑警寧澤驮审,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布棉钧,位于F島的核電站,受9級特大地震影響挺益,放射性物質(zhì)發(fā)生泄漏歉糜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一望众、第九天 我趴在偏房一處隱蔽的房頂上張望匪补。 院中可真熱鬧,春花似錦烂翰、人聲如沸夯缺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽踊兜。三九已至,卻和暖如春佳恬,著一層夾襖步出監(jiān)牢的瞬間捏境,已是汗流浹背于游。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留垫言,地道東北人贰剥。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像筷频,于是被迫代替她去往敵國和親蚌成。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355