APISIX

ApiSix

使用ApiSix网关作为所有业务的流量入口,它提供了动态路由、动态上游、动态证书、A/B测试、灰度发布、限速、防攻击、收集指标、监控报警、可观测、服务治理,服务熔断身份认证等功能。

主要用于管理和控制API流量,安全性,性能和可用性,APIsix的主要作用包括:API管理流量控制认证与授权负载均衡动态上游灰度发布 ;具有动态,实时,高性能等特点

apixis是基于NGINX和Etcd与传统的API网关相比,APISIX具有动态路由和热加载插件功能,避免了配置之后的reload操作,同时APISIX支持HTTP(S),HTTP2,Dubbo,QUIC,MQTT,TCP/UDP等多种协议,还内置了Dashboard,提供强大且灵活的界面,同样也提供了丰富的插件支持功能,并且还可以让用户自定义插件

主要特点:

1:多平台支持:APISIX提供了多平台支持方案,不仅支持裸机运行,也支持在Kubernetes中使用,还与AWS Lambda,Azure Function,Lua函数和Apache OpenWhisk等云服务集成
2:全动态能力:APISIX支持热加载,这意味着我们不需要重启服务就可以更新APISIX的配置,在Ingress-Nginx的实现是基于Lua
3:精细化路由:APISIX支持使用Nginx内置变量作为路由匹配条件,我们可以自定义匹配函数来过滤请求,匹配路由
4:运维友好:APISIX支持与以下工具进行集成:HashiCorp Vault,Zipkin,Apache SkyWalking,Consul,Nacos,EureKa。通过APISIX Dashbaord,运维人员可以友好并直观的配置APISIX
5:多语言插件支持:APISIX支持多种开发语言进行插件开发,开发人员可以选择擅长语言的SDK开发自定义插件

前置条件

快速启动脚本需要以下条件

  • 已安装Docker,用于部署Etcd和ApiSix。
  • 已安装CURL,用于验证APISIX是否安装成功。

安装APISIX

为了提供更好的体验,管理API默认无需授权,生产环境中打开授权开关。

APISIX 可以借助quickstart脚本快速安装并启动:

curl -SL https://run.api7.ai/apisix/quickstart | sh

该命令启动 apisix-quickstartetcd 两个容器,APISIX 使用 etcd 保存和同步配置。APISIX 和 etcd 容器使用 Docker 的 host 网络模式,因此可以从本地直接访问。

如果一切顺利,将输出如下信息:

✔ APISIX is ready!

Docker安装

那么我们为了体验APISIX,我们这里直接使用Docker启动一个APISIX来体验一下,这个在官方是给你仓库的

https://github.com/apache/apisix-docker.git

[root@localhost ~]# git clone https://github.com/apache/apisix-docker.git
Cloning into 'apisix-docker'...
remote: Enumerating objects: 1947, done.
remote: Counting objects: 100% (120/120), done.
remote: Compressing objects: 100% (70/70), done.
remote: Total 1947 (delta 62), reused 89 (delta 41), pack-reused 1827
Receiving objects: 100% (1947/1947), 373.54 KiB | 835.00 KiB/s, done.
Resolving deltas: 100% (1039/1039), done.

[root@localhost ~]# cd apisix-docker/example/

# 这里给大家提一下,Docker在23版本直接集成了compose,也就是说我们不再需要去安装compose了

[root@localhost example]# docker compose -p docker-apisix up -d
....
[+] Running 9/9
 ✔ Network docker-apisix_apisix                Created                                                 0.1s 
 ✔ Volume "docker-apisix_etcd_data"            Created                                                 0.0s 
 ✔ Container docker-apisix-apisix-dashboard-1  Started                                                 2.5s 
 ✔ Container docker-apisix-web2-1              Started                                                 2.1s 
 ✔ Container docker-apisix-etcd-1              Started                                                 1.3s 
 ✔ Container docker-apisix-web1-1              Started                                                 1.8s 
 ✔ Container docker-apisix-prometheus-1        Started                                                 2.7s 
 ✔ Container docker-apisix-grafana-1           Started                                                 2.0s 
 ✔ Container docker-apisix-apisix-1            Started                                                 3.1s
 
# API测试访问 
[root@localhost example]# curl 10.0.0.15:9080
{"error_msg":"404 Route Not Found"}
# 出现404是因为我们还没有路由,所以才会出现404

我们直接访问:http://ip:9000,可以访问到Dashboard

验证

可以通过 curl 来访问正在运行的 APISIX 实例。比如,可以发送一个简单的 HTTP 请求来验证 APISIX 运行状态是否正常:

curl "http://127.0.0.1:9080" --head | grep Server

如果一切顺利,将输出如下信息:

Server: APISIX/Version

这里的 Version 是指已经安装的 APISIX 版本,比如 APISIX/3.3.0

现在,你已经成功安装并运行了 APISIX!

路由配置

ApiSix使用routes来提供灵活的网关管理功能,在一个请求中,routes包含了访问路径和上游目标信息。

Route是什么

Route(也称之为路由)是访问上游的目标路径,在APISIX中,Route首相通过预定的规则来匹配客户端请求,然后加载和执行相应的插件,最后将请求转发至特定的Upstream。

在ApiSix中,一个最简单的Route仅由匹配路径和Upstream地址两个信息组成。

Upstream是什么

Upstream(也称之为上游)是由一组具备相同功能的节点集合,它是对虚拟主机的抽象。Upstream可以通过预先配置的规则对多个服务节点进行负载均衡。

创建路由

你可以创建一个路由,将客户端的请求转发至 httpbin.org(这个网站能测试 HTTP 请求和响应的各种信息)。

通过下面的命令,你将创建一个路由,把请求http://127.0.0.1:9080/ip 转发至 httpbin.org/ip

curl -i "http://127.0.0.1:9180/apisix/admin/routes" -X PUT -d '
{
  "id": "getting-started-ip",
  "uri": "/ip",
  "upstream": {
    "type": "roundrobin",
    "nodes": {
      "httpbin.org:80": 1
    }
  }
}'

如果配置成功,将会返回 HTTP/1.1 201 Created

验证

curl "http://127.0.0.1:9080/ip"

你将会得到类似下面的返回:

{
  "origin": "183.94.122.205"
}

负载均衡

负载均衡是管理客户端和服务端之间的流量。它决定由哪个服务来处理特定的请求,从而提高性能、可扩展性和可靠性。在设计需要处理大流量的系统时,负载均衡是一个关键的考虑因素。

Apache APISIX 支持加权负载均衡算法,传入的流量按照预定顺序轮流分配给一组服务器的其中一个。

启用负载均衡

创建一个具有两个上游服务的路由,访问 /headers 将被转发到 httpbin.orgmock.api7.ai 这两个上游服务,并且会返回请求头。

curl -i "http://127.0.0.1:9180/apisix/admin/routes" -X PUT -d '
{
  "id": "getting-started-headers",
  "uri": "/headers",
  "upstream" : {
    "type": "roundrobin",
    "nodes": {
      "httpbin.org:443": 1,
      "mock.api7.ai:443": 1
    },
    "pass_host": "node",
    "scheme": "https"
  }
}'

如果路由创建成功,你将会收到返回 HTTP/1.1 201 Created

INFO
  1. pass_host 字段设置为 node,将传递请求头给上游。
  2. scheme 字段设置为 https,向上游发送请求时将启用 TLS。

验证

这两个服务返回不同的数据。

httpbin.org 返回:

{
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.58.0",
    "X-Amzn-Trace-Id": "Root=1-63e34b15-19f666602f22591b525e1e80",
    "X-Forwarded-Host": "localhost"
  }
}

mock.api7.ai 返回:

{
  "headers": {
    "accept": "*/*",
    "host": "mock.api7.ai",
    "user-agent": "curl/7.58.0",
    "content-type": "application/json",
    "x-application-owner": "API7.ai"
  }
}

我们生成 100 个请求来测试负载均衡的效果:

hc=$(seq 100 | xargs -I {} curl "http://127.0.0.1:9080/headers" -sL | grep "httpbin" | wc -l); echo httpbin.org: $hc, mock.api7.ai: $((100 - $hc))

结果显示,请求几乎平均分配给这两个上游服务:

httpbin.org: 51, mock.api7.ai: 49

秘钥验证

