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


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

架構

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

1.為什么要用Kong作為NetCore下的API網關?

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

架構預覽

基於OpenResty(Nginx & Lua Scripting)

image.png

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

集群架構預覽

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都可以向數據庫發送變更消息,其他節點輪訓數據庫改動,然后更新緩存內容,如果有節點重啟連上數據庫節點就可以工作了。

Kong的安裝

Kong的安裝方式支持很多主流的平台,目前不支持Windows,支持的安裝方式如下:
image.png

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.啟動kong

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,表示成功。

以AspNetCore為例子訪問

mkdir AspNetCore

cd AspNetCore

dotnet new webapi

dotnet run

我們以netcore做的api為例子訪問localhost:5000/api/values,前面網關搭建起來了,並且支持RESTful,現在有開源的dashboard,我們就用KongDashboard來演示,如何構造搭建和訪問。

# 全局安裝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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM