1 概述

1.1 概念

APISIX 是基于 OpenResty + etcd 实现的云原生、高性能、可扩展的微服务 API 网关

OpenResty:通过 Lua 扩展 Nginx 实现的可伸缩的 Web 平台

  1. Lua :使用C语言表现的一种轻量级可扩展脚本语言,开源
  2. OpenResty 是一个 Web 应用服务器,Web 开发人员可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,并且性能非常高
  3. OpenResty 的目标是让你的 Web 服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型

etcd:Key/Value 存储系统。

  1. etcd目标是构建一个高可用的分布式键值(key-value)数据库,内部采用raft协议作为一致性算法,基于Go语言实现。

1.2 架构

APISIX 通过插件机制,提供了动态负载平衡、身份验证、限流限速等等功能,也可以自己开发插件进行拓展

整体架构:
在这里插入图片描述
动态负载均衡:跨多个上游服务的动态负载均衡,目前已支持 round-robin 轮询和一致性哈希算法。

身份验证:支持 key-auth、JWT、basic-auth、wolf-rbac 等多种认证方式。

限流限速:可以基于速率、请求数、并发等维度限制。

APISIX 还支持 A/B 测试、金丝雀发布(灰度发布)、蓝绿部署、监控报警、服务可观测性、服务治理等等高级功能,这在作为微服务 API 网关非常重要的特性。

2 使用

2.1 Architecture Design(结构设计)

2.1.1 APISIX

插件加载流程,及插件内部结构,最后说明了配置APISIX的流程

2.1.2 Route

通过定义一些规则来匹配客户端的请求,然后根据匹配结果加载并执行相应的 插件,并把请求转发给到指定 Upstream。

Route 中主要包含三部分内容:

  1. 匹配规则(比如 uri、host、remote_addr 等),
  2. 插件配置(限流限速等)
  3. 上游信息
    在这里插入图片描述
    每个 Route 都相对独立自由度较高,可以直接在Route中完成所有参数的配置;当Route 有重复配置时,在更新这些共同属性,便需要遍历所有的Route进行修改(这个重复的去点在APISIX中独立抽象出的Service和Upstream中进行了解决)

最后在该小节中说明了然后修改配置了完成Route的创建

2.1.3 Plugin

Plugin表示将在 HTTP 请求/响应生命周期期间所执行插件配置

Plugin可配置位置:

  1. 直接绑定在Riute上
  2. 绑定在Service或Consumer上
  3. 但是对于同一个插件的配置,只有一份是有效的,选择优先级为 Consumer > Route > Service

可以在conf/config.yaml中声明本地 APISIX 节点都支持哪些插件(白名单机制)

APISIX 的插件是热加载的,不管你是新增、删除还是修改插件,都不需要重启服务。

一个插件在一次请求中只会执行一次,即使被同时绑定到多个不同对象中(比如 Route 或 Service)。 插件运行先后顺序是根据插件自身的优先级来决定的

2.1.4 Script

Script 表示将在 HTTP 请求/响应生命周期期间执行脚本

Script 配置可直接绑定在 Route 上

配置 Script 后,Route 上配置的 Plugin 将不被执行(Script 与 Plugin 互斥,且优先执行 Script )

Script 中可以写任意 lua 代码,也可以直接调用已有插件以重用已有的代码。

2.1.5 Service

Service 是某类 API 的抽象(可理解为一组 Route 的抽象)

通常与上游服务抽象是一一对应的,Route 与 Service 之间,通常是 N:1 的关系

Route 规则同时绑定到一个 Service 上,这些 Route 将具有相同的上游和插件配置,减少冗余配置。在这里插入图片描述

2.1.6 Consumer

解决识别到某类请求方, 进行插件过滤并转发请求到指定上游,有时候深度不够的问题.

APISIX 中,识别 Consumer 的过程如下图:

在这里插入图片描述

  1. 授权认证:比如有 key-auth、JWT 等。
  2. 获取 consumer_name:通过授权认证,即可自然获取到对应的 Consumer name,它是 Consumer 对象的唯一识别标识。
  3. 获取 Consumer 上绑定的 Plugin 或 Upstream 信息:完成对不同 Consumer 做不同配置的效果。

2.1.7 Upstream

Upstream 是虚拟主机抽象,

如图所示,通过创建 Upstream 对象,在 Route 用 ID 方式引用,就可以确保只维护一个对象的值了。在这里插入图片描述
最后说明了一些配置参数

2.1.8 Global rule

Plugin 只能绑定在 Service 或 Route 上,实现一个能作用于所有请求的 Plugin

2.1.9 Plugin Config

想要复用一组通用的插件配置,可以把它们提取成一个 Plugin config,并绑定到对应的路由上。

如果找不到对应的 Plugin config,该路由上的请求会报 503 错误。

如果这个路由已经配置了 plugins,那么 Plugin config 里面的插件配置会合并进去。 相同的插件会覆盖掉 plugins 原有的插件。

2.1.10 Router

区别与其他API网关:允许用户选择不同 Router 来更好匹配自由业务,在性能、自由之间做最适合选择。

2.1.11 Debug Mode

一些调试模式:如基本调试模式、高级调试模式、动态高级调试模式

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