tyk 是一款采用 golang 语言实现的 API 网关,具有 API Gateway、Tyk Dashboard、 Tyk Pumpd 和 Tyk Identity Broker 等几大组件。不过只有 API Gateway 的源代码是开放的。下面主要介绍一下 API Gateway 的功能与用法。
安装
我们以 Ubuntu18.04 为例讲一下安装步骤:
sudo apt-get install -y redis-server
curl -s https://packagecloud.io/install/repositories/tyk/tyk-gateway/script.deb.sh | sudo bash
sudo /opt/tyk-gateway/install/setup.sh --listenport=8080 --redishost=<hostname> --redisport=6379 --domain=""
sudo service tyk-gateway start
简单使用
appsjsonrestful/tyk/apisappsapi1.json
{
"name": "Tyk Test API",
"api_id": "1",
"org_id": "default",
"use_keyless":true,
"definition": {
"location": "header",
"key": "x-api-version"
},
"version_data": {
"not_versioned": true,
"versions": {
"Default": {
"name": "Default",
"use_extended_paths": true
}
}
},
"proxy": {
"listen_path": "/tyk-api-test/",
"target_url": "http://httpbin.org";,
"strip_listen_path": true
}
}
curl -H "x-tyk-authorization: {your-secret}" -s https://{your-tyk-host}:{port}/tyk/reload/groupx-tyk-authorization/tyk-api-test
tyk 的 api 支持的配置参数非常多,比如认证、版本号、频率控制和配额控制等,具体可参考Tyk Api 定义
插件机制
tyk 的插件功能比较强大,一方面提供了 IP 黑白名单、参数提取和认证等诸多插件,另一方面也支持 js、python、lua 语言来自定义插件。插件的执行顺序如下图:
我们用 lua 开发一个简单的插件测试一下:
需要安装依赖:
apt-get install libluajit-5.1-2
apt-get install luarocks
luarocks install lua-cjson
manifest.json
{
"file_list": [
"mymiddleware.lua"
],
"custom_middleware": {
"pre": [
{
"name": "MyPreMiddleware"
}
],
"driver": "lua"
},
"checksum": "",
"signature": ""
}
function MyPreMiddleware(request, session, spec)
tyk.req.set_header("customheader", "customvalue")
return request, session
end
tyk-cli/opt/tyk-gateway/utils/pathtyk-cli bundle build -output bundle-test.zip -ybundle-test.ziptyk.conf
"coprocess_options": {
"enable_coprocess": true,
},
"enable_bundle_downloader": true,
"bundle_base_url": "http://my-bundle-server.com/bundles/";,
执行
service tyk-gateway stop
service tyk-gateway-lua start
最后修改 api1.json 添加上:
"custom_middleware_bundle": "bundle-test.zip"
这样插件就生效了
报表、监控和事件触发器
tyk 的管理平台提供有一系列详细指标来监控各个 API 的访问情况,不过相关代码没有开源出来,相关指标的存储访问接口也没有文档中显示,如果想深入了解的话需要学习源代码。
eh_log_handlereh_web_hook_handlerQuotaExceededRatelimitExceededOrgQuotaExceededOrgRateLimitExceeded
{
"event": "{{.Type}}",
"message": "{{.Meta.Message}}",
"path": "{{.Meta.Path}}",
"origin": "{{.Meta.Origin}}",
"key": "{{.Meta.Key}}"
}
event handlerevent handler
集群部署
tyk 也支持集群部署,需要一个组件 MDCB(Tyk Multi Data Centre) 与多个 slave 节点。集群功能是需要付费的,这里就不详细介绍了。
协议支持情况
支持 http、gRPC 和 websocket
小结
tyk 总的来说算是一个中规中矩的 API 网关,丰富的插件、强大的认证机制和多种语言的插件支持给人眼前一亮的感觉,不过开源版本的集群功能、日志监控和灰度发布等功能相对较弱。