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-quickstart 和 etcd 两个容器,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
- 将
pass_host
字段设置为node
,将传递请求头给上游。 - 将
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消费者和提供者。处于安全考虑,在访问内部资源之前,应先对消费者进行身份验证和授权。
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(也称之为密钥验证)是一个相对比较简单但是应用广泛的身份验证方法,它的设计思路如下:
- 管理员为路由添加一个身份验证密钥(API 密钥)。
- API 消费者在发送请求时,在查询字符串或者请求头中添加密钥。
启用key Authentication
前置条件:
- APISix安装
- 完成配置路由
创建消费者 (应用)
创建一个名为tom
的消费者,并启用key-auth
插件,秘钥设置为secret-key
.所有携带密钥 secret-key
的请求都会被识别为消费者 tom
。
秘钥验证
API网关主要作用是链接API消费者和提供者。处于安全考虑,在访问内部资源之前,应先对消费者进行身份验证和授权。
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(也称之为密钥验证)是一个相对比较简单但是应用广泛的身份验证方法,它的设计思路如下:
- 管理员为路由添加一个身份验证密钥(API 密钥)。
- 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.disable
为 true
,即可禁用密钥验证插件。
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 和微服务。请求的计数在内存中完成,具有低延迟和高性能的特点。
启用 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.disable
为 true
,即可禁用限速插件。
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安装指南
-
安装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
-
安装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技术栈?
apisix主要分为两个部分:
- apisix核心:包括lua插件,多语言插件运行时(plugin runner),wasm插件运行时等;
- 功能丰富的各种内置插件:包括可观测性,安全,流量控制等
APISIX 在其核心中,提供了路由匹配、负载均衡、服务发现、API 管理等重要功能,以及配置管理等基础性模块。
除此之外,APISIX 插件运行时也包含其中,提供原生 Lua 插件的运行框架和多语言插件的运行框架,以及实验性的 Wasm 插件运行时等。
APISIX 多语言插件运行时提供多种开发语言的支持,比如 Golang、Java、Python、JS 等。
APISIX 目前也内置了各类插件,覆盖了 API 网关的各种领域,如认证鉴权、安全、可观测性、流量管理、多协议接入等。当前 APISIX 内置的插件使用原生 Lua 实现,关于各个插件的介绍与使用方式,可以查看相关插件文档。
插件加载流程
插件内部结构
自定义插件
环境准备
- 安装apisix
- 安装operesty
- 安装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
。