API网关主要作用是链接API消费者和提供者。处于安全考虑,在访问内部资源之前,应先对消费者进行身份验证和授权。

image-20240531102158289

APISIX 拥有灵活的插件扩展系统,目前有很多可用于用户身份验证和授权的插件。例如:

Consumer是什么

Consumer(也称之为消费者)是指使用API的应用或开发人员

在APISix中消费者需要一个全局唯一的名称,并从上面的列表中选择一个身份验证插件。

Key Authentication 是什么

Key Authentication(也称之为密钥验证)是一个相对比较简单但是应用广泛的身份验证方法,它的设计思路如下:

  1. 管理员为路由添加一个身份验证密钥(API 密钥)。
  2. API 消费者在发送请求时,在查询字符串或者请求头中添加密钥。

启用key Authentication

前置条件:

  • APISix安装
  • 完成配置路由

创建消费者 (应用)

创建一个名为tom的消费者,并启用key-auth插件,秘钥设置为secret-key.所有携带密钥 secret-key 的请求都会被识别为消费者 tom

秘钥验证

API网关主要作用是链接API消费者和提供者。处于安全考虑,在访问内部资源之前,应先对消费者进行身份验证和授权。

image-20240531102158289

APISIX 拥有灵活的插件扩展系统,目前有很多可用于用户身份验证和授权的插件。例如:

Consumer是什么

Consumer(也称之为消费者)是指使用API的应用或开发人员

在APISix中消费者需要一个全局唯一的名称,并从上面的列表中选择一个身份验证插件。

Key Authentication 是什么

Key Authentication(也称之为密钥验证)是一个相对比较简单但是应用广泛的身份验证方法,它的设计思路如下:

  1. 管理员为路由添加一个身份验证密钥(API 密钥)。
  2. API 消费者在发送请求时,在查询字符串或者请求头中添加密钥。

启用key Authentication

前置条件:

  • APISix安装
  • 完成配置路由

创建消费者 (应用)

创建一个名为tom的消费者,并启用key-auth插件,秘钥设置为secret-key.所有携带密钥 secret-key 的请求都会被识别为消费者 tom

2. 发送携带错误密钥的请求

发送一个携带错误密钥(比如 wrong-key)的请求。

curl -i "http://127.0.0.1:9080/ip" -H 'apikey: wrong-key'

如果密钥错误,你也将得到返回 HTTP/1.1 401 Unauthorized,即未授权。

HTTP/1.1 401 Unauthorized
Date: Wed, 08 Feb 2023 09:38:27 GMT
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Server: APISIX/3.1.0

3. 发送携带正确密钥的请求

发送一个携带正确密钥(secret-key)的请求。

curl -i "http://127.0.0.1:9080/ip" -H 'apikey: secret-key'

你将会得到返回 HTTP/1.1 200 OK

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 44
Connection: keep-alive
Date: Thu, 09 Feb 2023 03:27:57 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Server: APISIX/3.1.0

禁用 Authentication#

将参数设置 _meta.disabletrue,即可禁用密钥验证插件。

curl "http://127.0.0.1:9180/apisix/admin/routes/getting-started-ip" -X PATCH -d '
{
  "plugins": {
    "key-auth": {
      "_meta": {
        "disable": true
      }
    }
  }
}'

你可以发送一个不带任何密钥的请求来验证:

curl -i "http://127.0.0.1:9080/ip"

因为你已经禁用了密钥验证插件,所以你将会得到返回 HTTP/1.1 200 OK

限速

APISIX 是一个统一的控制中心,它管理 API 和微服务的进出流量。除了客户端发来的合理的请求,还可能存在网络爬虫产生的不必要的流量,此外,网络攻击(比如 DDos)也可能产生非法请求。

APISIX 提供限速功能,通过限制在规定时间内发送到上游服务的请求数量来保护 APIs 和微服务。请求的计数在内存中完成,具有低延迟和高性能的特点。

image-20240531103328799

启用 Rate Limiting

在教程配置路由中,我们已经创建了路由 getting-started-ip,我们通过 PATCH 方法为该路由增加 limit-count 插件:

curl -i "http://127.0.0.1:9180/apisix/admin/routes/getting-started-ip" -X PATCH -d '
{
  "plugins": {
    "limit-count": {
        "count": 2,
        "time_window": 10,
        "rejected_code": 503
     }
  }
}'

如果增加插件成功,你将得到返回 HTTP/1.1 201 Created。上述配置将传入流量的速率限制为每 10 秒最多 2 个请求。

验证

我们同时生成 100 个请求来测试限速插件的效果。

count=$(seq 100 | xargs -I {} curl "http://127.0.0.1:9080/ip" -I -sL | grep "503" | wc -l); echo \"200\": $((100 - $count)), \"503\": $count

请求结果同预期一致:在这 100 个请求中,有 2 个请求发送成功(状态码为 200),其他请求均被拒绝(状态码为 503)。

"200": 2, "503": 98

禁用 Rate Limiting

将参数设置 _meta.disabletrue,即可禁用限速插件。

curl -i "http://127.0.0.1:9180/apisix/admin/routes/getting-started-ip" -X PATCH -d '
{
    "plugins": {
        "limit-count": {
            "_meta": {
                "disable": true
            }
        }
    }
}'

验证

我们再次同时生成 100 个请求来测试限速插件是否已被禁用:

count=$(seq 100 | xargs -i curl "http://127.0.0.1:9080/ip" -I -sL | grep "503" | wc -l); echo \"200\": $((100 - $count)), \"503\": $count

结果显示所有的请求均成功:

"200": 100, "503": 0

更多

你可以使用 APISIX 的变量来配置限速插件的规则,比如 $host$uri。此外,APISIX 也支持使用 Redis 集群进行限速配置,即通过 Redis 来进行计数。

消费者(应用)配置示例

{
  "id": "7680159312",
  "labels": {
   # 该标签中可以自定义配置一些元信息。示例:
   "department": "engineering",
   "project_name": "API Gateway Project",
    "region": "us-east-1"
  },
  "plugins": {
    # 创建应用时,添加插件信息同步到apisix
    "vivo-hmac-auth": {
      "algorithm": "hmac-sha256",
      "secret_key": "lyqQozaXkSwBwKmv",
      "clock_skew": 0,
      "signed_headers": [
        "x-ai-gateway-app-id",
        "x-ai-gateway-timestamp",
        "x-ai-gateway-nonce"
      ],
      "access_key": "7680159312"
    },
    # 创建应用时,添加限流插件,同步到apisix
    "limit-count": {
      "key": "consumer_name",
      "count": 2,
      "policy": "local",
      "rejected_code": 429,
      "time_window": 1
    }
  },
  "update_time": 1740035284,
  "username": "7680159312",
  "desc": "提取图片文字",
  "create_time": 1740035284
}

服务配置

{
  "hosts": [
    "image-enhance.vivo.com.cn",
    "image-enhance.vivo.com"
  ],
  "id": "route_1984316803",
  "upstream_id": "vua_vip_prd_pub",
  "plugins": {
    "vivo-hmac-auth": {},
    "limit-count": {
      "key": "server_addr",
      "count": 30,
      "policy": "local",
      "rejected_code": 429,
      "redis_timeout": 1000,
      "time_window": 60
    }
  },
  "desc": "夜景人像-鉴权",
  "priority": 0,
  "vars": {},
  "labels": {
    "serve": "1984316803"
  },
  "uris": [
    "/lowlight_enhancer_server",
    "/lowlight_enhancer_server/nobase64"
  ],
  "update_time": 1740037947,
  "name": "route-1984316803",
  "methods": [
    "GET",
    "POST",
    "PUT",
    "DELETE",
    "PATCH",
    "HEAD",
    "OPTIONS"
  ],
  "create_time": 1630985511
}

upstream配置

