apisix简介

发布时间 2023-10-08 14:26:27作者: 流年似水zlw

一、简介

国产云原生微服务API网关。

Apache APISIX是一个动态、实时、高性能的API网关,提供丰富的流量管理特性,例如负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等。既可以处理传统的南北向流量,也可以处理服务间的东西向流量。支持多种环境部署,并提供大量插件实现不同业务场景需求,且支持编写自定义插件。提供dashboard供用户通过页面管理apisix。

Apache APISIX基于Nginx和Etcd实现,其技术架构如下图所示: 

其中,数据面DP是网关的主体,实现网关的主要功能,控制面CP使用户可以修改网关的配置并保存到etcd中。

请求处理流程如下图所示:

 

二、安装

APISIX支持rpm、docker、helm和源码安装,本文是rpm方式,适用于CentOS 7,其他方式可参考官方文档。

https://github.com/apache/apisix/blob/master/docs/en/latest/how-to-build.md

1. 配置yum仓库

  如果官方openresty仓库没有安装的话,使用以下命令可以自动安装openresty和apisix仓库:

yum install -y https://repos.apiseven.com/packages/centos/apache-apisix-repo-1.0-1.noarch.rpm

  如果官方openresty仓库已经安装了,使用以下命令自动安装apisix仓库:

yum-config-manager --add-repo https://repos.apiseven.com/packages/centos/apache-apisix.repo

2. 安装apisix

  查看最新apisix包信息: yum info -y apisix 

  安装最新版apisix: yum install -y apisix 

  也可以安装指定版本的apisix: yum install -y apisix-2.15.0 

3. 安装etcd

  通过二进制方式安装,注意etcd版本,本次安装是单节点,仅用于测试

ETCD_VERSION='3.4.18'
wget https://github.com/etcd-io/etcd/releases/download/v${ETCD_VERSION}/etcd-v${ETCD_VERSION}-linux-amd64.tar.gz
tar -xzvf etcd-v${ETCD_VERSION}-linux-amd64.tar.gz
cd etcd-v${ETCD_VERSION}-linux-amd64
cp -a etcd etcdctl /usr/bin/
nohup etcd >/tmp/etcd.log 2>&1 & #默认监听端口2379 

4. 高可用

  对于生产环境,需要考虑系统的高可用性,一般需要部署多个etcd和apisix节点,且apisix节点无状态,配置完全相同,可任意扩容。 

三、管理apisix

  初始化依赖,主要是生成nginx配置文件,同时也会创建etcd主要key: apisix init 

  语法检查: apisix test 

  启动apisix: apisix start #默认监听端口9080 

  停止apisix: apisix quit #优雅停止 apisix stop #立即停止 

  帮助信息: apisix help 

四、dashboard

Apache APISIX Dashboard可以使用户能够很方便的通过前端页面管理apisix网关。

1. rpm方式安装

yum install -y https://github.com/apache/apisix-dashboard/releases/download/v2.15.0/apisix-dashboard-2.15.0-0.el7.x86_64.rpm

2. 允许所有IP访问

vim /usr/local/apisix/dashboard/conf/conf.yaml
#将allow_list字段置空

3. 启动dashboard 

manager-api -p /usr/local/apisix/dashboard/ #前台启动,默认端口9000

4. 配置service启动

vim /usr/lib/systemd/system/apisix-dashboard.service
[Unit]
Description=apisix-dashboard
Conflicts=apisix-dashboard.service
After=network-online.target
​
[Service]
WorkingDirectory=/usr/local/apisix/dashboard
ExecStart=/usr/local/apisix/dashboard/manager-api -c /usr/local/apisix/dashboard/conf/conf.yaml
​
systemctl daemon-reload
systemctl restart apisix-dashboard
systemctl status apisix-dashboard
#注意:也可以直接用自动生成的/etc/systemd/system/apisix-dashboard.service文件,如不需要,可直接删除

  浏览器通过ip:9000访问,默认用户名和密码都是admin,其他安装方式可参考官方文档。

  https://github.com/apache/apisix-dashboard/blob/master/docs/en/latest/install.md

五、配置apisix

通过修改本地 conf/config.yaml 文件,或者在启动 APISIX 时使用 -c 或 --config 添加文件路径参数 apisix start -c <path string>,完成对 APISIX 服务本身的基本配置。

其他默认配置,可以在 conf/config-default.yaml 文件中看到,该文件是与 APISIX 源码强绑定, 永远不要手工修改 conf/config-default.yaml 文件,如果需要自定义任何配置,都应在 config.yaml 文件中完成。

修改config.yaml后,需要重启或重载服务

apisix restart  or  apisix reload

注意:不要手工修改 APISIX 自身的 conf/nginx.conf 文件,当服务每次启动时,apisix 会根据 config.yaml 配置自动生成新的 conf/nginx.conf 并自动启动服务。

六、插件

1. 原生

插件配置可直接绑定在 Route 上,也可以被绑定在 Service 或 Consumer上,而对于同一个插件的配置,只能有一份是有效的,配置选择优先级总是 Consumer > Route > Service,而多个插件运行先后顺序是根据插件自身的优先级来决定的。

