APISIX 是基于 OpenResty + etcd 实现的云原生、高性能、可扩展的微服务 API 网关
OpenResty:通过 Lua 扩展 Nginx 实现的可伸缩的 Web 平台
- Lua :使用C语言表现的一种
轻量级可扩展
脚本语言,开源- OpenResty 是一个 Web 应用服务器,Web 开发人员可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,并且性能非常高
- OpenResty 的目标是让你的 Web 服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型
etcd:Key/Value 存储系统。
- etcd目标是构建一个高可用的分布式键值(key-value)数据库,内部采用raft协议作为一致性算法,基于Go语言实现。
APISIX 通过插件机制,提供
了动态负载平衡、身份验证、限流限速等等功能,也可以自己
开发插件进行拓展
。
整体架构:
动态负载均衡:跨多个上游服务的动态负载均衡,目前已支持 round-robin 轮询和一致性哈希算法。
身份验证:支持 key-auth、JWT、basic-auth、wolf-rbac 等多种认证方式。
限流限速:可以基于速率、请求数、并发等维度限制。
APISIX 还支持 A/B 测试、金丝雀发布(灰度发布)、蓝绿部署、监控报警、服务可观测性、服务治理等等高级功能,这在作为微服务 API 网关非常重要的特性。
插件加载流程,及插件内部结构,最后说明了配置APISIX的流程
通过定义一些规则来匹配客户端的请求,然后根据匹配结果加载并执行相应的 插件,并把请求转发给到指定 Upstream。
Route 中主要包含三部分内容:
最后在该小节中说明了然后修改配置了完成Route的创建
Plugin表示将在 HTTP 请求/响应生命周期期间所执行
的插件配置
。
Plugin可配置位置:
Consumer > Route > Service
可以在conf/config.yaml中声明本地 APISIX 节点都支持哪些插件(白名单机制)
APISIX 的插件是热加载的,不管你是新增、删除还是修改插件,都不需要重启服务。
一个插件在一次请求中只会执行一次,即使被同时绑定到多个不同对象中(比如 Route 或 Service)。 插件运行先后顺序是根据插件自身的优先级来决定的
Script 表示将在 HTTP 请求/响应生命周期期间执行
的脚本
。
Script 配置可直接绑定在 Route 上
配置 Script 后,Route 上配置的 Plugin 将不被执行(Script 与 Plugin 互斥,且优先执行 Script )
Script 中可以写任意 lua 代码,也可以直接调用已有插件以重用已有的代码。
Service 是某类 API 的抽象(可理解为一组 Route 的抽象)
通常与上游服务抽象是一一对应的,Route 与 Service 之间,通常是 N:1 的关系
解决识别到某类请求方, 进行插件过滤并转发请求到指定上游,有时候深度不够的问题.
APISIX 中,识别 Consumer 的过程如下图:
- 授权认证:比如有 key-auth、JWT 等。
- 获取 consumer_name:通过授权认证,即可自然获取到对应的 Consumer name,它是 Consumer 对象的唯一识别标识。
- 获取 Consumer 上绑定的 Plugin 或 Upstream 信息:完成对不同 Consumer 做不同配置的效果。
Upstream 是虚拟主机抽象,
如图所示,通过创建 Upstream 对象,在 Route 用 ID 方式引用,就可以确保只维护一个对象的值了。
最后说明了一些配置参数
Plugin 只能绑定在 Service 或 Route 上,实现一个能作用于所有请求的 Plugin
想要复用一组通用的插件配置,可以把它们提取成一个 Plugin config,并绑定到对应的路由上。
如果找不到对应的 Plugin config,该路由上的请求会报 503 错误。
如果这个路由已经配置了 plugins,那么 Plugin config 里面的插件配置会合并进去。 相同的插件会覆盖掉 plugins 原有的插件。
区别与其他API网关:允许用户选择不同 Router 来更好匹配自由业务,在性能、自由之间做最适合选择。
一些调试模式:如基本调试模式、高级调试模式、动态高级调试模式