聯繫筆者,點擊閱讀原文
聯繫筆者,點擊閱讀原文
聯繫筆者,點擊閱讀原文
聯繫筆者,點擊閱讀原文
Kong Gateway解決了什麼問題?
看上圖,常見的我們的服務之間通過rpc相互調用。
如上圖的左部分,在沒有引入網關之前,爲了保障交互的安全,每個服務都需要自己實現一套權限校驗(Auth)、日誌、限流、監控等方案。這樣就不太好,各種成本很高。
引入網關之後呢,像鑑權、監控、安全、限流、日誌、緩存等等方案都可以統一由網關實現。各個服務只需要專注於自己的業務實現就OK。
Kong Gateway都有哪些模塊?
搞清楚下面的這四點OK:
一、上圖中的最下面的兩層是:Nginx、Openretry,它的意思是:kong是一款基於OpenRetry(Nginx + Lua) 編寫的高可用、易擴展的API Gateway。其實我感覺你可以直接把Kong理解成是Nginx,但是Kong的功能不止於Nginx。
二、上圖中間部分的Datastore的意思是:kong的配置文件可以支持化的存儲在NoSQL中,可選:cassandra、postgreSQL。
三、上圖中的plugin的意思是:如果想拓展kong的功能,只需要提供對應的插件就行。有一些現成的插件可以直接用,可以自定義插件。
四、上圖中最上層的Restful的意思是:它支持通過Restful API的方式來操作操作和配置Kong(管理nginx的配置文件)。而且kong有專屬的dashboard,支持在可視化的界面下和Restful API交互,實現對kong的可視化配置。
安裝Kong
官網doc:https://docs.konghq.com/enterprise/1.5.x/deployment/installation/docker/
選擇安裝1.5.X版本的kong,因爲kong dashboard對高版本的kong還不支持
Step1:下載鏡像
docker pull kong:1.5.0-alpine
Step2:給image打tag
~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kong 1.5.0-alpine a79fdd990557 22 months ago 129MB
~]# docker tag a79fdd990557 kong-oss
Step3:創建一個專屬的網絡空間,kong及其相關的容器均加入到這個網絡中,方便容器間的相互發現和互通
docker network create kong-ee-net
Step4:創建volume,用於將容器的目錄掛載到宿主上,防止容器被刪後,數據丟失。
docker volume create kong-volume
Step5:啓動kong依賴的db容器:運行postgresql數據庫
docker run -d --name kong-ee-database \
--network=kong-ee-net \
-p 5432:5432 \
-v kong-volume:/var/lib/postgresql/data \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" \
-e "POSTGRES_PASSWORD=kong" \
postgres:9.6
此時可以使用navicate嘗試連接一下postgresql數據庫,是可以聯通的
Step6:初始化kong需要的數據庫
docker run --rm --network=kong-ee-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-ee-database" \
-e "KONG_PG_PASSWORD=kong" \
-e "KONG_PASSWORD=kong" \
kong-oss kong migrations bootstrap
驗收結果
Step7:啓動Kong網關
docker run -d --name kong \
--network=kong-ee-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-ee-database" \
-e "KONG_PG_USER=kong" \
-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 8001:8001 \
-p 8444:8444 \
kong-oss:latest
備註:
1、KONG_PG_HOST和KONG_PG_USER的值在Step6中可以找到
2、最後的kong-oss:latest,是kong的鏡像
3、network是Step3中創建的網絡空間
啓動成功,驗收:
因爲我設置的啓動參數是:8001:8001
而不127.0.0.1:8001:8001
,所以可以直接通過瀏覽器訪問8001端口查看到kong的源數據信息,如下:
安裝Konga
konga提供了對kong的可視化管理能力。
konga本身也需要連接數據庫持久化自己的一些數據,所以爲它啓動一個postgresql
Step1:創建存儲卷
docker volume create konga-postgresql
Step2:啓動konga
docker run -d --name konga-database \
--network=kong-ee-net \
-p 5433:5432 \
-v konga-postgresql:/var/lib/postgresql/data \
-e "POSTGRES_USER=konga" \
-e "POSTGRES_DB=konga" \
-e "POSTGRES_PASSWORD=konga" \
postgres:9.6
Step3:初始化該數據庫
docker run --rm --network=kong-ee-net \
pantsel/konga:latest \
-c prepare \
-a postgres \
-u postgres://konga:konga@konga-database:5432/konga
Step4:啓動Konga
docker run -d -p 1337:1337 \
--name konga \
--network=kong-ee-net \
-e "DB_ADAPTER=postgres" \
-e "DB_URI=postgres://konga:konga@konga-database:5432/konga" \
-e "NODE_ENV=production" \
-e "DB_PASSWORD=konga" \
pantsel/konga
驗收:http://10.4.7.103:1337/register
Step5:註冊用戶並登錄
可以在konga數據庫中看到註冊的用戶信息
Step6:Konga連接Kong
主頁>Connections >NEW CONNECTION
Step7:激活白日夢Kong
Step8:激活後的界面如下:
Kong中的名稱概念解釋
Service:對應着後端的一個服務,或者是一個App。
Route:路由,不同的route對應着service中的不同接口。
Upstream:和nginx中的upstream擦不多,都對應着一組服務節點。
Target:對應着一個api服務節點。
# upstream 對應kong中的Upstream
upstream default_backend {
# server 對應着Kong中的一個target
server 10.4.4.21:81 max_fails=3 fail_timeout=10s;
server 10.4.4.22:81 max_fails=3 fail_timeout=10s;
}
server {
server_name *.bairimeng.com;
# location / 對應着Kong中的一個route
location / {
proxy_pass http://default_backend;
proxy_set_header Host $http_host;
proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
}
}
使用Konga添加一個服務
添加upstream
往service中添加服務實例
添加service
給service添加後端真實的路由
驗收訪問:http://10.4.7.103:8000/serverAddr
10.4.7.103是kong所在機器的地址
8000是kong對外暴露的接受http請求的端口
如果service的path爲/的話,訪問路徑則是:http://10.4.7.103:8000/serverAddr/serverAddr
Kong身份認證插件
Basic Auth
Kong支持針對Route和Service兩種粒度添加Basic Auth認證的方式
比如你添加的Basic Auth插件後,可以去訪問該路由去驗收結果
需要輸入用戶名和密碼之後才能訪問。
這裏的用戶名密碼其實就是Kong中的Consumer的Basic Auth的用戶名密碼。
Step1:創建Consumer
Step2:爲第一步中創建的Consumer創建Basic Auth的用戶名密碼。
然後使用這個用戶名和密碼就能驗證成功,成功訪問該接口。
Jwt
jwt的驗證可以在service、route、consumer三個維度上添加。
例如下:
Step1:給單個route添加jwt驗證
Step2:給想訪問Step1中的route的Consumer添加Jwt憑證
注意記錄上面的 key:bairimeng、secret:bairimeng-secret
Step3:使用key和secret簽發密鑰:https://jwt.io/
驗證
1、如果沒有執行上面的Step2的話,請求該接口返回值如下:
2、如果jwt非法的話,請求該接口返回值如下:
3、全部正常返回值如下:
Key Auth
key auth 也是Kong提供的一種身份證的身份。
它會對url中的參數key爲apikey的值進行校驗,如果合法的話則方行。
apikey的具體值需要在consumer中添加
如果沒有合法的key,將得到如下的返回值
Kong限流
同樣Kong也是通過組件來實現限流操作的
可以把限流組件添加到service、route或者針對某個consumer進行限流
名稱 | 作用 |
---|---|
Rate Limiting | 限制訪問速率,如:每秒/分/時/月/年 訪問次數不能超過 1000次 |
Response Limiting | 有後端服務控制,如:每天會響應10次 |
Request Size Limiting | 限制請求大小,當請求大小超過一定的值時,拒絕請求 |
Request Termination | 臨時阻止外界對kong託管的service的訪問,返回給外界503和自定義提示信息 |
Proxy Cache |
Kong黑白名單
配置告訴Kong哪些ip是允許訪問kong的,以及拒絕哪些ip的訪問。
針對Consumer僅能添加下圖中的ip黑白名單
針對route、service能添加下圖中安全策略
IP Restriction
如果非法的ip,會得到如下的返回值
ACL
它的作用也是限制誰可以訪問Kong、誰不可以訪問Kong,需要和Basic Auth結合起來使用。
如果僅有Basic Auth的話,效果如下:
如果添加ACL之後,會在僅有Basic Auth的基礎上更嚴格,允許訪問的粒度就從:所有的合法用戶 細化成了 具體的某個用戶或者用戶組
如果訪問者不在ACL指定的白名單組中的話,返回值如下:
想正常訪問接口,需要將consumer加入到上面的whitelist指定的用戶組中,如下:
bot-detection
用於過濾請求發送者的設備信息。
如過濾掉來自火狐瀏覽器的請求如下:
這時火狐瀏覽訪問該接口的話響應如下: