AspNetCore微服務下的網關-Kong(一)

Kong是Mashape開源的高性能高可用API網關和API服務管理層。它基於OpenResty,進行API管理,並提供了插件實現API的AOP。Kong在Mashape 管理了超過15,000 個API,爲200,000開發者提供了每個月數十億的請求支持。本文將從架構、API管理、插件三個層面介紹Kong。node

架構

按照康威定律,咱們系統架構會拆的很散,系統由一堆服務組成,以下圖所示:
image.png
庫存服務、優惠券服務、價格服務時以前都會作一些特殊處理,如限流、黑白名單,日誌、請求統計。而這些處理幾乎是全部服務都須要的,這不就是咱們常說的AOP嘛,當咱們服務多起來的時候,應該將這些通用處理集中到一個地方進行管理,以下圖所示:
image.png
和下圖有點類似:
image.pngnginx

1.爲何要用Kong做爲NetCore下的API網關?

1.開源,雲原生(Cloud-Native),ServiceMesh,快速,彈性,RESTful還有分佈式微服務的抽象層
2.基於NGINX構建的網關,擁有更高的性能,而且在2015開源
3.活躍的社區,在github上有111個Contributors,修復bug迅速,基本每3個月一個版本
4.支持插件化,目前支持的插件有32個,包含受權,安全,限流,Serverless,分析和監控,轉換,日誌。
5.支持企業版本和社區版本git

架構預覽

基於OpenResty(Nginx & Lua Scripting)

image.png

上圖很清晰的看見Kong的架構圖,以Nginx做爲基礎, OpenResty構建RESTful,支持集羣和數據庫存儲數據,插件化,還有支持用RESTful來管理端。github

集羣架構預覽

image.png
這裏講下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的安裝

Kong的安裝方式支持不少主流的平臺,目前不支持Windows,支持的安裝方式以下:
image.pngdocker

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

以AspNetCore爲例子訪問

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以下圖所示:
image.png

那麼咱們增長一個NetCoreAPI,在DashBoard,如圖所示:
image.png

由於是GET請求,那我咱們用瀏覽器訪問,瀏覽器 -> 網關 -> NetCore程序。
打開瀏覽器直接訪問http://localhost:8000/api/values,返回["value1","value2"]則表明正常。
以下圖所示:
image.png

最後,AspNetCore微服務下的網關-Kong系列,後面會繼續更新,會講解到Kong的插件的使用,插件的開發,使用的一些坑,網關性能分析和日誌可視化,源碼解析等,歡迎你們關注個人github: https://github.com/WithLin

相關文章
相關標籤/搜索