{
  "id": "vua_vip_prd_pub",
  "timeout": {
    "send": 60,
    "read": 60,
    "connect": 60
  },
  "create_time": 1726798078,
  "name": "VUA-正式环境(公网)",
  "pass_host": "pass",
  "type": "roundrobin",
  "update_time": 1737605710,
  "nodes": [
    {
      "host": "10.102.70.222",
      "port": 80,
      "weight": 1
    },
    {
      "host": "10.102.70.223",
      "port": 80,
      "weight": 1
    },
    {
      "host": "10.102.75.222",
      "port": 80,
      "weight": 1
    },
    {
      "host": "10.102.75.223",
      "port": 80,
      "weight": 1
    },
    {
      "host": "10.193.120.182",
      "port": 80,
      "weight": 1
    },
    {
      "host": "10.193.120.183",
      "port": 80,
      "weight": 1
    },
    {
      "host": "10.193.109.182",
      "port": 80,
      "weight": 1
    },
    {
      "host": "10.193.109.183",
      "port": 80,
      "weight": 1
    }
  ],
  "checks": {
    "active": {
      "unhealthy": {
        "http_statuses": [
          429,
          404,
          500,
          501,
          502,
          503,
          504,
          505
        ],
        "timeouts": 1,
        "http_failures": 2,
        "tcp_failures": 2,
        "interval": 2
      },
      "concurrency": 10,
      "http_path": "/do_not_delete/noc.gif",
      "healthy": {
        "successes": 2,
        "http_statuses": [
          200,
          302
        ],
        "interval": 2
      },
      "timeout": 1,
      "type": "http",
      "req_headers": [
        "User-Agent: curl/7.29.0"
      ],
      "https_verify_certificate": true
    }
  },
  "hash_on": "vars"
}

