共计 3728 个字符,预计需要花费 10 分钟才能阅读完成。
本文作者琚致远,Apache APISIX PMC,干流科技企业产品与大前端技术负责人。通过浏览本文,您能够理解 Apache APISIX 与根本应用场景,以及在低代码潮流下,Apache APISIX 是如何集成“拖拽”的插件编排能力的。
什么是 Apache APISIX?
Apache APISIX 是一个生产可用的七层全流量解决平台,可作为 API 网关解决业务入口流量,具备极高性能、超低提早的显著个性。它内置了 50 多种插件,笼罩身份验证、平安防护、流量管制、Serverless、可观测性等多个方面,可满足企业客户常见的应用场景。
如下方架构图所示,Apache APISIX 分为数据面(左侧)与管制面(右侧)两局部:通过管制面下发配置到 ETCD,数据面借助丰盛的插件解决内外流量。
Apache APISIX 裸露了一组接口,不便咱们为 API 绑定插件。如果咱们心愿为 API 减少限速能力,只需为 API 绑定 limit-req
插件:
curl -X PUT http://127.0.0.1:9080/apisix/admin/routes/1 -d '{"uri":"/get","methods": ["GET"],"upstream": {"type":"roundrobin","nodes": {"httpbin.org:80": 1}
},
"plugins": {
"limit-req": {
"rate": 1,
"burst": 2,
"rejected_code": 503,
"key": "remote_addr"
}
}
}’
调用胜利后,当申请达到该 API 时将进行限速管控。
该示例应用 limit-req
实现 API 限速(特定性能),若针对“依据某个插件的处理结果,决定后续的申请解决逻辑”这种场景化需要,该怎么做呢?以后,现有的插件机制无奈满足这种需要,这时便引申出插件编排的能力来解决这个问题。
什么是插件编排?
插件编排是低代码的一种表现形式,它能够帮忙企业升高应用老本、减少运维效率,是企业数字化转型过程中不可或缺的能力。借助低代码 API 网关 Apache APISIX 中插件编排能力,咱们能够轻松地将 50+ 插件通过“拖拽”的形式进行组合编排,被编排的插件也可能共享上下文信息,最终实现场景化需要。
扩大上述 API 限速的场景:申请应用 key-auth
插件进行身份认证,若认证通过,将由 kafka-logger
插件接管并进行日志记录;若认证失败(插件返回 401 状态码),将应用 limit-req
插件进行限速。
见如下操作视频:
https://www.bilibili.com/vide…
该视频中,Web 界面列出了目前已有的插件与画板,咱们能够将插件拖拽到画板上进行编排,并填写插件绑定的数据,而后便实现了整个流程。在整个过程中:
- 操作可视化:/ 咱们除了能够应用界面可视化创立 API 之外,还能够通过编排能力直观、清晰地进行场景化设计;
- 流程可复用:通过导入、导出画板的 JSON 数据,能够便捷地复用编排生成的工程数据;
- 组合新“插件”:将每一个场景视作一个插件,通过应用条件元件组合不同的插件,来实现插件发明“插件”。
实现原理
那么 Apache APISIX 是如何与低代码能力联合的呢?这须要数据面 Apache APISIX 与管制面 Apache APISIX Dashboard 独特配合实现。整体流程如下:
Apache APISIX
在 Apache APISIX 中,咱们在 Route 实体中新增了 script
执行逻辑(PR:https://github.com/apache/api…),可用于接管 Dashboard 生成的 Lua 函数并执行,它反对调用已有插件以复用代码。另外,它也作用于 HTTP 申请的生命周期中的各个阶段,如 access
、header_filer
、body_filter
等,零碎会在相应阶段主动执行 script
函数对应阶段代码,见如下 script
示例:
{"script": "local _M = {} \n function _M.access(api_ctx) \n ngx.log(ngx.INFO,\"hit access phase\") \n end \nreturn _M"
}
Apache APISIX Dashboard
在 Dashboard 中,它蕴含了 Web 与 ManagerAPI 共两个子组件:Web 用于提供可视化界面,不便咱们配置 API 网关;ManagerAPI 用于提供 RESTful API,供 Web 或其它客户端调用以便操作配置核心(默认为 ETCD),进而间接地管制 Apache APISIX。
为了生成非法、无效的 script 函数,ManagerAPI 抉择了 DAG 有向无环图的数据结构进行底层设计,并自主研发了 dag-to-lua
我的项目(GitHub:https://github.com/api7/dag-t…):它将根节点作为开始节点,依据判断条件决定下一个流转插件,这将无效防止逻辑死循环。如下为 DAG 数据结构的示意图:
对应到 ManagerAPI 接管的 script
参数上,示例如下:
{
"conf": {
"1-2-3": {
"name": "plugin-a",
"conf": {...}
},
"4-5-6": {
"name": "plugin-b",
"conf": {...}
},
"7-8-9": {
"name": "plugin-c",
"conf": {...}
}
},
"rule": {
"root": "1-2-3", // 起始节点 ID
"1-2-3": [
[
"code == 200",
"4-5-6"
], ["","7-8-9"]
]
}
}
即客户端将最终编排后的数据转换为上述格局后,ManagerAPI 会借助 dag-to-lua
我的项目生成 Lua 函数,并交给 Apache APISIX 执行。
在 Web 侧,通过筛选、比照与我的项目验证,咱们抉择了蚂蚁金服开源的 X6 图编辑引擎作为插件编排 Web 局部的底层框架,除了欠缺、清晰的文档外,一系列开箱即用的交互组件以及节点可定制化能力也是咱们抉择它的起因。
在编排实现过程中,咱们形象出了通用元件与插件元件的概念:通用元件是指开始节点、完结节点与条件判断节点,插件元件则是每一个可用的 Apache APISIX 插件,通过将这些元件拖拽到画板中来实现插件编排的流程。如图所示:
在拖拽过程中,咱们须要限度一系列的边界条件,这里有几个例子:
当插件未配置时,零碎将呈现「存在未配置的元件」的谬误提醒,能够直观地看到哪个插件没有配置数据:
当编辑某条 API 时,若该 API 曾经绑定了插件数据,当应用插件编排模式时,零碎在检测后将呈现正告信息,只有用户明确确认心愿应用编排模式时,零碎能力持续进行。这能够无效防止 API 数据被误操作的状况。
此外,还存在诸如开始元件只能有一个输入、条件判断元件只能有一个输出等状况。试想:如果零碎不加限度地让用户操作,不合理的插件组合既无意义,又会产生无奈意料的谬误,因而不断丰富边界条件,也是在设计插件编排时须要着重思考的问题。
当咱们实现编排后,将应用 X6 裸露的 API 生成流程图的 JSON 数据,而后转换为零碎须要的 DAG 数据,最终生成 Lua 函数。
将来瞻望
通过拖拽的形式,能够使得应用人员更不便地组合插件来满足不同的场景,以晋升 API 网关可扩大能力与运维体验。在理论应用过程中,存在如下能够持续优化的问题:
- 目前元件的边界判断条件还不够丰盛,通过持续欠缺这些条件,以缩小不合理的编排组合;
- 以后编排示例不多,提供更多的参考示例可不便开发者学习、供用户应用;
- 以后 Apache APISIX 应用了插件定义的 code 进行状态返回(异样则返回状态码,申请终止),能够反对更多 HTTP Response 字段甚至批改插件定义来扩大插件编排能力,如下述插件定义:
local _M = {
version = 0.1,
priority = 2500,
type = 'auth',
name = plugin_name,
schema = schema,
# 新增的 result 字段,可存储插件运行后果,并传递到下个插件。result = {
code = {type = "int"}
}
}
对于 Apache APISIX
Apache APISIX 是一个动静、实时、高性能的开源 API 网关,提供负载平衡、动静上游、灰度公布、服务熔断、身份认证、可观测性等丰盛的流量治理性能。Apache APISIX 能够帮忙企业疾速、平安的解决 API 和微服务流量,包含网关、Kubernetes Ingress 和服务网格等。
寰球已有数百家企业应用 Apache APISIX 解决要害业务流量,涵盖金融、互联网、制作、批发、运营商等等,比方美国航空航天局(NASA)、欧盟的数字工厂、中国航信、中国移动、腾讯、华为、微博、网易、贝壳找房、360、泰康、奈雪的茶等。
200 余位贡献者,一起缔造了 Apache APISIX 这个世界上最沉闷的开源网关我的项目。聪慧的开发者们!快来退出这个沉闷而多样化的社区,一起来给这个世界带来更多美妙的货色吧!
- Apache APISIX 我的项目地址:https://github.com/apache/apisix
- Apache APISIX 官网:http://apisix.apache.org/zh/