Kong 是面向現代架構(混合雲,混合組織)的下一代 API 網關平臺,具備雲原生、高性能,易用、可擴展等特性。nginx
適用於 Api Gateway, Kubernetes Ingress, Service Mesh Sidecar 等場景。sql
主要特性有:數據庫
目前咱們須要解決的問題api
Kong 能夠完美的解決以上問題,解決方案以下:緩存
易用性,擴展性: 提供了Restful操做方式,而且有dashboard管理工具bash
# 建立一個名稱 hello 的 upstream
curl -X POST http://localhost:8001/upstreams --data "name=hello"
# 爲 hello 添加兩個負載均衡節點
curl -X POST http://localhost:8001/upstreams/hello/targets --data "target=localhost:8080" --data "weight=100"
curl -X POST http://localhost:8001/upstreams/hello/targets --data "target=localhost:8081" --data "weight=100"
# 配置一個service
curl -X POST http://localhost:8001/services --data "name=hello" --data "host=hello"
# 爲service 配置路由
curl -X POST http://localhost:8001/routes --data "paths[]=/hello" --data "service.id={$service.id 配置上面service返回的}"
複製代碼
dashboard工具截圖架構
持續集成發佈: 與 GitLab CI/CD 配合,代碼提交代碼庫後,自動打包,運行測試用例,藍綠部署。 app
當前使用 Kong 架構圖 負載均衡
全部節點鏈接到數據中心框架
全部節點將週期性執行任務,同步數據最終一致
節點有本地緩存,能夠設置緩存過時時間
支持動態擴容,參考上方架構圖,Kong集羣在Lvs後面
支持 gRPC
# /etc/kong/kong.conf
proxy_listen = 0.0.0.0:8000, 0.0.0.0:8443 ssl, 0.0.0.0:9080 http2
複製代碼
服務監控
注意事項
- kong/templates/nginx_kong.lua 模板文件統一
- 對於kong日誌要作好切割,咱們使用 logrotate
不一樣的插件有不一樣的參數,須要進行設定,設定完成後就會啓用
例如:這是內置的 key-auth 插件,做用是進行api認證,設定 key 以後只有認證經過的才能訪問
自定義開發和部署,根據業務須要開發插件
基本流程
base簡單版
simple-plugin
├── handler.lua
└── schema.lua
複製代碼
advanced高級版
complete-plugin
├── api.lua
├── daos.lua
├── handler.lua
├── migrations
│ ├── cassandra.lua
│ └── postgres.lua
└── schema.lua
複製代碼
必要文件就是 handler.lua 和 schema.lua
修改 handler.lua 文件,有不少函數,自定義邏輯就是在這些函數中寫
kong會在一些特定階段調用對應的函數
local BasePlugin = require "kong.plugins.base_plugin"
-- The actual logic is implemented in those modules
local access = require "kong.plugins.my-custom-plugin.access"
local body_filter = require "kong.plugins.my-custom-plugin.body_filter"
local CustomHandler = BasePlugin:extend()
function CustomHandler:new()
CustomHandler.super.new(self, "my-custom-plugin")
end
function CustomHandler:access(config)
CustomHandler.super.access(self)
-- Execute any function from the module loaded in `access`,
-- for example, `execute()` and passing it the plugin's configuration. access.execute(config) end function CustomHandler:body_filter(config) CustomHandler.super.body_filter(self) -- Execute any function from the module loaded in `body_filter`, -- for example, `execute()` and passing it the plugin's configuration.
body_filter.execute(config)
end
return CustomHandler
複製代碼
return {
no_consumer = true, -- this plugin will only be applied to Services or Routes,
fields = {
-- Describe your plugin's configuration's schema here.
},
self_check = function(schema, plugin_t, dao, is_updating)
-- perform any custom verification
return true
end
}
複製代碼
配置部署
插件文件在
/data/kong/plugins/simple-plugin/
複製代碼
則配置kong.conf
lua_package_path = /data/?.lua;($default);
plugins = bundled,simple-plugin
複製代碼
而後從新reload kong 若是lua插件沒有錯誤,就能夠在後臺看到加載出來了
返回的內容太大,須要加大 buffer(upstream response cache error) 修改配置
nginx_proxy_proxy_buffer_size=128k
nginx_proxy_proxy_buffers=4 256k
nginx_proxy_proxy_busy_buffers_size=256k
複製代碼
須要注意配置屬性
若是設置爲 true, paths 設置有值,那麼請求將會被替換掉
{ "paths": ["/service"], "strip_path": true, "service": { "id": "..." }}
請求:GET /service/path/to/resource HTTP/1.1Host: …
Proxy: GET /path/to/resource HTTP/1.1
{ "paths": ["/version/\d+/service"], "strip_path": true, "service": { "id": "..." }
請求:GET /version/1/service/path/to/resource HTTP/1.1
Proxy: GET /path/to/resource HTTP/1.1
複製代碼
若是設置爲 true,代理後仍然保留 header 請求 host
請求:GET / HTTP/1.1Host: service.com
Proxy: GET / HTTP/1.1Host: service.com
設置爲false,將不保留header host
GET / HTTP/1.1Host: service.com
GET / HTTP/1.1Host: <my-service-host.com>
複製代碼
Kong 是行業內較爲成熟的網關開源產品,不管是性能,易用,擴展方面都表現不錯。
Kong 就是服務治理的翅膀,能夠更優雅,更便捷,更智能的實現服務降級,熔斷,流量調度等工做。
讓咱們在自建 Kunernetes 私有云,Hulk雲,阿里雲等複雜的架構中任意翱翔。