APISIX安装指南

  1. 安装apisix

    docker 安装

    使用此方法安装 APISIX,你需要安装 DockerDocker Compose

    首先下载 apisix-docker 仓库。

    git clone https://github.com/apache/apisix-docker.git
    cd apisix-docker/example
    

    然后,使用 docker-compose 启用 APISIX。

    docker-compose -p docker-apisix up -d

    通过 RPM 仓库安装

    该安装方法适用于 CentOS 7 和 CentOS 8。如果你选择该方法安装 APISIX,需要先安装 etcd。具体安装方法请参考 安装 etcd

    如果当前系统没有安装OpenResty,请使用以下命令来安装 OpenResty 和 APISIX 仓库:

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

    如果已安装 OpenResty 的官方 RPM 仓库,请使用以下命令安装 APISIX 的 RPM 仓库:

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

    完成上述操作后使用以下命令安装 APISIX:

    sudo yum install apisix
    

    也可以安装指定的版本

    sudo yum install apisix-3.8.0

    通过 RPM 包离线安装:#

    将 APISIX 离线 RPM 包下载到 apisix 文件夹:

    sudo mkdir -p apisix
    sudo yum install -y https://repos.apiseven.com/packages/centos/apache-apisix-repo-1.0-1.noarch.rpm
    sudo yum clean all && yum makecache
    sudo yum install -y --downloadonly --downloaddir=./apisix apisix
    

    然后将 apisix 文件夹复制到目标主机并运行以下命令:

    sudo yum install ./apisix/*.rpm
    

    管理 APISIX 服务#

    APISIX 安装完成后,你可以运行以下命令初始化 NGINX 配置文件和 etcd:

    apisix init
    

    使用以下命令启动 APISIX:

    apisix start
    
  2. 安装etcd

    apisix使用etcd作为配置中心进行保存和同步配置在安装apisix前,需要你的主机安装etcd

    如果安装的apisix选择了docker安装,那么etcd将会自动安装;如果你选择其他方式或手动安装apisix,参考以下步骤安装etcd:

    ETCD_VERSION='3.5.4'
    wget https://github.com/etcd-io/etcd/releases/download/v${ETCD_VERSION}/etcd-v${ETCD_VERSION}-linux-amd64.tar.gz
    tar -xvf etcd-v${ETCD_VERSION}-linux-amd64.tar.gz && \
      cd etcd-v${ETCD_VERSION}-linux-amd64 && \
      sudo cp -a etcd etcdctl /usr/bin/
    nohup etcd >/tmp/etcd.log 2>&1 &
    

配置apisix

通过修改本地./conf/config.yaml文件,或者在启动apisix时使用-c--config添加文路径参数apisix start -c <path string>,完成apisix服务本身的基本配置。默认配置不应修改,可以在 apisix/cli/config.lua 中找到。

比如将apisix默认监听端口修改为8000,其他配置保持默认,在./conf/config.yaml中只需这样配置:

./conf/config.yaml

apisix:
	node_listen: 8000 

比如指定 APISIX 默认监听端口为 8000,并且设置 etcd 地址为 http://foo:2379,其他配置保持默认。在 ./conf/config.yaml 中只需这样配置:

./conf/config.yaml


apisix:
  node_listen: 8000 # APISIX listening port

deployment:
  role: traditional
  role_traditional:
    config_provider: etcd
  etcd:
    host:
      - "http://foo:2379"

注意

请不要手动修改apisix目录下的./conf/nginx.conf 文件。当启动apisix时,会根据config.yaml的配置自动生成新的nginx.conf并启动服务

更新admin api key

./conf/config.yaml

deployment:
  admin:
    admin_key
      -
        name: "admin"
        key: newsupersecurekey  # 请修改 key 的值
        role: admin

更新完成后,你可以使用新的key访问admin api:

curl http://127.0.0.1:9180/apisix/admin/routes?api_key=newsupersecurekey -i

为 APISIX 添加 systemd 配置文件

如果你是通过 RPM 包安装 APISIX,配置文件已经自动安装,你可以直接使用以下命令:

systemctl start apisix
systemctl stop apisix

如果你是通过其他方法安装的 APISIX,可以参考配置文件模板进行修改,并将其添加在 /usr/lib/systemd/system/apisix.service 路径下。

配置文件

# 配置etcd作为apixis的配置中心
etcd:
    host:
     - "http://172.00.71.00:2379"
     - "http://172.00.71.00:12379"
     - "http://1172.00.71.00:22379"

apisix:
  # 表明管理员接口已启用,允许通过API管理APISIX
  enable_admin: true
  # 启用调试模式,提供更详细的日志和信息,用于诊断和调试。
  enable_debug: true
  # 配置代理缓存
  proxy_cache:
    # 缓存存活时间10s
    cache_ttl: 10s
    # 缓存区域配置
    zones:
    - name: disk_cache_one
      # 缓存区域的内存大小,设置为 50 MB
      memory_size: 50m
      disk_size: 1G
      disk_path: "/data01/winterfall/platform/api_gateway_v2/apisix-2.0/disk_tmp/disk_cache_one"
      # 缓存层级配置,影响缓存目录结构
      cache_levels: "1:2"
  
  allow_admin:       
  # 注释掉的部分说明如无明确设置,默认允许所有 IP 访问管理界面。可根据需要设置特定的 IP 地址或网段。 http://nginx.org/en/docs/http/ngx_http_access_module.html#allow
  #  - "::/64"
  #  - 127.0.0.0/24              # If we don't set any IP list, then any IP access is allowed by default.
  admin_key:
    -
      name: "adade"
      key:aewefwe   # using fixed API token has security risk, please
                                            # update it when you deploy to production environment
      role: admin

nginx_config:
  error_log_level: "info"
  worker_processes: "1"
  http:
  # 定义了访问日志的格式,包含了许多请求和响应的信息。
    access_log_format: "$remote_addr - $remote_user [$time_local] \"$request\" \"$http_host\" $status $body_bytes_sent \"$http_referer\" \"$http_user_agent\" \"$request_time\" \"$ssl_protocol\" \"$ssl_cipher\" \"$http_x_forwarded_for\" \"$upstream_addr\" \"$upstream_status\" \"$upstream_response_length\" \"$upstream_response_time\" \"$http_x_gateway_serve\" \"$http_x_ai_gateway_app_id\""
    # 客户端请求主体缓冲区
    client_body_buffer_size: 100m
    client_max_body_size: 100m

plugins:
  - example-plugin
  - limit-req
  - limit-count
  - limit-conn
  - key-auth
  - basic-auth
  - prometheus
  - node-status
  - jwt-auth
  - zipkin
  - ip-restriction
  - referer-restriction
  - grpc-transcode
  - serverless-pre-function
  - serverless-post-function
  - vivo-token-auth

plugin_attr:
  vivo-hmac-auth: 
  # 指定用于在请求头中存储 HMAC 签名的键名。这个签名用来验证请求的完整性和来源的合法性
    signature_key: "X-AI-GATEWAY-SIGNATURE"
    # 指定在请求头中表明使用哪种 HMAC 算法进行签名的键名,例如 SHA256。不同的算法可能使用不同的哈希函数。
    algorithm_key: "X-APISIX-HMAC-ALGORITHM"
    # 用于存储请求时间戳的键名,常用于请求的时效性检查,防止重放攻击。
    date_key: "X-AI-GATEWAY-TIMESTAMP"
    # 用于标识请求者身份的键名,通常是应用 ID 或者用户 ID,这个是与服务器约定用来识别客户端的关键信息。
    access_key: "X-AI-GATEWAY-APP-ID"
    # 指定哪些 HTTP 头部是签名算法的一部分,通过这个键来识别提示签名服务端哪些头部参与了签名计算。
    signed_headers_key: "X-AI-GATEWAY-SIGNED-HEADERS"

软件架构

apisix是一个动态,实时,高性能的云原生API网关,它构建与NGINX + ngx_lua 的技术基础之上,充分利用了LuaJIT所提供的强大性能,为什么apisix选择NGINX + Lua技术栈?

image-20240930094419724

apisix主要分为两个部分:

  1. apisix核心:包括lua插件,多语言插件运行时(plugin runner),wasm插件运行时等;
  2. 功能丰富的各种内置插件:包括可观测性,安全,流量控制等

APISIX 在其核心中,提供了路由匹配、负载均衡、服务发现、API 管理等重要功能,以及配置管理等基础性模块。

除此之外,APISIX 插件运行时也包含其中,提供原生 Lua 插件的运行框架和多语言插件的运行框架,以及实验性的 Wasm 插件运行时等。

APISIX 多语言插件运行时提供多种开发语言的支持,比如 Golang、Java、Python、JS 等。

APISIX 目前也内置了各类插件,覆盖了 API 网关的各种领域,如认证鉴权、安全、可观测性、流量管理、多协议接入等。当前 APISIX 内置的插件使用原生 Lua 实现,关于各个插件的介绍与使用方式,可以查看相关插件文档

插件加载流程

image-20240930094801030

插件内部结构

image-20240930094820724

自定义插件

环境准备

  1. 安装apisix
  2. 安装operesty
  3. 安装etcd

新建my-auth

在 Apache APISIX 中的 apisix/plugins 目录下新建一个目录,用于存放自定义插件。在这个例子中,我们假设您的插件名为 my-auth.lua

mkdir apisix/plugins/my-auth.lua

编写插件代码

local core = require("apisix.core")
local plugin_name = "my-auth"

local schema = {
    type = "object",
    properties = {
        api_key = { type = "string" },
    },
    required = { "api_key" }
}

local _M = {
    version = 0.1,
    priority = 2000,   -- 设置优先级
    name = plugin_name,
    schema = schema,
}

function _M.check_schema(conf)
    return core.schema.check(schema, conf)
end

function _M.access(conf, ctx)
    local headers = core.request.headers(ctx)
    local api_key = headers["x-api-key"]

    if not api_key or api_key ~= conf.api_key then
        return 401, { message = "Invalid API Key" }
    end
end

return _M

注册插件

在 APISIX 的 config.yaml 文件中增加该插件名,以确保在 APISIX 启动时能加载该插件。

plugins:
  - my-auth

步骤5:重启 APISIX

为了使您的自定义插件生效,需要重启 Apache APISIX:

apisix restart

步骤6:配置插件

使用 APISIX Admin API 来为特定的 route、service 或 consumer 配置自定义插件:

curl http://127.0.0.1:9180/apisix/admin/routes/1 -X PUT -d '
{
    "uri": "/hello",
    "plugins": {
        "my-auth": {
            "api_key": "my-secret-key"
        }
    },
    "upstream": {
        "nodes": {
            "127.0.0.1:1980": 1
        },
        "type": "roundrobin"
    }
}'

步骤7:测试和调试

  • 使用工具如 curl 来测试这个路由,要确保在请求头中提供 x-api-key
curl -i http://127.0.0.1:9080/hello -H "x-api-key: my-secret-key"
  • 查看日志和 Console Output 以确保插件正常工作。错误和调试信息通常输出在 error.log
posted @ 2025-02-20 22:56  小郑[努力版]  阅读(9)  评论(0)    收藏  举报