1. 入门
1. KrakenD简介
KrakenDAPI
APIAPI
KrakenD
KrakenDAPIInternet
2. 为什么要使用API网关?
API
KrakenD
KrakenDOAuthSSLClickjackingHTTPMIMEXSS
KrakenD
一个实际的例子
移动开发人员需要构建一个首页,该首页需要来自多个对其后端服务的调用的数据,例如:
KrakenD
因此,结果如下所示:
通过选择此实现,移动客户端将自己与后端实现隔离。每当后端更改其接口时,移动客户端的API接口就保持不变,并且网关会通过简单的配置更改进行更新。
同时,后端生成的数据量与最终传输到客户端的数据量之间存在大小差异。
2. 安装KrakenD
KrakenDKrakenD
1. centos安装
2. Fedora安装
3. docker安装
常用示例
3. 使用KrakenD
KrakenD
在使用前需要确保把KrakenD配置到环境变量上
1. 生成配置文件
生成具有端点定义的配置文件。比较简单的方法就是使用设计器生成配置文件
2. 检查配置文件
KrakenD
-c--config-d--debug
4. 配置文件
1. 配置概述
1. KrakenD的配置文件
krakend.json
提供这种简单的配置机制,版本控制和自动化非常方便。API网关中的任何更改始终在版本控制系统下,并且代码控制网关的状态。
2. 生成配置文件
可以从头开始编写配置文件,也可以重用另一个现有文件作为基础,但是编写第一个配置文件的最简单方法是仅使用在线配置编辑器KrakenDesigner。
KrakenDesigner是一个简单的javascript应用程序,可以帮助您了解API网关的功能,并可以为所有不同的选项设置不同的值。使用此选项,您无需从头开始学习和编写所有属性名称。可以随时下载配置文件,然后再次加载以恢复版本。
Kraken Designer是一个纯静态页面,不会将您的任何配置发送到其他地方,并且随着我们所有软件的发生,它也是开源的,您可以下载它并在自己的Web服务器中运行。请参阅Krakendesigner存储库。
3. 支持的文件格式
.json.toml.yaml.yml.properties.props.prop.hcl
4. 验证配置文件的语法
krakend check
Syntax OK!
您也可以直接启动服务,因为这是在服务器启动之前完成的。
进一步了解 krakend check
2. 文件结构
1. 了解配置文件
krakend.json
2. 配置文件结构
您可以在此文件中放入很多选项,让我们现在仅关注结构:
version21endpoints[]extra_config{}
endpoints
endpointsendpointbackend
看起来像这样:
/v1/foo-bar/foo/bar
extra_config
extra_config
extra_configextra_configendpointbackend``定义extra_config
github_com/devopsfaith/krakend-gologging
extra_configextra_configgithub_comendpointbackend
以下代码是定义两个同时进行的速率限制策略的示例:特定端点的限制为5000 reqs / s,但是其后端之一最多接受100 reqs / s。
5. 示例文件
检查这个更大的示例文件(随KrakenD分发),您可以在其中看到有关如何修改应用程序标题,配置断路器或施加速率限制的示例。
3. 多个配置文件
灵活的配置
该灵活的配置组件包括在KrakenD API网关,并允许您配置文件成若干块分割为更自然的组织。
启用灵活配置后,KrakenD假定您的配置文件是一个模板,需要在启动时进行编译。这样,您就有机会生成一个更复杂的配置文件,该文件利用变量并从外部文件中获取内容。
1. 何时使用弹性配置
模板系统使您可以灵活地使用配置文件。它非常方便:
krakend.json
2. 要求
JSON
3. 用法
运行krakend时,软件包的激活通过环境变量进行,如下所示:
FC_ENABLE=110-cFC_SETTINGS=dirnameFC_PARTIALS=dirnameFC_TEMPLATES=dirnameFC_OUT
例如,假设您决定按照以下方式组织配置:
然后,您可以使用以下命令从终端运行KrakenD:
1. 模板语法
-c{{}}
这些都是语法的可能性:
{{ .file.key }}keyfile{{ marshall .file.key }}keyfile{{ include "file.txt" }}file.txt{{ template "file.tmpl" context }}file.tmpl{{ . }}context
有关更多说明和示例,请参见下文。
2. 从设置文件插入值
FC_SETTINGS.json
settings/db.json
{{ .db.host }}
db.jsonhost192.168.1.23
3. 从设置文件插入结构
marshall
db.json
4. 包括一个外部文件
要就地插入外部部分文件的内容,请使用:
不解析部分模板内的内容,而是将其原样插入纯文本中。假定该文件位于中定义的目录中,FC_PARTIALS并且可以具有任何名称和扩展名。
5. 包含并处理子模板
includetemplate
template_name.tmplcontext{{ . }}{{ template "environment" .db.label }}
Go模板允许您引入方便的条件条件或循环之类的内容,并允许您创建功能强大的配置。
6. 测试配置
krakend check
FC_OUT
出现错误时,输出将包含帮助您解决问题的信息,例如:
7. 灵活的配置示例
为了演示灵活配置的用法,我们将分几部分重组配置文件。这是一个简单的示例,用于了解模板系统的基础知识,并且无意显示组织和拆分文件的好方法:
局部/rate_limit_backend.tmpl
在此文件中,我们为后端编写了速率限制配置的内容。如果按原样包含此文件,则将其插入:
settings / service.json
在设置目录中,我们写入其值可以作为变量访问的所有文件。
设置/ endpoint.json
该文件声明了以单个后端为基础的两个端点:
krakend.json
includemarshal
看一下突出显示的行:
.service.portservice.jsonextra_configmarshalservice.jsonrangeendpoint.jsonexample_groupexample_groupinclude
{{ range }}{{ template "template.tmp" .endpoint.example_group }}
要解析配置,请使用:
4. KrakenD文件支持的格式
json
.json.toml.yaml.yml.properties.props.prop.hcl
不过,我们的建议是选择JSON。
使用以下命令验证语法(而非逻辑) krakend check
为什么选择json?
YAMLTOMLjson
.json
JSON
JSON
5. 命令行命令
1. 运行KrakenD
run8080
krakend run
显示帮助:
例
启动服务的最常见方式是:
要在其他端口中启动KrakenD服务(该端口也可以在配置文件中设置):
在开发和测试阶段,增加日志的详细程度
2. 校验
krakend check--debug
需要将路径传递到配置文件
例
我们将在演示中使用此配置
禁用调试
开启调试
6. 服务配置
1. 为HTTPS和HTTP / 2启用TLS
在KrakenD上使用TLS时,有两种不同的策略:
- 在KrakenD中将TLS用于HTTPS和HTTP / 2
- 在KrakenD的前面使用带有TLS终端的平衡器(例如,ELB,HAproxy)
tls
2. TLS的简单配置
要使用TLS启动KrakenD,您需要生成证书并提供公钥和私钥:
3. TLS的完整配置
TLS配置的所有可接受的选项是:
public_keyprivate_key
加上这些可选的:
disabledmin_versionSSL3.0TLS10TLS11TLS12max_versionSSL3.0TLS10TLS11TLS12curve_preferences232425prefer_server_cipher_suitescipher_suites
510475360156157491594916149162491694917049171491724918749191491994919549200491965239252393
7. Endpoints
1. 端点速率限制
限制端点是路由器速率的责任,它允许您设置KrakenD端点每秒接受的最大请求数。默认情况下,端点可以处理的请求数没有限制。
要指定速率限制,您需要在所需的端点中添加配置。
在路由器级别,您可以根据以下内容设置端点的速率限制:
maxRateclientMaxRate
maxRate
当您要设置端点可以在1秒的窗口内处理的最大请求数时,请启用此选项。
设置后,每个KrakenD实例都会在内存中保留一个更新的计数器,其中包含该端点每秒处理的请求数。
maxRate"maxRate": 0
maxRate
503 Service Unavailable
clientMaxRate
maxRateclientMaxRate
clientMaxRate
范例:
允许200个不同的客户(具有不同的IP)访问受限的KrakenD端点,以产生以下总流量:
clientMaxRate"clientMaxRate": 0
客户识别策略
有两种客户识别策略:
"strategy": "ip""strategy": "header"keykey
"key": "X-TOKEN"X-TOKEN
clientMaxRate
429 Too Many Requests
clientMaxRatemaxRate
以下示例演示了具有多个端点的配置,每个端点设置不同的限制:
/happy-hour0/happy-hour-2/limited-endpoint/user-limited-endpointX-Auth-Token
2. 配置响应
KrakenD允许您直接对响应进行几种操作,只需将它们添加到配置文件中即可。您也可以添加自己的或第三方中间件来扩展此行为。
nanoseconds
默认情况下,以下操作可用:
1. 合并中
/a/b/c/abc
合并操作以首先实现用户体验和响应的方式来实现。它尽最大努力从相关的后端获取所有必需的部分,并尽快返回组成的对象。
通过简单地将多个后端添加到端点中,即可自动进行合并操作。
上图的配置可能是这样的:
1. 合并超时
请记住,为了避免任何降级的用户体验,在所有后端决定响应之前,KrakenD不会永远被卡住。在网关中,快速失败胜于缓慢成功,KrakenD将确保这种情况发生,因为它将应用超时策略。这将使您的用户在高负载峰值,网络错误或任何使后端承受压力的其他问题期间安全。
timeouttimeout
2. 触发超时或后端失败时会发生什么?
如果KrakenD正在等待后端响应并达到超时,则响应将是不完整的,并且会丢失发生超时之前无法获取的任何数据。另一方面,在超时发生之前可以有效检索的所有部分都将出现在响应中。
如果响应缺少部分,则缓存头将不存在,因为我们不希望客户端缓存不完整的响应。
x-krakend-completedx-krakend-completed: truex-krakend-completed: false
3. 合并示例
想象一下具有以下配置的端点:
endpoint/users/1
和
有了这些“部分响应”和给定的配置,KrakenD将返回以下响应:
2. 过滤
创建KrakenD端点时,您可以决定仅显示来自后端响应的部分字段。您可能有许多不同的原因想要使用此功能,但是我们强烈建议您使用它来节省用户的带宽并增加负载和渲染时间。
您可以使用两种不同的策略来过滤内容:
- 黑名单
- 白名单
3. 分组
group
id
4. 映射(重新命名)
KrakenD还能够设置所生成响应的字段名称,因此您组成的响应将尽可能接近您的用例,而无需在任何后端更改一行。
mapping
5. 目标(或捕获)
在许多API实现中,经常将重要数据始终封装在通用字段(如数据,响应或内容)中,因为还有其他字段显示状态代码和其他元数据。有时我们既不想让客户端处理此问题,也不想在所有配置中拖动该第一级容器。
在后端设置目标时,这些通用容器(目标)会消失,所有内容都将提取到根中,因为它永远不存在。由于此捕获操作是在白名单或映射之类的其他选项之前进行的,因此您不能忘记和操作数据。
6.集合或数组操作
KrakenD期望所有后端在响应中返回对象。有时后端的整个响应都在数组内,而有时需要对数组本身的字段进行操作。
在任何情况下,对数组的操作都与对象不同。
3. 参数转发
KrakenD是一个API网关,在转发查询字符串,Cookie和标头时,通过将参数转发到后端,它的行为不像常规代理。
数据转发的默认策略如下:
您可以根据需要更改此行为,并定义允许通过哪些元素。
1. 可选查询字符串转发
/foo/foo?a=1&b=2ab
querystring_paramsendpointquerystring_params
参数始终是可选的,用户可以传递它们的子集,全部或不传递。
?a=1&b=2
http://krakend:8080/v1/foo?a=1&b=2&evil=hereabevil
http://krakend:8080/v1/foo?a=1b
发送所有查询字符串参数
*
启用通配符会污染您的后端,因为最终用户或恶意攻击者发送的任何查询字符串都会通过网关并影响后面的后端。我们的建议是让网关知道API协定中的查询字符串,并在列表中指定它们,即使列表很长,也不要使用通配符。如果决定使用通配符,请确保您的后端可以处理来自客户端的滥用尝试。
强制查询字符串参数
{variables}
channel404
http://krakend/v3/iOS/foo?limit=10&evil=herechannel
querystring_paramsurl_patternquerystring_params
http://krakend/v3/iOS/foo?limit=10&evil=here
channellimit
http://krakend/v3/iOS/foo?evil=here
没有传递可选参数,因此使用必需参数。
阅读/__debug/endpoint以了解如何测试查询字符串参数。
2.Header转发
headers_to_pass
headers_to_pass
HostConnectionCache-ControlCookie
KrakenD仅将这些基本标头传递给后端:
headers_to_pass
User-Agent
此设置将后端接收的标头更改为:
阅读/__debug/endpoint以了解如何测试Header。
将所有客户端标头发送到后端
*
启用通配符会污染您的后端,因为最终用户或恶意攻击者发送的任何标头都将通过网关并影响后面的后端。我们的建议是让网关知道API协定中的头,并在列表中指定它们,即使列表很长,也不要使用通配符。如果决定使用通配符,请确保您的后端可以处理来自客户端的滥用尝试。
3. Cookies转发
CookieCookieheaders_to_pass
这样做时,您所有的cookie都会发送到端点内的所有后端。明智地使用此选项!
例:
4. 调试EndPoint
-d/__debugDEBUG
在开发时,使用/ __ debug /endpoint将KrakenD本身添加为另一个后端,这样您就可以准确地看到后端接收的header头和查询请求参数。
调试端点可能为您省去很多麻烦,因为当不存在特定的header头或请求参数时,您的应用程序可能无法正常工作。也许您依靠的是客户端发送的内容,但这不是网关发送的内容。请记住:这不是代理。
Content-TypeAcceptheaders_to_pass
调试端点配置示例
/__debug
我们将测试以下端点:
/default-behavior/optional-params
abUser-AgentAccept
/mandatory/{variable}
krakend-test.json-d
启动服务器:
现在我们可以测试端点的行为是否符合预期:
默认行为:
abccurlAcceptUser-Agent
/optional-params
User-AgentAccept和正在到达后端(但不是
/mandatory/{variable}
?mandatory=foo
5. 安全
extra_configendpoint
下面的示例描述了本文后面介绍的选项:
参见下文,此配置文件中描述了不同的选项。
1. 一般安全
1. 按主机限制连接
定义KrakenD应该接受其请求的主机白名单。
Host
该列表必须包含所允许的标准域名以及原始端口。当列表为空时,接受任何主机。
2. 点击劫持保护
frame_deny
KrakenD通过添加突破框架策略来遵循OWASP的建议。
X-Frame-Optionscustom_frame_options_valueDENY
查看OWASP Clickjacking备忘单,以获取有关页眉及其建议值的更多详细信息。
3. MIME嗅探预防
content_type_nosniff
启用此功能将防止用户的浏览器将文件解释为HTTP标头中内容类型所声明的以外的内容。
4. 跨站点脚本(XSS)保护
browser_xss_filter
此功能启用了用户浏览器中的跨站点脚本(XSS)筛选器。
2. HTTPS
1. HTTP严格传输安全性(HSTS)
sts_seconds
OWASP将HSTS定义为
HTTP严格传输安全性(HSTS)是一种Web安全策略机制,有助于保护网站免受协议降级攻击和cookie劫持。它允许Web服务器声明Web浏览器(或其他符合要求的用户代理)应仅使用安全的HTTPS连接与其进行交互,而绝不能通过不安全的HTTP协议进行交互。HSTS是IETF标准的跟踪协议,在RFC 6797中指定。服务器通过在HTTPS连接上提供标头(严格传输安全)来实现HSTS策略(忽略HTTP上的HSTS标头)。
0sts_seconds
2. HTTP公钥固定(HPKP)
hpkp_public_key
OWASP将HPKP定义为
HTTP公钥固定(HPKP)是一种安全机制,它允许HTTPS网站使用错误签发或欺诈性的证书来阻止攻击者的冒用。(例如,有时攻击者可能会破坏证书颁发机构,然后可能将证书误发布为Web来源。)
必须谨慎使用此功能,因为主机有可能通过固定到一组无效的公用密钥散列来使其自身不可用。
3. OAuth2
KrakenD支持客户端凭据授予。
如果您需要授权KrakenD访问后端服务,请使用此功能。
请参阅Odocs2客户端凭据的特定文档
6. 响应内容类型
KrakenD支持使用JSON以外的其他内容类型将响应发送回客户端。支持的内容类型列表取决于所使用的路由器软件包。
1. 支持的编码
output_encoding
jsonnegotiateAccept
- JSON格式
- XML格式
- RSS
- YAML。
stringno-op
output_encoding
/c
2. 使用框架中的其他路由器
如果您决定使用KrakenD框架而不是内部使用gin路由器的KrakenD API网关(KrakenD-CE)来构建自己的网关,则可以使用以下路由器和输出编码:
Gin
基于Gin的KrakenD路由器包含以下输出编码:
jsonstringnegotiateno-op
基于Mux
KrakenD框架支持的基于多路复用器的路由器有:
- Mux
- Gorilla
- Negroni
- Chi
- httptreemux
它们包括以下输出编码:
jsonstringno-op
7. 无操作(仅代理)
no-op
no-op
no-op
no-opbodyno-op
所述代理管(这是从KrakenD到后端)被标记做无操作,这意味着KrakenD不聚集内容,过滤器,操纵或任何本管期间执行的其他功能的。同样重要的是要注意,仅接受一个后端,因为合并操作发生在proxy pipe期间。
采用相同的原理,当后端产生响应时,它将按原样传递回客户端,并保留其形式:主体,标头,状态码等。
另一方面,路由器管道的功能(从客户端到KrakenD)保持不变,这意味着,例如,您仍然可以对最终用户进行速率限制或要求JWT授权以举几个例子。
1. 关键概念
no-op
headers_to_pass1:1
no-op
no-op
例子:
Cookie
no-op
no-opendpointbackend
"output_encoding": "no-op"endpoint"encoding": "no-op"backend
使用无操作编码时,请记住端点只能有一个后端,因为KrakenD不会检查或处理响应(不会发生合并)。另外,其他管道选项(例如并发请求,断路器或特定于代理管道的后端速率限制)不可用(但仍具有端点速率限制->路由器管道)。
4. 例
no-op
8. 顺序代理(链要求)
消费者使用KrakenD API可能获得的最佳体验是,让系统同时从不同的后端同时获取所有数据。但是,有时您需要延迟后端调用,直到您可以注入上一个调用的结果作为输入为止。
顺序代理允许您链接后端请求。
1. 链接请求
启用顺序代理所需要做的就是在端点定义中添加以下配置:
url_pattern
0backendXXXX
2. 例
通过图形示例更容易理解:
/hotels/{hotel_id}25destination_idGET /hotels/25
destination_id/destinations/{destination_id}GET /destinations/1034
现在KrakenD既有后端的响应,又可以合并数据,将以下对象返回给用户:
此示例所需的配置为:
{resp0_destination_id}destination_id0
9. 静态响应(存根)
静态代理-添加静态/存根数据
在静态代理是处理不完全和其他类型的退化响应客户的援助。启用后,当后端的行为落在所选策略中时,静态代理会在最终响应中注入静态数据。
一种典型的情况是某些后端发生故障而端点变得不完整,但是您宁愿为该部分提供存根响应。当您的应用程序不能很好地处理降级的响应时,可以使用静态数据。
另一个示例场景是创建一个指向尚未完成的后端的端点,该端点的功能尚未投入生产,但是您的客户端应用程序需要使用后端开发人员并开始使用静态响应。
还有许多其他方案,这就是为什么KrakenD提供几种策略可用来决定是否注入静态数据的原因。无论如何,请记住,此功能的主要目标是支持与尚未准备好妥善处理降级响应的客户端有关的极端情况。
1. 静态响应策略
支持的静态数据注入策略如下:
alwayssuccesscompleteerroredincomplete
注意不同的策略,因为它们可能会产生细微的差异。与这些策略相关的代码是:
2. 冲突处理
在所有后端合并发生之后,将处理静态代理,这意味着,如果您的静态数据具有与现有响应冲突的键,则这些键将被覆盖。
groupdata
3. 添加静态响应
endpointextra_config
strategyalwayssuccesscompleteerroredincompletedata
4. 静态代理示例
/static{"errored": {"foo": 42, "bar": "foobar"} }
group
data
10. 检查请求和响应
使用通用表达语言(CEL)检查请求和响应
有时候,您可能希望在网关中包含其他逻辑,以决定是否必须满足请求。
该通用表达式语言(CEL) 中间件使谷歌的CEL规范 ,它实现表达式求通用语义,并且是一个非常简单而强大的选项,请求和响应过程中的完全控制。
启用CEL组件后,可以设置检查请求和响应的任意数量的表达式。
falsetrue
CEL表达式的语法与C / C ++ / Java / JavaScript中的表达式相似,并且计算为布尔条件。例如:
X-Forwarded-For::1
CEL表达式可以在后端和端点的请求或响应期间使用。流程为:
- 请求端点评估
- 请求后端评估(N次)
- 响应后端评估(N次)
- 响应端点评估(可以评估所有合并的数据)
1. 在请求中添加逻辑
req_*
CEL变量
以下数据已注入CEL评估程序以进行检查:
要求
req_methodGETreq_path/fooreq_paramsreq_params.foo.varreq_headersreq_headers['X-Forwarded-For']nowtimestamp(now).getDayOfWeek()

回应
resp_completedresp_metadata_statusresp_metadata_headerresp_datanow
JWT拒绝器
JWT
user_idenabled_dayshas()
2. CEL语法
11. lua脚本
使用Lua脚本进行转换
使用Lua编写脚本是扩展业务逻辑的另一种选择,并且与CEL,Martian或其他Go插件和中间件等其余选项兼容。
如果您对Lua的了解比对Go的熟悉,那么本模块可以帮助您解决一些需要使用脚本的解决方案的特殊情况。在网关中引入Lua脚本不需要重新编译KrakenD,但是与Go不同,Lua脚本是实时解释的。
对于性能优先的用户,Go插件比Lua脚本提供更好的结果。
1. 组态
extra_configendpointbackend
sourcesmd5prepostpostbackendliveskip_nextbackend
2. 支持的Lua类型(备忘单)
proxyrouter
这两种类型的描述如下:
- 路由器:路由器层是最终用户和KrakenD之间发生的事情
- 代理:代理层位于KrakenD和您的服务之间
proxy
当您需要拦截KrakenD和您的服务之间的请求和响应时,请使用此类型。
请求
需要修改KrakenD将要针对后端服务执行的请求的脚本。
loadmethodpathqueryurlparamsheadersbody
req:url()req:url("foo")
响应
需要修改KrakenD将要从后端服务获得的请求的脚本。
loadisCompletestatusCodedataheadersbody
router
当您需要编写路由器层脚本,最终用户与KrakenD之间的流量脚本时,请使用此类型。
ctx
loadmethodqueryurlparamsheadersbody
3. 其他助手(备忘单)
脚本中提供了以下帮助程序:
table
getsetlen
list
getsetlen
http_response
newstatusCodeheadersbody
12. 健康endpoint
添加健康端点
/health/ping
尽管没有默认的运行状况检查实现,但是可以使用不同的策略来实现结果。例如:
/health/__debug//health/health
/health
always
{ "status": "OK" }/health
8. backend
1. backend概述
“后端”的概念指的是原始服务器,它提供了填充端点所需的数据。
后端可以是您网络外部我们内部的任何服务器,只要KrakenD可以访问它即可。例如,您可以创建从内部服务器获取数据的端点,并通过从外部API(例如Github,Facebook或任何其他服务)添加第三方数据来丰富端点。
backend
简单的例子
/v1/productshost/products/_catalog/all/marketing/offers
2. 数据处理
1. 筛选
提供KrakenD端点时,您可以决定仅显示来自后端响应的字段子集,或更改所提供内容的结构。您可能有许多不同的原因想要使用此功能,但是我们强烈建议您使用它来节省用户的带宽并增加负载和渲染时间。
您可以使用两种不同的策略来过滤内容:
- 黑名单
- 白名单
2. 黑名单
可以将黑名单过滤器读取为不显示此过滤器。KrakenD将从响应中删除列表中定义的所有匹配字段,并将显示不匹配的字段。使用黑名单排除响应中的某些字段。
endpointblacklist
嵌套字段(点运算符)
a1{ "a": { "a1": 1 } }a.a1
[]
{ "a": [ { "a1": 1 } ] }a.a1a1
黑名单示例
我们将使用JSONPlaceholder伪造的API,以便您可以实时查看后端的输出。
bodyuserId
/posts/1
/posts/1
bodyuserId
3. 白名单
黑名单过滤器可以被视为唯一显示此过滤器的过滤器。设置白名单时,KrakenD将仅在端点响应中包括与您选择的字段完全匹配的字段。使用白名单严格定义要在响应中显示的字段。
a1{ "a": { "a1": 1 } }a.a1
白名单示例
idtitle
/posts/1
就像我们对黑名单所做的一样。
4. 白名单还是黑名单?
过滤时,需要在黑名单和白名单之间进行选择。这两种操作不能并存,因为它们的行为是相互矛盾的。没有什么可以阻止您玩一会儿,看看将它们混合后会发生什么,但是请确保这只是实验!
从性能的角度来看,黑名单的速度略快于白名单。
5. 分组
group
id
当对不同的后端响应进行分组时,不要共享相同的组名,因为最慢的后端将用相同的组覆盖响应。组名称对于同一端点中的每个后端都应该是唯一的,但这不是强制性的。
6. 分组示例
last_post
这将生成如下响应:
7. 映射
映射(也称为重命名)使您可以更改生成的响应的字段名称,因此您组成的响应将尽可能接近您的用例,而无需在任何后端上更改行。
mapping
映射示例:
emailpersonal_email
会生成这样的响应:
8. 目标
在许多API实施中,经常将所需数据始终封装在通用字段(如数据或内容)中,并且您不希望在响应中包含此级别。 当您要捕获这些通用容器中的内容并将其提取到根本不存在的根目录时,以及要使用其他操作选项时,请使用捕获。捕获发生在白名单或映射之类的其他选项之前。 捕获选项使用配置文件中的属性目标。
捕获目标示例
data
并使用此KrakenD配置
网关将生成如下响应:
9. 集合
使用集合(或数组)是一种特殊的操作情况。关于集合,有两种不同的方案:
data.item[N].property
当后端响应位于数组内部时
{}
[]"is_collection": true
backend"is_collection": true
collection
collectionmapping
以下是一个基于收集响应的真实示例,请复制并粘贴以在您的环境中进行测试:
响应将如下所示:
当您需要操纵数组时
所有数据操作操作(例如白名单,黑名单等)都希望在响应中找到对象。当一个对象嵌套在另一个对象中时,您可以直接过滤,但是等式中存在数组时,KrakenD需要平整结构。
操纵Lua
可以使用Lua脚本转换后端响应。
请参阅Lua脚本文档
3. 限速后端
1. 限速后端
backendendpoint
krakend.json
您可以设置两个参数:
maxRatecapacitybucket capacity == tokens added per second
maxRateclientMaxRate
maxRatemaxRate
clientMaxRate
根据您的用例,您将需要决定是使用一个,另一个,两个还是不使用(最快!)
4. 断路器
为了保持KrakenD的响应能力和弹性,我们在处理管道的多个点上添加了Circuit Breaker中间件。多亏了此组件,当KrakenD要求的吞吐量超过实际API堆栈无法正常交付的吞吐量时,Circuit Breaker机制将检测到故障,并通过不发送可能会失败的请求来防止对服务器造成压力。通过防止过多的请求因超时等而失败,它对于处理网络和其他通信问题也很有用。
该断路器是一个非常简单的状态机的请求和响应,监控所有后端的失败,当他们达到配置的阈值断路器将禁止发送更多的流量到苦难后端的中间。
断路器是对您的后台的一种保护措施,可避免级联故障。
1. 怎么运行的
maxErrorsintervaltimeout
断路器具有三种不同的内部状态,最简单的想象方式就像在电路中一样:
断路器
CLOSEDOPENHALF-OPEN
这就是状态改变的方式:
断路器过渡
CLOSEDOPENmaxErrorsOPENOPENtimeoutHALF-OPENCLOSEDOPEN
2. 配置断路器
github.com/devopsfaith/krakend-circuitbreaker/gobreakerextra_config
以下配置是有关如何向后端添加断路器功能的示例:
5. 并发请求
并发请求是一种出色的技术,可通过多次并行请求相同的信息来提高响应时间并降低错误率。当第一个后端返回信息时,其余线程将被取消。
这在很大程度上取决于您的配置,但是对于当今使用的同一应用程序,将响应时间提高75%或更多并不罕见。
concurrent_calls
/products
concurrent_calls
concurrent_calls
没有建议的数量,因为这最终取决于服务的行为方式以及每种服务所拥有的资源数量。
3
一般来说,如果您在云上工作,启用此功能会更安全,因为您可以轻松地增加资源(但要注意成本)。如果您的硬件有限(内部部署),则在未进行适当的负载测试之前,请勿在生产中激活此功能。
concurrent_calls
concurrent_callsconcurrent_calls
这种策略的明显折衷是后端服务负载的增加,因此请确保您的基础架构已为此做好准备。但是,您的用户喜欢它:更少的错误,更快的响应!
并发请求的影响
100max_response_time
提醒一下:对于CDF图,线的左侧越多越好。对于PDF图形,左侧越多,峰越窄越好。
max_response_time
在这里,您将得到悲观情况的影响:
并发请求组件还可以将暴露的终结点的错误率降低几个数量级。
由于先前图形的比例尺隐藏了巨大的影响,因此让我们使用对数比例尺:
6.支持的后端编码
KrakenD可以解析来自使用多种内容类型或编码的混合后端的响应,例如:
- JSON格式
- XML格式
- RSS
- 字符串
此外,可以使用特殊情况的No-op(代理),但不能用于合并内容。
每个后端声明可以设置一个不同的编码器来处理响应,而且KrakenD仍可以透明地使用混合内容,并在端点中返回统一编码。
/abc/a/b/c
encoding/abc
7. 缓存后端响应
有时,您可能想重用后端的先前响应,而不是通过网络再次请求相同的信息。在这种情况下,可以为所需的后端响应启用内存中缓存。
httpcache
Cache-Control
由于KrakenD需要在到期期间将所有返回的数据保留在内存中,因此该选项会大大增加负载和内存消耗。明智地使用!
如果启用此模块,则需要非常了解响应大小,缓存时间和呼叫的命中率。
backendkrakend.json
除了简单包含之外,中间件不需要其他配置。
看一个例子:
8. 路由阴影或镜像
有时候,您一直在使用新版本的微服务,完整的重构,危险的更改或任何其他有价值的更改,都需要谨慎进行,并且将其投入使用太冒险了,因为可能存在影响您的问题终端用户。
该交通阴影或流镜像功能,您可以测试在生产新的后端通过发送流量他们副本,但忽略了他们的反应。
当您将后端作为影子后端添加到任何端点时,KrakenD会照常继续将请求发送到所有后端,但是标记为“ 影子”的响应将被忽略,并且不会在响应中返回或合并。
将流量镜像到微服务可以使您从观察生产行为的有趣角度测试新的后端。例如,您可以:
- 通过检查其日志来测试应用程序错误
- 测试应用程序的性能
- 强调新服务器
- 检索其他所有有趣的数据,这些数据只有在生产中正在运行时才能看到。
要将后端定义为影子后端,只需添加标记,如下所示:
通过此更改,包含该标志的后端进入生产,但是KrakenD忽略其响应。
示例
v1v2v2v1
9. 数组操作
1. 数组操作-flatmap
平面图中间件允许您通过将数组结构展平和扩展为对象来操作数组,反之亦然。该过程由flatmap组件自动完成,使您可以专注于要执行的操作类型。
extra_configbackend
flatmap_filter
2. flatmap配置
typeargs
组件结构如下:
1. 运作方式
两种类型的操作定义如下:
- 移动
:将集合移动或重命名为另一个。
"type": "move""args": ["target_in_collection", "destination_in_collection"]
- 删除
:删除收藏集
"type": "del""args": ["target_in_collection_to_delete"]
a.b.cca.b
2. 将flatmap与其他操作混合
grouptargetwhitelistblacklistmapping
args
args
.*number0
举例说明
我们将使用基本的JSON结构作为数据表示的示例,请参见下文:
观察结果
从这个例子中注意到……
ab1b2cda"a": []"a": {}
代表一些价值
现在我们已经熟悉了结构,让我们表示相同的值:
a[{"b1": [{"c": 1,"d": "foo"},{"c": 2,"d": "bar"}],"b2": true}, {"b1": [{"c": 3,"d": "vaz"}]}]a.1{"b1": [ { "c": 3, "d": "vaz" } ]}a.0.b1.0.dfooa.1.b1.0.dvaza.*.b1.*.dfoobarvaza.*.*.*.dfoobarvaz
有关操作的实际示例
以上示例结构的一些单独操作:
"a.*.b1.*.c""a.*.b1.*.d"cd"a.*.b1.*.c""a.*.c""a.b1.c""c"a"a.0.b1.0.c""c"c"a.*.b1.c""c"b1c"a.*.b1.c""a.*.b1.*.d.*.e"b1c"a.*.b1.*.c""a.*.b1.*.c.d.e.f.g""a.*.b1.*.c""a.*.x.*.c"x"a.*.b1.*.c""a.*.x.*.c.d.e.f.g"x"a.*.b1.*.c""a.*.b1.*.d.*.e"
配置实例
下面的示例演示如何通过执行以下操作来修改集合:
我们在这里做了什么?
为了执行以下操作,需要执行以下4个操作序列:
students43rdalumnipasswordPK_IDid
有关更多示例,请参见测试文件。
10. 抓换请求和响应
1. 使用Martian修改请求和响应
使用krakend-martian组件,您可以通过配置文件中的简单DSL定义来转换请求和响应。Martian works 与CEL验证完美结合。
当您想要拦截最终用户的请求并在将内容传递给后端之前进行修改时,请使用Martian。同样,反过来,在将后端响应传递给用户之前,先对其进行转换。
Martian works 强大,给您无尽的可能性来控制网关进出的内容。典型的Martian works 场景的一些示例是:
- 在网关处理期间设置新的cookie
- 添加,删除或更改特定的headers
- 在发出后端请求之前查询字符串添加(例如,设置API密钥)
与Martian works 可以进行四种不同类型的互动:
- 修饰符:更改请求或响应的状态。例如,您想要在将请求发送到后端之前在请求中添加自定义header。
- 过滤器:添加条件以执行包含的修饰符
- 组:捆绑多个操作以按照组中指定的顺序执行
- 验证者:根据预期跟踪网络流量
2. 转换请求和响应
extra_configendpointgithub.com/devopsfaith/krakend-martian
您的配置必须如下所示:
修改器配置
scoperequestresponse
3. 转换header
header.ModifierX-Martian
4. 修改body
body.Modifierbodybase64
{"msg":"you rock!"}bodybase64
5. 转换URL
url.Modifier
6. 注入查询字符串参数
querystring.Modifier
7. 复制header
header.Copy
8. 连续应用多个修改器
fifo.Groupmodifiers
用法示例(修改body,并设置header):
9. 所有martian修改器,验证器和过滤器
martian库带有+25个可以使用的修饰符,我们没有在文档中列出所有选项。相反,我们提供了使用火星人时关键的修饰符。
有关修饰符和用法的完整列表,请参见Google的Martian存储库。这些是KrakenD-CE中包含的软件包:
10. 建立新的修饰符
make
没有什么比演示如何创建新修饰符的示例更好。我们的SRE总监(不熟悉Go的人)经历了创建新修改器的过程,该修改器将针对Marvel API自动进行身份验证,添加了API密钥,时间戳和计算得出的哈希值。
11. 消息队列--RabbitMQ
API网关与AMQP消息传递集成
AMQP组件允许通过API网关向队列发送消息和从队列接收消息。
extra_configgithub.com/devopsfaith/krakend-amqp/consumegithub.com/devopsfaith/krakend-amqp/produce
该集成的参数遵循AMQP规范。要了解某个参数的含义,请参阅《AMQP完整参考指南》。
KrakenD为您创建交换和队列。
常用设定
使用者和生产者都具有以下共同的配置密钥:
nameexchangetopicrouting_keydurabletruedeletefalseexclusiveno_wait
以下配置演示了消费者和生产者如何创建整个发布/订阅模式。
1. 消费者
GET
单个端点可以使用来自N个队列的消息,或者可以通过添加具有正确队列名称的N个后端来使用同一队列的N条消息。
例
运行使用者的所需配置为:
消费者设置
使用者的参数的完整列表为:
prefetch_countprefetch_sizeno_local
2. 生产者
POST
headers_to_pass
运行生产者所需的配置如下:
生产者设置
生产者参数的完整列表为:
prefetch_countprefetch_sizemandatoryimmediate
此外,以下这些项目是可以在端点URL中存在并传递给生产者的参数键:
exp_keyreply_to_keymsg_id_keypriority_keyrouting_key
endpoint/produce/{a}/{b}/{id}/{prio}/{route}
12 . 发布者/订阅者
使用发布者/订阅作为后端
从KrakenD 1.0开始,您可以将端点连接到多个发布/订阅后端,从而帮助您与事件驱动的体系结构集成。例如,前端客户端可以使用REST接口将事件推送到队列。或者,客户端可以使用REST端点,该端点插入到后端中推送的最后一个事件。您甚至可以验证消息和格式,因为可以使用所有KrakenD可用的中间件。支持的后端技术的列表是:
- AWS SNS(简单通知服务)和SQS(简单队列服务)
- Azure Service Bus主题和订阅
- GCP PubSub
- NATS.io
- RabbitMQ
1. 组态
extra_configbackend
对于订户:
对于发布者:
schema://url
2. GCP PubSub
Google的Cloud Pub / Sub是一项完全托管的实时消息传递服务,可让您在独立的应用程序之间发送和接收消息。
如Google文档所述,要连接到GCP PubSub,连接使用环境中的默认凭据。
您需要使用的架构是:
"gcppubsub://projects/myproject/topics/mytopic""gcppubsub://myproject/mytopic""gcppubsub://projects/myproject/subscriptions/mysub""gcppubsub://myproject/mysub"
3. NATS
NATS.io是一个简单,安全,高性能的开源消息传递系统,适用于云本机应用程序,IoT消息传递和微服务架构。
nats://mysubject
URL主机+路径用作主题。不支持查询参数。
4. AWS SNS
awssns:///sns-topic-arn
awssns:///arn:aws:service:region:accountid:resourceType/resourcePath
5. AWS SQS
Amazon Simple Queue Service(SQS)是一项完全托管的消息队列服务,使您能够解耦和扩展微服务,分布式系统和无服务器应用程序。
awssqs://sqs-queue-url
对于SQS主题和订阅,URL的host + path会自动以“ https://”作为前缀,以创建队列URL。
6. Azure Service Bus主题和订阅
Microsoft Azure Service Bus支持一组基于云的,面向消息的中间件技术,包括可靠的消息队列和持久的发布/订阅消息。这些“代理”消息传递功能可以认为是解耦消息传递功能,这些功能支持使用Service Bus消息传递工作负载进行发布-订阅,时间解耦和负载平衡方案。
架构:
azuresb://mytopicazuresb://mytopic?subscription=mysubscription
URL的主机+路径用作主题名称。对于订阅,必须在“ subscription”查询参数中提供订阅名称。
7. rabbitmq
RabbitMQ是最受欢迎的开源消息代理之一。
架构:
rabbit://myexchangerabbit://myqueue
对于主题,URL的主机+路径用作交换名称。对于预订,URL的主机+路径用作队列名称。不支持查询参数。
13. Lambda函数
与AWS Lambda函数集成
Lambda集成允许您在KrakenD端点调用上调用Amazon Lambda函数。lambda函数返回的内容可以像其他后端一样对待和处理。
endpoint
GETGET
您无需在中间设置Amazon API Gateway,因为KrakenD会为您完成这项工作。
1. Lambda配置
extra_configbackendgithub.com/devopsfaith/krakend-lambda
支持的参数是:
function_namefunction_param_name{placeholder}function_namefunction_param_nameregionus-east-1eu-west-2max_retriesendpoint
认证方式
~/.aws/credentials
设置凭据时,请确保在提供了凭据的KrakenD框中可调用lamdba。这意味着要让IAM用户具有策略和执行角色,以使您可以调用该功能
2. 例子
将Lambda关联到后端
当KrakenD端点连接到同一Lambda时,请使用以下配置:
从网址中获取lambda
当Lambda的名称取决于端点中传递的参数时,请改用以下配置:
function_param_name{lambda}
GET /call-a-lambda/my-lambdamy-lambda
14. 返回后端错误
返回后端错误的详细信息
当您愿意操纵或聚合数据时,KrakenD关于错误和状态代码的策略是向客户端隐藏任何后端详细信息。其背后的理念是客户必须与其基础服务脱钩。
另一方面,如果您的端点没有任何操作地连接到单个后端,则使用no-op编码将响应原样返回给客户端,并保留其形式:主体,标头,状态代码等。
您可以覆盖隐藏后端错误详细信息的默认策略。
1. 显示后端错误
return_error_details
backend
return_error_details
2. 后端失败的响应
error_backend_alias
如果没有错误,则key将不存在。
3. 例
以下配置设置了一个具有两个后端的端点,这些端点通过两个不同的键返回其错误:
backend_bbackend_a
9. 授权
1. JWT令牌概述
该JSON网络令牌规范是行业标准,以双方之间安全地在债权。该JWT是包含由受信任的机构签署的属性的键值对编码的JSON对象。
当JWT保护一组特定的端点时,对API网关的请求必须提供令牌。令牌的验证在每个请求中进行,包括签名的检查以及(可选)确保其发行者,角色和受众足以访问端点的保证。
仅在令牌有效并通过所有检查的情况下,用户才有权访问端点并继续请求。
KrakenD JWT实现
KrakenD同时实现了JWT签名和JWT验证模型,以保护端点免受那些无权使用该信息的不受欢迎用户的攻击,从而增强了安全性。
但是,像KrakenD 这样的无状态系统不会发行令牌。
2. JWT验证
JWT验证可屏蔽任意数量的所需端点,从而强制向API网关的请求以提供第三方发出的令牌。令牌的验证在每个请求中进行,包括签名的检查以及(可选)确保其发行者,角色和受众足以访问端点的保证。
JOSE组件**是负责验证令牌。
Authorization
还有cookie?是的,您还可以在cookie中发送验证令牌。
我们认为JWT令牌在格式正确,由公认的发行者签名,未过期,有一些主张且未标记为已撤消时有效。
当您为最终用户生成令牌时,请确保设置低有效期限。令牌应该寿命短,建议在几分钟或几小时内过期。
1. 基本的JWT验证
JWT验证是针对每个端点的,并且必须存在于需要它的每个端点定义中。如果几个端点需要JWT验证,请考虑使用灵活的配置以避免重复声明。
"github.com/devopsfaith/krakend-jose/validator"extra_config``endpoint
/protected/resource
此配置确保:
useradminhttp://api.example.com/custom/roles
JWT验证设置
以下设置可用于JWT验证。字段alg和jwk-url是必填字段,其余的键可以根据您的最佳方便添加或不添加。
"github.com/devopsfaith/krakend-jose/validator"
algRS256jwk-urlcachetrueaudienceroles_keyrolesissuercookie_keydisable_jwk_securitytruejwk_fingerprintscipher_suites
有关公认的算法和密码套件的完整列表,请向下滚动至文档末尾。
以下示例包含每个可用的选项:
2. 一个完整的运行示例
该KrakenD游乐场演示了如何使用保护JWT端点,包括准备使用用一个例子来自Auth0单页的应用。要尝试,请克隆游乐场并按照自述文件进行操作。
3. 支持的哈希算法和密码套件
散列算法
alg
EdDSAHS256HS384HS512RS256RS384RS512ES256ES384ES512PS256PS384PS512
密码套件
密码套件的可接受值为:
510475360156157491594916149162491694917049171491724918749191
默认套件为:
491994919549200491965239252393
3. JWT签名
JWT签名组件旨在创建一个端点包装,当您的应用程序返回纯文本令牌时,该包装返回签名的令牌。令牌返回给使用您的密钥签名的用户,该密钥可以保存在网关或受信任的计算机中。使用令牌签名,您就可以控制私钥,并且无需信任外部源即可为您保留私钥。
该JOSE组件负责签署令牌。
1. 要求
您需要一个后端(不是KrakenD),该后端公开一个能够发出令牌的端点,以及另一个用于刷新令牌的端点。
/token-issuerPOST
2. 基本的JWT签名
当您的应用程序知道如何发行令牌时,可以在将其自动通过网关传递给用户之前对其进行签名。为了实现这一点,我们仅发布KrakenD一个名为/ token的新端点(选择您的名字),而不是发布在/ token-issuer下生成普通令牌的内部后端。该端点转发在POST中接收到的数据(在示例中选择),并在后端回复时返回签名的令牌。
例如,在上面的普通令牌中,我们希望对键“ access_token”和“ refresh_token”进行签名,以便没有人可以修改其内容。我们需要这样的配置:
请注意,提供了JSON Web密钥来对内容进行签名。生成密钥并保存在安全的地方。
/token
3. 一个完整的运行示例
/token
4. JWT签名设置
以下设置可用于签署JWT:
algRS256jwk-urlkidkeys-to-sign
可选的:
fulldisable_jwk_securitytruejwk_fingerprintscipher_suites
以下示例包含每个可用的选项:
4. 销毁令牌
吊销有效令牌
API网关授权根据您的条件提供有效令牌的用户,但是在某些时候,您可能想改变主意并决定撤销应该仍然有效的令牌。
吊销有效令牌的示例可能是您的应用程序的管理员决定用户不再能够登录到系统,或者您想要为子集或所有用户强制重新协商令牌,因为您不打算这样做。等待到期。
KrakenD集成了Bloomfilter组件,该组件允许您以优化的方式存储令牌以撤销后续请求。激活bloomfilter时,将像bloomfilter一样将令牌检查为黑名单,并且如果用户的令牌与bloomfilter匹配,则不允许访问。
bloomfilter组件具有以下功能:
- 将列入黑名单的令牌保存在内存中
- 通过RPC接口单独或批量管理令牌。
- 检查令牌并放弃对肯定消息的访问
1. 为什么选择bloomfilters?
Bloomfilters非常适合以很少的内存消耗支持大量拒绝令牌。例如,任何大小的1亿个令牌消耗约0.5GB RAM(999,925,224个令牌中的误报率为1),并且查找在恒定时间内完成(k个哈希)。使用键值或关系数据库无法获得这些数字。
令牌位于内存中,直接位于拒绝器界面中,因此系统可以快速解决匹配问题。
2. 额外资源
如果您想通过示例学习bloomfilters,请查看以下资源:
3. 集群中的令牌到期
所有的KrakenD节点都是无状态的,并且各自动作。每个节点都需要接收有关需要在每个本地Bloomfilter中插入的任何令牌的RPC通知。服务运行时,bloomfilter会更新,但是节点之间的同步级别取决于您如何将它们推送到群集中。该系统最终是一致的。
该组件为您提供了Bloomfilter管理,但是您仍然需要实现管理部分,该管理部分用作这些令牌的源以及对它们的推送(例如,队列和使用者)。
5. OAuth 2.0客户端token
通过OAuth 2.0客户端凭据,Grant KrakenD可以向您的授权服务器请求访问令牌,以访问受保护的资源。
客户端凭据授权KrakenD作为客户端访问受保护的资源。不要将此与授权最终用户混淆(请参阅JWT)。
成功地为后端设置客户端凭据意味着KrakenD可以获取受保护的内容,但是提供给最终用户的端点将是公共的,除非您使用JWT保护它。
1. 配置OAuth2客户端token
backendextra_config
"github.com/devopsfaith/krakend-oauth2-clientcredentials"
该组件的设置为:
client_idclient_secrettoken_urlscopesscopeA,scopeBendpoint_paramsaudience
2. Auth0整合
以下示例演示了满足Auth0要求的完整配置。它基本上与我们上面显示的配置相同,但有一些附加功能,在代码后进行了解释:
上面的代码适用于Auth0。与基本示例的区别在于:
endpoint_paramsAcceptkrakend-martian
10. 服务发现
1. 服务发现概述
服务发现使客户端能够自动检测和定位企业网络上的服务。无需定义指向后端的IP或主机名的静态列表,您可以使用服务发现提供程序并使KrakenD与之交互以动态获取主机。
1. 静态解析
static
"sd": "static"
2. DNS SRV
DNS SRV
最典型的设置是KrakenD + Consul(请参阅标准查找)。
3. etcd
KrakenD可以监视etcd安装中的键的值,并在更改时重新配置自身。
与etcd的集成使您可以设置分布式键值存储并配置详细信息,例如超时,保持活动状态和证书。
4. Eureka
支持Netflix Eureka客户端。该软件包是Schibsted工程师提供的开源软件。
2. SD with DNS SRV (e.g. Consul)
DNS SRV
DNS SRV
"sd": "dns""host": []
backendhosthost
例如:
3. 使用etcd进行服务发现
etcd服务发现集成使您可以使用现有的etcd设置执行主机解析。
集成etcd由krakend-etcd组件控制,并为etcd添加了客户端和订户功能。
1. 启用etcd
要启用etcd,请在配置文件的根目录中添加必要的设置:
github_com/devopsfaith/krakend-etcdmachines
certkeycacert
etcd
2. 使用etcd解析后端
backendhosthost
"sd": "etcd""host": []
例如,为单个后端设置服务发现:
4. Eureka
Netflix服务Eureka的用户在我们的krakend-contrib存储库中列出了几个用户贡献的集成。
集成未与KrakenD-CE版本捆绑在一起,但可以将它们添加到项目中并轻松进行自定义构建。
11. 交通管理
1. 速率限制
节流概述
KrakenD提供了几种保护您的基础架构使用的方法,这些方法可能在不同的层次上起作用。
最重要的限制类型是速率限制,该速率限制使您可以限制最终用户的流量或KrakenD的后端服务流量。该速率限制主要包括以下目的:
- 避免对大量后端请求施加压力或使后端服务泛滥(代理速率限制)
- 为您的公开API建立使用配额(路由器速率限制)
- 为您的API创建简单的QoS策略
速率限制是断路器功能的补充。
1. 速率限制的类型
速率限制有两个不同的层:
- 路由器层:为到达KrakenD端点的最终用户设置最大吞吐量。
- 代理层:设置KrakenD和您的后端服务之间的最大吞吐量
要深入研究代码,请参阅速率限制中间件
限制集群速率
krakend.json
2. 断路器
所述断路器是一个状态机的请求,并且观察后端的失败的响应之间。当后端似乎出现故障时,KrakenD会停止发送更多流量,以避免在遭受痛苦的后端承受压力,直到后端被认为已恢复为止。
断路器是对堆栈的自动保护措施,可避免级联故障。
3. 超时和空闲请求
KrakenD允许您微调用于访问后端的HTTP服务器和HTTP客户端的超时。根据IDLE连接,每个后端都有大量的IDLE连接,它直接影响代理层的性能。
2. 脚本程序探测
控制漫游器流量
脚本程序检测程序模块检查到网关的传入连接,以确定是否由脚本程序建立,从而帮助您检测和拒绝进行抓取,内容盗窃和形成垃圾邮件的僵尸程序。
通过检查User-Agent并将其值与您提供的一组配置规则进行比较来检测Bot。脚本检测程序模块未设置任何初始规则,这取决于您决定用例的最佳规则,并选择对脚本程序的限制或宽松程度。
由于脚本检测程序模块的配置非常灵活,因此您可以将其用于其他用途,而不仅仅是丢弃脚本程序请求。例如,您可以为移动应用程序User-Agent设置白名单规则,该规则将被允许与KrakenD交互并丢弃其余流量。
配置脚本检测规则
extra_configgithub_com/devopsfaith/krakend-botdetectorkrakend.json
例如:
脚本检测程序模块中的可用配置选项为:
whitelistblacklistpatternscacheSize
whitelistblacklist
patterns
whitelistblacklistpatterns
建立您的脚本检测规则
对抗垃圾邮件,蜘蛛,报废,盗窃和机器人攻击是一个问题。您可以选择不同的角度来使用机器人检测模块来对抗它。
也许您想让大量困扰机器人的正则表达式列表成为可能,并启用缓存。
或者,也许您只需要一个否定模式就可以丢弃所有您不知道合法的东西。
无论您决定设置什么规则,请记住,白名单和黑名单要快但不灵活,需要您设置确切的用户代理。另一方面,正则表达式非常方便,但是与之相比,评估它们的成本更高。
缓存
cacheSize
LRU缓存系统是内存中的,不需要运行单独的服务器集,从而减少了操作麻烦。既没有缓存过期时间,也没有明确的缓存逐出。当/如果高速缓存已满,则最近使用最少的(LRU)元素将自动替换为新元素。一个兆字节的数量级应该足以保存不同的User-Agent请求和组合。
cacheSize0
3. 请求超时
超时时间
作为KrakenD,API网关可以与其他服务进行通信,因此能够控制不同方面的等待时间至关重要。KrakenD将允许您微调这些设置。
超时可以应用于:
- 整个管道的持续时间(从用户请求到用户响应)
- HTTP请求相关的超时
此外,您可以控制最大IDLE连接数。
1. 管道超时
1. 全局超时
timeoutkrakend.json
2. 端点特定的超时
timeout
为此,只需将其放在所需的端点内:
/splash
3. 达到超时时间会怎样?
500 Internal Server Error
2. HTTP请求超时
除了整个管道的超时,您还可以配置特定的HTTP层超时。下面的所有设置都与管道超时一样工作。如果将此值放置在端点中,它们将覆盖全局设置。
1. HTTP读取超时
读取整个HTTP请求(包括正文)的最大持续时间。
此超时不能使处理程序在每个请求正文的可接受截止日期上做出每个请求的决定。
2. HTTP写超时
超时写入响应之前的最大持续时间。
每当读取新的请求标头时,都会将其重置。像HTTP读取超时一样,它也不允许处理程序根据每个请求做出决策。
3. HTTP空闲超时
启用保持活动后,等待下一个请求的最长时间。
如果IdleTimeout为零,则使用ReadTimeout的值。如果两者均为零,则使用ReadHeaderTimeout。
4. HTTP读取header头超时
读取请求标头所允许的时间。
读取标头后,将重置连接的读取截止时间,处理程序可以决定对主体来说太慢的速度。
3. 时间单位
您可以使用以下任何单位来指定超时的时间单位是整数(不是float):
nsusµsmss
它也可用,尽管您永远不要使用它们:
mh
不同单位的等效超时示例包括:
4. 最大IDLE连接
max_idle_connections
max_idle_connections250
每个生态系统都需要有自己的环境,请牢记以下几点:
max_idle_connections
有关传输层的更多信息,请参见MaxIdleConnsPerHost
12. 日志记录,指标和跟踪
1. 日志
DEBUG
扩展日志记录功能
不同的日志记录组件使您可以扩展日志记录功能,例如将事件发送到syslog,选择详细级别或使用Graylog扩展日志格式(GELF)。除此之外,还有许多出口商可以发送您的日志。
gologging
gologging
- 选择写入标准输出
- 选择写入系统日志
- 在日志行中添加前缀
- 选择报告级别
- 选择使用预定义或自定义格式
gologging
krakend.jsonextra_config
上面的代码段显示了您可以配置的四个选项,下面进行说明。
设置报告级别
level
DEBUGINFOWARNINGERRORCRITICAL
写入系统日志或标准输出
对于每个触发的日志事件,输出可以写入syslog,stdout或两者。接受的值是布尔值。设置为true时,日志将写入所选目标:
"syslog": true"stdout": true
为所有行添加前缀
此外,您可能希望选择在每个记录的行中添加一个字符串,以便稍后可以使用外部工具快速过滤消息。
"prefix": "[ANY STRING]"
预定义和自定义格式
如果要遵循其他记录模式,则可以。
"format": "custom"
defaultlogstashcustom
customcustom_format
"custom_format": "%{message}"
Logstash
krakend-logstashkrakend.jsonextra_config
例如:
2. 指标
/__stats/
启用指标
github_com/devopsfaith/krakend-metricsextra_config
中间件的选项是:
collection_timeproxy_disabledrouter_disabledbackend_disabledendpoint_disabled/__stats/listen_address
3. 追踪
从单个整体应用程序迁移到分布式微服务体系结构提出了新的挑战。可观察性和网络连接是在这种新情况下成功的关键,因此需要新的监视工具。这些工具必须至少提供选项,以检测问题的根本原因,监视和监视不同分布式事务的详细信息以及性能和延迟优化。
Opencensus导出器允许您将跟踪发送到其中一些开源和专用工具,因此您可以跟踪网关的活动以及派生到后端的请求。
启用跟踪对于详细了解网关内部以及用户,网关和您的服务之间的情况很关键。
支持以下跟踪导出器:
- Jaeger
- Zipkin
- AWS X-Ray
4. Graylog和GELF格式
由于krakend-gelf集成,KrakenD支持将GELF格式的结构化事件发送到Graylog群集。
GELF的设置非常简单,只需设置两个参数即可:
addressenable_tcpfalse
启用GELF
krakend-gelfkrakend.jsonextra_config
例如:
5. Logstash
如果要通过stdout使用Logstash标准进行日志记录,则必须在extra_config部分的krakend.json的根级别中添加krakend-logstash集成。还需要启用gologging
例如:
6. 将日志,指标和跟踪导出到多个服务提供者
Opencensus导出器是一个组件,可让您将数据导出到开源和私有的多个提供程序。
当您想在Opencensus的其中一个受支持的导出器中查看数据时,您会感兴趣。例如,您可能想将指标发送给Prometheus。这就像在您的krakend.json文件的根目录中添加此代码段一样简单:
配置
尽管可以在同一配置中添加多个导出器,但Opencensus仅需要一个导出器即可工作。每个导出器都有自己的配置,这在自己的部分中进行了描述。
默认情况下,所有导出器都对每秒接收到的请求进行100%采样,但是可以通过指定更多配置来更改此设置:
sample_rate100reporting_periodexporters
让您指定要导出的数据。默认情况下,所有层均启用:
backendrouter
7. 将指标导出到Prometheus
Prometheus是一个开源系统监视和警报工具包。
prometheusportnamespace
portnamespace
另请参阅可以声明的Opencensus模块的其他设置。
8. 将指标和事件导出到InfluxDB
InfluxDB是一个时间序列数据库,旨在处理较高的写入和查询负载。
influxdb
以下配置片段将数据发送到您的InfluxDB:
addressdbtimeout
另请参阅可以声明的Opencensus模块的其他设置。
9. 将日志导出到Zipkin
Zipkin是一个分布式跟踪系统。它有助于收集解决服务体系结构中的延迟问题所需的时序数据。
zipkin
以下配置片段将数据发送到您的Zipkin:
collector_urlservice_name
另请参阅可以声明的Opencensus模块的其他设置。
10. 将日志导出到Jaeger
Jaeger是一个开源,端到端的分布式跟踪系统,使您可以监视复杂的分布式系统中的事务并进行故障排除。
jaeger
以下配置片段将数据发送到Jaeger:
endpointserviceName
另请参阅可以声明的Opencensus模块的其他设置。
11. 将日志导出到AWS X-Ray
AWS X-Ray是Amazon提供的一项服务,当请求在您的应用程序中传播时,它提供端到端视图,并显示应用程序的基础组件的地图。
xray
以下配置片段将数据发送到您的X-Ray:
versionregionuse_envtrueaccess_key_idsecret_access_keyaccess_key_iduse_envfalsesecret_access_keyuse_envfalse
另请参阅可以声明的Opencensus模块的其他设置。
12. 将指标,日志和事件导出到Google Stackdriver
Google Stackdriver汇总了来自基础架构的指标,日志和事件,为开发人员和操作员提供了丰富的可观察信号集,可加快根本原因分析并缩短平均解决时间(MTTR)。
stackdriver
以下配置片段将数据发送到您的X-Ray:
project_idmetrics_prefixdefault_labelsenvproduction
另请参阅可以声明的Opencensus模块的其他设置。
12. 导出到logger
Opencensus可以将数据作为另一个导出器导出到系统记录器。
logger
以下配置片段可启用记录器:
statsspans
另请参阅可以声明的Opencensus模块的其他设置。
13. 集群
1. 高可用性集群
KrakenD群集由同时运行并协同工作的多个KrakenD实例组成,以提供更高的可靠性,更高的吞吐量,可伸缩性和故障转移。
KrakenD群集运行与您今天使用的相同KrakenD开源软件来启动单个实例。因此,无需许可证即可操作大型企业级API网关。
KrakenD集群的好处
拥有KrakenD集群可立即带来以下好处:
- 更高的吞吐量和容量:拥有更多KrakenD节点可以扩展API可以处理的请求数量。
- 即插即用节点:添加更多节点不需要任何协调或过程,在旅途中旋转更多服务器而不会中断服务。
- 无限的可扩展性和零协调:与其他具有共享状态(和集中式协调)的网关不同,每个KrakenD节点都是无状态的。期望分布式,自治和独立的节点之间不会进行通信或协调,从而为您提供无限的可伸缩性。
- 高可用性和故障转移:如果服务器因任何原因死亡或实例发生故障,群集中的其余成员将继续提供服务,而不会影响全局可用性。
- 监视:所有KrakenD节点分别向InfluxDB,Prometheus或您选择的任何其他可用集成报告。您的指标收集系统将具有所有节点的汇总指标。
- 没有单点故障:完全分布式的群集,没有任何可以关闭网关的外部依赖项(例如,数据库故障)
- 易于配置和维护:仅需使用相同配置文件副本来旋转服务器的集群,就不可能拥有更简单的解决方案。
2. 设置集群
硬件随时可能发生故障,而网关是至关重要的部分,足以保证服务的冗余性。拥有运行该服务的计算机集群可确保高可用性。
KrakenD节点是无状态的,它们不将数据或应用程序状态存储到持久性存储中。而是,配置文件中存在任何配置数据和应用程序状态。由于节点不容纳任何东西,因此它们随时都可以消耗和更换。
运行集群
运行机器集群是一个简单的过程,仅需要两个条件:
- 在机器前安装平衡器(例如,ELB,Haproxy)
- 运行两个或多个KrakenD服务
如果您在云中,则可以使用ELB或类似工具进行工作。本地用户可以使用HAProxy。安装好负载均衡器后,注册所有KrakenD实例,以便它们开始接收流量。
当KrakenD的所有所需节点都运行时,每个实例都会遵循其配置,并将跟踪和指标报告给您选择的服务。
有关部署KrakenD的最佳实践,请参阅部署KrakenD
14. 部署最佳实践
设置KrakenD实例集群是一个简单的过程,但是这里有一些建议可以帮助您入门。
使用HTTP2
在平衡器和KrakenD API网关之间启用HTTP2,以获得最佳性能。
SSL协议
在负载均衡器中添加SSL证书,并在负载均衡器和KrakenD之间使用内部证书。
启用指标和日志记录
WARNING
启动命令
/dev/null
命名配置
name
name
15. 开发工具
使用KrakenD进行开发时,有一些资源可以使您的生活更轻松。这些工具只能在开发中使用,绝不能在生产中使用
热加载配置
使用Reflex的Docker镜像监视配置目录并在配置更改时重新加载KrakenD。这在您进行开发时非常方便,因为它允许您测试新的更改,而不必手动重新启动,从而使过程不再那么繁琐。
基于配置生成可视化界面
krakend.json
调试活动
krakend-memviz
将请求/响应快照的DOT文件导出器添加到代理堆栈中,以进行调试和开发。请勿在生产中使用此功能,因为它会影响您的性能。
krakend-spew
记录看到的每个实体:显示整个流程传递的请求和响应。请勿在生产中使用此功能,因为它会影响您的性能。
__.txt
16. 扩展KrakenD
KrakenD作方式以及原理
在开始研究KrakenD框架代码之前,花几分钟时间了解系统的主要部分,其工作方式以及其背后的原理。
KrakenD规则
让我们从编写KrakenD的规则开始,因为它们回答了架构设计问题:
- 反应性是关键(是的,这非常重要)
- 快速失败比缓慢失败更好(多说一次!)
- 越简单越好
- 一切都是可插拔的
- 每个请求必须在其请求范围的上下文中进行处理
KrakenD内部状态
当您启动KrakenD时,系统会经历两个不同的内部状态:building和working。让我们看看在每种状态下会发生什么。
building
building状态管理服务启动并在系统开始接收流量之前对其进行准备。在building状态期间,发生三件事:
- 解析配置以修复系统行为
- 中间件的准备
- 管道施工
pipe
当构建状态完成时,由于所有映射都是直接在内存中进行的,因此KrakenD服务不需要为关联的处理程序函数计算任何路由或查找。
working
工作状态是系统准备就绪并可以处理请求时。当它们到达时,路由器已经具有请求与处理程序功能的映射,并触发了管道执行。代理是管道的步骤,用于在其余过程中进行操作,汇总和其他数据处理。
由于处理程序功能已在上一步中,因此KrakenD不会根据端点数量或用户请求的URI的基数来影响性能。
重要的packages
KrakenD框架由一组软件包组成,这些软件包被设计为构建块,用于在暴露的端点与后端所服务的一个或多个API资源之间创建管道和处理器。
最重要的软件包是:
configrouterproxy
框架的其余软件包包含一些用于其他任务的帮助程序和适配器,例如编码,日志记录或服务发现。
此外,KrakenD-CE在其范围和软件包中捆绑了许多中间件和组件。这些软件包和其他软件包在我们的KrakenD Contrib存储库中列出。
config
config
ServiceConfig
config
router
routermuxnet/httphttproutergin
ServiceConfig
该层可以轻松扩展为使用您选择的任何HTTP路由器,框架或中间件。路线图中将添加用于其他协议(Thrift,gRPC,AMQP,NATS等)的传输层适配器。一如既往,欢迎PR!
proxy
proxy
- 代理是将给定上下文和请求转换为响应的功能。
- 中间件是一种函数,它接受一个或多个代理并返回一个包装它们的代理。
该层将从外层(路由器)收到的请求转换为对后端服务的单个或多个请求,处理响应并返回单个响应。
中间件会生成自定义代理,这些自定义代理将根据配置中定义的工作流进行链接,直到每个可能的分支以与传输相关的代理结尾。这些生成的代理中的每个代理都可以转换输入,甚至克隆输入几次,然后将其传递给链中的下一个元素。最后,他们还可以修改接收到的响应或将各种功能添加到生成的管道的响应。
KrakenD框架提供了代理堆栈工厂的默认实现。
可用的中间件
balancingconcurrentloggingmergingconcurrenthttpURLPattern
可用代理
httpHTTPClientFactoryDecoderEntityFormatter
proxy
代理程序包还定义了EntityFormatter,该块负责启用强大而快速的响应操作。
编写自定义插件
KrakenD的模块化设计使您可以通过添加自定义代码来扩展其功能。作为工程师,总是很想开始编写代码,但是大多数情况下不需要编写任何代码。现有的模块,中间件和插件几乎可以满足每个人的需求。
重要的是,如果您要进行复杂的业务逻辑检查和转换,除了核心功能之外,还可以为此设计特定的脚本,而无需编译Go代码。例如el表达式,Martian转换或Lua脚本。 让我们开始构建自定义代码!
让我们开始构建自定义代码!
从哪里开始定制
插件一词出现在Internet上的许多地方,但是当我们谈论插件时,我们指的是Go plugins。
KrakenD API网关是一个框架以及许多其他片段和存储库的组合,它们可以在一个最终的二进制文件中进行编译。我们将这些部分称为中间件,组件,模块或程序包__(ツ)_ /。
插件是一个软链接库,因此是一个单独的.so文件,与KrakenD一起运行时,它可以参与处理。
插件和中间件是紧密的概念,但不要混淆它们。中间件在KrakenD二进制文件中编译,而插件则在另一个二进制文件中编译。
插件允许您将自定义功能“拖放”到KrakenD中,但仍使用官方二进制文件。自定义中间件需要编译您的KrakenD版本。
扩展KrakenD的方法
您要么编写插件,要么编写中间件。这是三个选项:
- 在路由器层中编写和注入插件
- 在代理层中编写和注入插件
- 编写一个全新的中间件并使用它编译KrakenD
选择哪个取决于您要完成的工作。一个简单的方向可以是:
您要在KrakenD开始处理之前修改用户的请求吗?
- 选择路由器插件。
您是否要更改KrakenD与后端服务的交互方式?
- 选择代理插件。
您是否要更改管道的内部,添加工具,集成等?
- 编写您的自定义中间件。
请求和响应顺序
进一步阅读之前,建议阅读的内容是“ 了解全局 ”,并特别标识重要的软件包。
简而言之,请求-响应的顺序如下:
proxyrouterrouter
编写和注入插件
下图显示了上述顺序。请注意两个蓝点:
- http处理程序(路由器)
- http客户端(代理)
17. 常见问题
201
例如:
说明
默认情况下,如果后端返回200或201,则网关将始终发送HTTP状态200。如果您需要其他行为,则可以注入自己的HTTPStatusHandler实现。查看此问题评论以获取更多详细信息。
500200201
例如:
说明
默认情况下,如果后端返回高于400的任何状态,则网关将始终发送HTTP状态500。如果需要其他行为,则可以注入自己的HTTPStatusHandler实现。查看此问题评论以获取更多详细信息。
503
例如:
maxRate503
说明
maxRatemaxRate = 0
请记住:快速失败总是比使基础结构过载并降低整个服务的质量更好。
我的回应是空的
做出回应的主要原因是:
timeout
请参阅下面的解决方案。
解决超时问题的方法
timeout
2000ms
解决无效响应的方法。
[]Treat the response as a collection, not an object.
保留端点
以下名称不能用作端点名称,因为它们是保留名称:
初步翻译结束,翻译版本是V1.0.0,就这样吧