API Gateway Kong在Rainbond上的部署
原文發表在 Rainbond社區
文章目錄
什麼是Kong
Kong是一個可擴展的開源API平臺(也稱爲API網關,API中間件或微服務服務網格)。Kong最初是由Kong Inc.(以前稱爲Mashape)實現的,用於爲其API Marketplace維護、管理和擴展超過15,000個微服務,這些微服務每月產生數十億個請求。
技術上講,Kong是在Nginx中運行的Lua應用程序,並且通過lua-nginx-module實現。Kong是與OpenResty一起分發的,而不是使用此模塊來編譯Nginx,OpenResty已經包括lua-nginx-module。
瞭解更多有關Kong的事情,你需要點擊瞭解一下。
從應用市場安裝
快速安裝
目前我們已經將最新版本(v1.4.X)的Kong發佈到了應用市場,如果你想要快速的搭建以及使用Kong,你只需要做一件事情,那就是點擊一下安裝:
等待一小段時間後,Kong就已經部署在了你的Rainbond集羣中了。在這個應用中,我們已經集成了Konga作爲UI管理工具,接下來的步驟,需要你訪問Konga,做幾步簡單的設置,就可以愉快的探索Kong了。
- 註冊Konga
- 配置Kong的連接地址,寫入
http://127.0.0.1:8001
即可
- 連接成功,就可以使用Konga來管理你的Kong了
注意事項
- 如果你所使用的Rainbond平臺,是在2019年12月25日以前安裝的,並且沒有進行過任何升級操作,那麼你可能遇到Konga連接不到Kong的問題,解決的方案如下:
- Kong的啓動很消耗內存
配置Kong
環境變量
Kong支持以KONG_
開頭的環境變量進行配置。舉例說明:
對於部署在Rainbond上的Kong來說,直接添加環境變量
KONG_LOG_LEVEL = error
即可在Kong的配置文件中生成
log_level = error
添加完成後,點擊更新,即可使之生效。
注入Nginx配置
通過調整Kong實例的Nginx配置,可以優化其基礎架構的性能。
Kong啓動時,將構建一個Nginx配置文件。你可以通過Kong配置直接將自定義Nginx配置注入此文件。
注入單個Nginx配置
Kong的配置文件中的任何前綴爲的條目nginx_http_
, nginx_proxy_
或nginx_admin_
通過刪除前綴將其轉換爲等效的Nginx指令,並將其添加到Nginx配置的相應部分:
- 前綴爲的條目
nginx_http_
將注入到整體http
塊指令中。 - 前綴爲的條目
nginx_proxy_
將注入到server
處理Kong代理端口的block指令中。 - 前綴爲的條目
nginx_admin_
將注入到server
處理Kong的Admin API端口的block指令中。
例如,如果將以下行添加到kong.conf
文件中:
nginx_proxy_large_client_header_buffers=16 128k
它將以下指令添加到server
Kong的Nginx配置的代理塊中:
large_client_header_buffers 16 128k;
爲了達到這個目的,你需要參考環境變量,爲Kong添加以下環境變量:
KONG_NGINX_HTTP_OUTPUT_BUFFERS = "4 64k"
通過注入的Nginx指令包含文件
對於更復雜的配置方案,例如添加整個新 server
塊,可以使用上述方法include
向Nginx配置注入 指令,指向包含其他Nginx設置的文件。
可以通過在kong.conf
文件中添加以下條目來包含目標文件:
nginx_http_include = /path/to/your/my-server.kong.conf
在Rainbond上,可以通過環境變量進行配置:
KONG_NGINX_HTTP_INCLUDE="/path/to/your/my-server.kong.conf"
Kong應用怎麼製作
即點即用的Kong,使用起來非常方便。那麼這個應用是怎麼製作的呢?
我們只需要做到以下幾點,就可以發佈出可以即點即用的雲市場應用:
- 目標應用的所有組件都已經部署在Rainbond並正常運行
- 各服務組件使用的數據庫具備自動初始化數據的功能
- 各服務組件間的依賴關係已經處理妥當,從業務層面已經正常運行
接下來,只需要參考應用分享與發佈,將你的應用發佈出去即可。
數據庫自動初始化
Kong可以使用的數據庫包括 Postgres與Cassandra
,我們這裏使用了前者。
首先利用docker run 命令快速部署一個Postgresql:
docker run -d --name kong-database \
-p 5432:5432 \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" \
postgres:9.6
使用Kong的鏡像,即可初始化數據庫表結構,在部署初始化組件時,要記得建立從 kong-init
指向 kong-database
的依賴關係:
docker run --rm \
--name kong-init \
--link kong-database:kong-database \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=127.0.0.1" \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
kong kong migrations bootstrap
kong-init
運行完成後會自動退出,在Rainbond上顯示運行異常,不用擔心,它已經完成了使命,驗證下 kong-database
中已存在數據表結構,就可以刪除kong-init
了。
進入 kong-database
的容器實例,通過命令行工具備份出數據庫。
pg_dump -U kong -d kong > /var/lib/postgresql/data/data.sql
找到 kong-database
的數據持久化目錄,得到 data.sql
,kong-database
的使命也就達成了,可以被關閉刪除。
自定義一個代碼倉庫,參考 https://github.com/dazuimao1990/pri-postgresql/tree/kong 將 data.sql
放到 sql
目錄下,即可用這份代碼創建一個可以自動初始化表結構的Postgresql了。創建之,命名爲 kong-postgres
備用。
部署Kong
直接使用docker run 命令創建Kong,要記得建立從 Kong
指向 kong-postgres
的依賴關係:
docker run -d --name kong \
--link kong-database:kong-database \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=127.0.0.1" \
-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
內存至少提高至4G。
部署Konga
直接使用docker run 命令創建Konga,要記得建立從 Konga
指向 Kong
的依賴關係:
docker run -p 1337:1337 \
--name konga \
pantsel/konga
完成後,最終拓撲將會是這個樣子的:
發佈應用
點擊 發佈到市場
,編輯它的信息,即可發佈了。