在 conf/config.yaml 中,可以声明本地 APISIX 节点都支持哪些插件,这是个白名单机制,不在该白名单的插件配置,都将会被自动忽略,这个特性可用于临时关闭或打开特定插件,应对突发情况非常有效。 如果你想在现有插件的基础上新增插件,注意需要拷贝 conf/config-default.yaml 的插件节点内容到 conf/config.yaml 的插件节点中。

APISIX 插件是热加载的,不管你是新增、删除还是修改插件,都不需要重启服务,只需要通过 admin API 发送一个 HTTP 请求即可:

curl http://127.0.0.1:9080/apisix/admin/plugins/reload -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT

查看启动的插件列表:

curl http://127.0.0.1:9080/apisix/admin/plugins/list -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'

注意:如果你已经在路由规则里配置了某个插件(比如在 route 的 plugins 字段里面添加了它),然后禁用了该插件,在执行路由规则的时候会跳过这个插件。

2. 自定义

2.1 确定插件名称和优先级

名称是插件的唯一标识,不可重名,你应该给自己的插件起一个不包含在原来库中的名字,但是如果有需要,你可以使用使用相同名称的代码文件覆盖内置的代码文件,如 test-plugin。 新插件的优先级(priority属性)不能与现有插件的优先级相同,对于自定义插件建议优先级在1-99之间,如50。

2.2 创建插件代码文件

直接在 apisix/plugins/ 目录下创建插件代码文件 test-plugin.lua,代码内容可以参考example-plugin.lua。

2.3 在conf/config.yaml配置文件中新增插件

建议最好按优先级顺序排列。

2.4 热加载并查看插件列表

curl http://127.0.0.1:9080/apisix/admin/plugins/reload -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT
curl http://127.0.0.1:9080/apisix/admin/plugins/list -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'

2.5 生成配置,并导入dashborad

cd /usr/local/apisix/dashboard/conf
mv schema.json schema.json-bak
curl 127.0.0.1:9090/v1/schema > schema.json

2.6 重新启动dashboard

systemctl restart apisix-dashboard

然后,在dashboard插件列表中即可看到新增的插件。

七、健康检查

Apache APISIX 的健康检查使用 lua-resty-healthcheck 实现,用于检查上游节点的健康状态。

1. 主动检查

1.1 配置说明

  • 可配置检查类型为HTTP、HTTPS或TCP,默认HTTP;

  • 可配置请求端口默认为80,请求路径默认为根/;

  • 可根据需要添加相应请求头;

  • 健康状态表示对上游健康节点检查条件;

  • 不健康状态表示对上游不健康节点的检查条件;

  • 如果上游节点返回的状态码没在配置列表里,则保持原状;

1.2 检查说明

在配置启用后,主动检查并不会马上生效,需要一次请求来触发生效。当upstream 第一次被请求时触发健康检查逻辑,apisix对每一个上游节点发送检查请求,如果检查失败则标记为unhealthy,相当于摘除,之后的请求只会转发给其他健康的节点。第一次触发后,apisix会按照配置的时间间隔周期性地对上游节点进行健康检查,如果失败则从upstream中摘除,如果成功则重新添加到upstream。

2. 被动检查

2.1 配置说明

  • 可配置检查类型为HTTP、HTTPS或TCP,默认HTTP;

  • 健康状态表示判断上游节点健康的条件;

  • 不健康状态表示判断上游节点不健康的条件;

2.2 检查说明

启用主动检查后,已经可以完成对上游节点的自动摘除和恢复,但是主动检查有自己的检查间隔时间,如果在下一次检查之前节点已经不可用了,此时如果有请求进来的话,apisix仍然认为这个节点是可用的,那就有可能会转发到这个节点上,导致请求失败。所以,apisix支持被动检查,即每次请求进来都会对健康的上游节点进行检查,如果失败则从upstream中摘除。

被动检查主要用于快速及时地摘除问题节点,因为重试机制及主动检查的存在,一般可以不启用被动检查,合理设置主动检查周期即可。

3. 注意:

  • 只有在 upstream 被请求时才会开始健康检查,如果 upstream 被配置但没有被请求,不会触发启动健康检查。

  • 如果没有健康的节点,那么请求会继续发送给上游。

  • 如果 upstream 中只有一个节点时不会触发启动健康检查,该唯一节点无论是否健康,请求都将转发给上游。

  • 启用被动健康检查时,需要同时启用主动健康检查,这样不健康的节点才会恢复。

  • 主动检查主要用于定时检查及恢复节点,被动检查主要用于快速摘除节点。

  • 健康检查信息可以通过 控制接口 中的 GET /v1/healthcheck 接口得到(curl 127.0.0.1:9090/v1/healthcheck -i)

八、路由匹配

  1. radixtree_uri:apisix默认路由,即只使用 uri 作为主索引,支持全量和深前缀匹配,且可以设置优先级和任意过滤属性,

匹配优先级为:全等 > 长前缀 > 短前缀 > 优先级 > 高级过滤 > 配置顺序,其中域名、请求头、参数、cookie等都属于高级过滤条件。

  1. radixtree_host_uri:使用 host + uri 作为主索引,对当前请求会同时匹配 host 和 uri,支持的匹配条件与 radixtree_uri 基本一致。