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 网关,丰富的插件、强大的认证机制和多种语言的插件支持给人眼前一亮的感觉,不过开源版本的集群功能、日志监控和灰度发布等功能相对较弱。