Kong是Mashape開源的高性能高可用API網關和API服務管理層。它基於OpenResty,進行API管理,並提供了插件實現API的AOP。Kong在Mashape 管理了超過15,000 個API,爲200,000開發者提供了每個月數十億的請求支持。本文將從架構、API管理、插件三個層面介紹Kong。node
按照康威定律,咱們系統架構會拆的很散,系統由一堆服務組成,以下圖所示:
庫存服務、優惠券服務、價格服務時以前都會作一些特殊處理,如限流、黑白名單,日誌、請求統計。而這些處理幾乎是全部服務都須要的,這不就是咱們常說的AOP嘛,當咱們服務多起來的時候,應該將這些通用處理集中到一個地方進行管理,以下圖所示:
和下圖有點類似:
nginx
1.開源,雲原生(Cloud-Native),ServiceMesh,快速,彈性,RESTful還有分佈式微服務的抽象層
2.基於NGINX構建的網關,擁有更高的性能,而且在2015開源
3.活躍的社區,在github上有111個Contributors,修復bug迅速,基本每3個月一個版本
4.支持插件化,目前支持的插件有32個,包含受權,安全,限流,Serverless,分析和監控,轉換,日誌。
5.支持企業版本和社區版本git
上圖很清晰的看見Kong的架構圖,以Nginx做爲基礎, OpenResty構建RESTful,支持集羣和數據庫存儲數據,插件化,還有支持用RESTful來管理端。github
這裏講下Kong的集羣原理吧,Kong在0.11.0版本以前用的是serf來作集羣的,那麼爲何不用serf作集羣呢?開發者給出的理由以下:
1.依賴serf,serf並不屬於Nginx/OpenResty
2.這種依賴相互間通訊來同步的機制對於deployment和容器化都有些不便
3.在運行的Kong節點觸發serf須要一些阻塞的I/O
0.11.0版本的實現思路是以數據庫爲中心,增長一個cluster events的表,任何Kong node均可以向數據庫發送變動消息,其餘節點輪訓數據庫改動,而後更新緩存內容,若是有節點重啓連上數據庫節點就能夠工做了。web
Kong的安裝方式支持不少主流的平臺,目前不支持Windows,支持的安裝方式以下:
docker
Kong的安裝,爲了方便我這裏就使用docker安裝了
1.建立專屬kong的網絡(docker的最佳實踐)--link 過期了啊
docker network create kong-net
2.選擇你使用的數據庫,默認使用的是PostgreSQL
若是你使用的是Cassandra數據庫:
提示下:Cassandra >=3.0
docker run -d --name kong-database \ --network=kong-net \ -p 9042:9042 \ cassandra:3
若是你使用的是PostgreSQL
docker run -d --name kong-database \ --network=kong-net \ -p 5432:5432 \ -e "POSTGRES_USER=kong" \ -e "POSTGRES_DB=kong" \ postgres:9.6
3.數據庫遷移,初始化庫表結構:數據庫
docker run --rm \ --network=kong-net \ -e "KONG_DATABASE=postgres" \ -e "KONG_PG_HOST=kong-database" \ -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \ kong:latest kong migrations up
4.啓動kongnpm
docker run -d --name kong \ --network=kong-net \ -e "KONG_DATABASE=postgres" \ -e "KONG_PG_HOST=kong-database" \ -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:latest
5.看網關有沒有啓動
在本機 curl -i http://localhost:8001/,或者用瀏覽器訪問8001端口。若是出來一大堆json,表示成功。json
mkdir AspNetCore cd AspNetCore dotnet new webapi dotnet run
咱們以netcore作的api爲例子訪問localhost:5000/api/values,前面網關搭建起來了,而且支持RESTful,如今有開源的dashboard,咱們就用KongDashboard來演示,如何構造搭建和訪問。api
# 全局安裝kong-dashboard npm install -g kong-dashboard # 啓動 kong-dashboard kong-dashboard start --kong-url http://localhost:8001 # 啓動kong-dashboard,而且自定義端口 kong-dashboard start \ --kong-url http://kong:8001 \ --port [port] # 啓動kong-dashboard而且啓動基礎認證 kong-dashboard start \ --kong-url http://kong:8001 \ --basic-auth user1=password1 user2=password2 # 看kong-dashboard 啓動參數 kong-dashboard start --help
啓動成功後用瀏覽器打開localhost:8080以下圖所示:
那麼咱們增長一個NetCoreAPI,在DashBoard,如圖所示:
由於是GET請求,那我咱們用瀏覽器訪問,瀏覽器 -> 網關 -> NetCore程序。
打開瀏覽器直接訪問http://localhost:8000/api/values,返回["value1","value2"]則表明正常。
以下圖所示:
最後,AspNetCore微服務下的網關-Kong系列,後面會繼續更新,會講解到Kong的插件的使用,插件的開發,使用的一些坑,網關性能分析和日誌可視化,源碼解析等,歡迎你們關注個人github: https://github.com/WithLin。