APISIX

news/2025/2/22 17:29:02/文章来源:https://www.cnblogs.com/2678066103hs/p/18728025

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.org 和 mock.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 拥有灵活的插件扩展系统,目前有很多可用于用户身份验证和授权的插件。例如:

  • Key Authentication
  • Basic Authentication
  • JSON Web Token (JWT) Authentication
  • Keycloak
  • Casdoor
  • Wolf RBAC
  • OpenID Connect
  • Central Authentication Service (CAS)
  • HMAC
  • Casbin
  • LDAP
  • Open Policy Agent (OPA)
  • Forward Authentication
  • Multiple Authentications

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 拥有灵活的插件扩展系统,目前有很多可用于用户身份验证和授权的插件。例如:

  • Key Authentication
  • Basic Authentication
  • JSON Web Token (JWT) Authentication
  • Keycloak
  • Casdoor
  • Wolf RBAC
  • OpenID Connect
  • Central Authentication Service (CAS)
  • HMAC
  • Casbin
  • LDAP
  • Open Policy Agent (OPA)
  • Forward Authentication
  • Multiple Authentications

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,你需要安装 Docker 和 Docker 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.yamlapisix:node_listen: 8000 

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

./conf/config.yamlapisix:node_listen: 8000 # APISIX listening portdeployment:role: traditionalrole_traditional:config_provider: etcdetcd: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管理APISIXenable_admin: true# 启用调试模式,提供更详细的日志和信息,用于诊断和调试。enable_debug: true# 配置代理缓存proxy_cache:# 缓存存活时间10scache_ttl: 10s# 缓存区域配置zones:- name: disk_cache_one# 缓存区域的内存大小,设置为 50 MBmemory_size: 50mdisk_size: 1Gdisk_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 environmentrole: adminnginx_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: 100mclient_max_body_size: 100mplugins:- 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-authplugin_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)
endfunction _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 thenreturn 401, { message = "Invalid API Key" }end
endreturn _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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/887387.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ES

ES参考文档:https://www.cnblogs.com/buchizicai/p/17093719.htmlES分布式搜索引擎注意:在没有创建库的时候搜索,ES会创建一个库并自动创建该字段并且设置为String类型也就是text什么是elasticsearch?一个开源的分布式搜索引擎,可以用来实现搜索,日志统计,分析,系统监控…

【codeforces】codeforces界面字体突然变得很大,页面布局改变解决办法

今天打开codeforces界面突然变成了这样左侧变成了这样恢复方法: 把滚轮拉倒最下面切换成电脑模式即可恢复正常

影刀RPA与Coze API的结合使用

网上找了些资料,但是发现好多都是用的 Coze 的历史接口,现在新的 V3 接口处理方式包括字段和处理方式都不一样了,所以现在这个教程是基于最新版 V3 接口的。配置好 API 后,在影刀 RPA 中使用。 一、API 介绍 开发文档 : https://www.coze.cn/docs/developer_guides/coze_a…

RPA与Coze API的结合使用

网上找了些资料,但是发现好多都是用的 Coze 的历史接口,现在新的 V3 接口处理方式包括字段和处理方式都不一样了,所以现在这个教程是基于最新版 V3 接口的。配置好 API 后,在影刀 RPA 中使用。 一、API 介绍 开发文档 : https://www.coze.cn/docs/developer_guides/coze_a…

电脑感觉速度比以前慢,清理了还是慢怎么办?你需要检查下CPU频率,看看是不是被锁频/降频了

0 问题 电脑总是感觉速度慢,清理了电脑,去掉了不必要的程序,还是感觉没有以前快。 我的是笔记本电脑,电脑外壳各个地方摸起来也不热,风扇转动正常。也没有灰尘,清理过。 1. 原因 一直也不知道咋回事,看系统进程时,无意中看到CPU频率仅有0.4GHz,且长期都是这样,这肯定不…

【模拟电子技术】45-信号转换电路

【模拟电子技术】45-信号转换电路 串联电流负反馈,下面的电路起到的作用是使得Io与RL无关,下面也是负反馈定性分析:RL增大,Io增大,Ro右侧电压下降,A1的同相输入端减小,Uo1减小,Io减小 定量分析:(R1=R2=R3=R4)电压并联负反馈最后是全波精密整流电路,老师说这种电路对…

2025.02.20

pjudge 太坏了密码的 pjudge 怎么这么坏,怎么交题不显示代码的。 vp,第一次打 pjudge,最后看到没显示代码慌了,然后乱交代码,把 t1 整 0 了。真的流汗了,我为什么这么唐。我 t2 又是怎么 75 的呢?🤓省流:没遍历 id 为 0 的边。 以后再也不写成 tot = -1 了😡。

ViT, Transformer架构出圈到cv

Vision Transformer(ViT)通过采用自注意力机制处理图像块,革新了图像识别方法,展现了在大规模数据集上超越传统卷积神经网络的潜力。一、技术背景 视觉识别的挑战与机遇 在Vision Transformer(ViT)提出之前,卷积神经网络(CNNs),如ResNet和VGG,主导了视觉识别领域。然…

k8s面

题1:Kubernetes Service 都有哪些类型? 通过创建Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并且将请求负载分发到后端的各个容器应用上。其主要类型有: ClusterIP:虚拟的服务IP地址,该地址用于Kubernetes集群内部的Pod访问,在Node上kube-proxy通…

DP优化

# DP优化 动态状态 一个转移只用到很小的一部分状态,则不断刷新状态,使得其只与我需要的同阶。 例题:P3188 [HNOI2007] 梦幻岛宝珠 前缀和优化 就是枚举的值存下来,以防止重复的枚举。 例题:2024.10.3T3 Kanade的水杯60分 路径化DP 将一个二维的、仅仅是在相邻位置进行转移…