KrakenD 是用 Go 编写的开源高性能无状态、分布式、微服务 API 网关,其不仅可以轻松将客户端请求转发到后端服务,还具备强大的数据处理功能,支持转换、过滤、聚合和修剪来自后端服务甚至第三方服务的返回数据,从而消除处理多个 REST 服务的必要性,使客户端与微服务的实现细节隔离开来。这一切通过简单的配置即可实现,本文介绍 KrakendD 如何安装部署并快速投入应用。

KrakendFlow
KrakendFlow

KrakenD 概述

KrakenD 在具备超高性能的基础上还提供丰富的功能,简要梳理:

  1. API 数据聚合,将来自多个 API 的数据聚合到一起。
  2. API 数据过滤,仅公开真正需要的数据。
  3. 强大的配置模板,且支持多种配置格式,但建议使用 JSON 配置,可以实现更加灵活的网关配置。
  4. 无状态、无数据库,在 KrakenD 群集中,所有节点都是自治的,即使关闭了所有其他节点,其仍可继续运行。
  5. 支持在几乎所有环境中运行,无论是虚拟机或容器云环境。
  6. 支持插件扩展,您可以使用 Go 或 Lua 脚本扩展 KrakenD 功能和业务逻辑。
  7. 接口安全,支持速率限制、OAuth、SSL、XSS防护等多种安全策略,且均为开箱即用。
  8. 机器人探测器

更多功能特性请参考官网文档 krakenD

基于 Kubernetes 部署高可用 KrakenD 集群

KrakenD 是一个独立的二进制文件,可直接运行,不需要任何外部库工作。本节介绍在 Kubernetes 环境安装 KrakenD 的大致步骤。

配置文件

KrakenD 服务器启动和操作所需的所有配置都在配置文件中定义,可以通过可视化工具 KrakenDesigner 生成,可用的常用配置文件格式有 .json.toml.yaml。配置文件写好后,可以通过 krakend check 进行语法检查。

1、语法检查

$ krakend check --config ./krakend.toml --debug 
  Syntax OK! 

2、配置文件结构

{
    "version": 2,
    "endpoints": [...]
    "extra_config": {...}
    ...
}

你可以在配置文件中放入很多选项,这里我们只关注文件结构。

  • version: KrakenD 文件格式,当前版本是 2。
  • endpoints[]: 网关及其关联的后端服务定义。
  • extra_config{}: 与中间件或插件相关的额外配置。例如,您可能要启用日志记录,这是 API 网关可选的非核心功能。

3、endpoints 结构

endpoints 是一个有所有可访问端点组成的数组,每个端点包含对外提供服务的端点 url 及与其相对应的后端服务列表。每个端点至少对应 1 个后端服务。

"endpoints": [
    {
        "endpoint": "/v1/foo-bar",
        "backend": [
            {
                "url_pattern": "/foo",
                "host": ["https://my.api.com"]
            },
            {
                "url_pattern": "/bar",
                "host": ["https://my.api.com"]
            }
        ]
    }
]

上述配置,声明端点 /v1/foo-bar 对应两个后端服务,当客户端请求 /v1/foo-bar 端点,网关将返回合并后的 /foo/bar 服务的结果。

4、extra_config 结构

当注册组件后,将从 extra_config 获取相关配置。extra_config 可以出现在不同的层次,根级别的 extra_config 通常用于服务级别配置,将在全局范围内生效。另一方面,有的组件会在 endpointbackend 内寻找 extra_config 配置,因为其功能仅特定于后端或端点行为。例如,您可能只想将速率限制设置为特定的端点或后端。

对于外部组件还需定义一个命名空间,用于组件检索配置。例如,gologging 中间件通过 github_com/devopsfaith/krakend-gologging 键读取配置信息。

{
    "version": 2,
    "extra_config": {
        "github_com/devopsfaith/krakend-gologging": {
          "level": "WARNING",
          "prefix": "[KRAKEND]",
          "syslog": false,
          "stdout": true
        }
    }
}

使用组件仓库路径作为配置键是很好的时间,当 extra_config 位于根级别时,注意不要在键名称中包含 . 以避免解析器出现问题,注意上面配置示例中的 github_com。但当 extra_config 出现在 endpointbackend 级别时,这些点可以正常使用。

下面示例定义了两个同时进行的速率限制策略:将端点限制为 5000 reqs/s,接着又配置其后端的 slow 服务,将其限制在 100 reqs/s 内。

{
    "version": 2,
    "endpoints": [
    {
        "endpoint": "/limited-to-5000-per-second",
        "extra_config": {
            "github.com/devopsfaith/krakend-ratelimit/juju/router": {
                "maxRate": 5000
            }
        },
        "backend":
        [{
            "host": [
                "http://slow.backend.com/"
            ],
            "url_pattern": "/slow/endpoint",
            "extra_config": {
                "github.com/devopsfaith/krakend-ratelimit/juju/proxy": {
                    "maxRate": 100,
                    "capacity": 1
                }
            }
        },
        {
            "host": [
                "http://fast.backend.com/"
            ],
            "url_pattern": "/fast/endpoint"
        }]
        ...
    }
}

5、多个配置文件

目前为止,上面示例中所有配置都在一个名为 krakend.json 的文件中, 对于生产环境数百个端点配置需求,KrakenD 通过 Flexible Configuration 组件允许我们将配置文件分割成不同的片段,以便于更加科学合理的组织接口配置。

启用 Flexible Configuration 后,KrakenD 假定您的配置文件是一个模板,需要在启动时进行编译。这样,您就有机会生成一个更复杂的配置文件,模板文件利用变量并从外部文件中获取内容。如果要启用 Flexible Configuration 则必须使用 .json 配置文件。

更多信息请参考 Flexible Configuration

高可用集群

硬件随时可能发生故障,网关至关重要,通过运行该服务的计算机集群以确保高可用性。KrakenD 群集由同时运行并协同工作的多个 KrakenD 实例组成,以提供更高的可靠性,更高的吞吐量,可伸缩性和故障转移。

KrakenD 节点是无状态的,它们不将数据或应用程序状态存储到持久性存储中,而是,通过配置文件配置数据和应用程序状态。节点随时都可被杀掉和更换。

运行 KrakenD 集群是一个简单的过程,仅需要两个条件:

  • 在网关前部署负载均衡器。
  • 运行两个或多个 KrakenD 服务。

如果在 k8s 中,使用普通的 service 关联多个 pod 即可。

最佳实践

设置 KrakenD 集群是一个简单的过程,但是这里有一些建议供生产环境参考。

  • 在负载均衡和 KrakenD API 网关之间启用 HTTP2,以获得最佳性能。
  • 在负载均衡中添加 SSL 证书,并在负载均衡和 KrakenD 之间使用内部证书。
  • 启用指标和日志记录,确保您对正在发生的事情具有可见性。至少启用一个 WARNING 级别的日志记录。
  • 配置有意义的命名信息。
  • 启动命令将输出重定向到/dev/null。