文章目录
- apisix 快速入门
- 什么是apisix
- 有了 NGINX 和 Kong,为什么还需要 Apache APISIX?
- 软件架构
- 基于 Nginx 开源版本,而 Nginx 并不支持动态配置,为什么 Apache APISIX 声称自己可以实现动态配置?
- 安装
- 配置 APISIX
- 配置路由
- 配置负载均衡
- 密钥验证
- Key Authentication 是什么#
- 限速
apisix 快速入门
什么是apisix
官网:https://apisix.apache.org/zh/
官方文档:https://apisix.apache.org/zh/docs/apisix/getting-started/README/
Apache APISIX 是 Apache 软件基金会下的顶级项目,它是一个具有动态、实时、高性能等特点的云原生 API 网关。
你可以使用 APISIX 网关作为所有业务的流量入口,它提供了动态路由、动态上游、动态证书、A/B 测试、灰度发布(金丝雀发布)、蓝绿部署、限速、防攻击、收集指标、监控报警、可观测、服务治理等功能。
APISIX 和其他的 API 网关有什么不同之处?#
Apache APISIX 在以下方面有所不同:
— 它使用 etcd 来保存和同步配置,而不是使用如 PostgreSQL 或 MySQL 这类的关系数据库。etcd 中的实时事件通知系统比这些替代方案更容易扩展。这允许 APISIX 实时同步配置,使代码简洁,并避免单点故障。
- 完全动态
- 支持热加载插件。
有了 NGINX 和 Kong,为什么还需要 Apache APISIX?
原文链接:https://xie.infoq.cn/article/04ec5ead0571ca4b4b1806ad0
总结
NGINX:虽然 NGINX 是一个稳定且广泛使用的解决方案,但其社区活跃度低、动态配置能力不足,且对 gRPC 的支持有限。
Kong:Kong 在云原生架构方面有所优势,但其控制面并不完全符合云原生标准,且对 PostgreSQL 的依赖限制了其弹性扩展能力。
活跃的开源社区:APISIX 是全球最活跃的开源 API 网关项目之一,拥有超过 200 位贡献者,社区活跃度高于 NGINX 和 Kong。这种活跃度意味着更快的更新和更丰富的功能扩展。
支持多语言:APISIX 正在逐步支持多种编程语言(如 Java、Golang、Rust 和 NodeJS),使得开发者可以使用自己熟悉的技术栈进行开发。
软件架构
官方文档:https://apisix.apache.org/zh/docs/apisix/architecture-design/apisix/
Apache APISIX 是一个动态、实时、高性能的云原生 API 网关。它构建于 NGINX + ngx_lua 的技术基础之上,充分利用了 LuaJIT 所提供的强大性能。
APISIX 在其核心中,提供了路由匹配、负载均衡、服务发现、API 管理等重要功能,以及配置管理等基础性模块。除此之外,APISIX 插件运行时也包含其中,提供原生 Lua 插件的运行框架和多语言插件的运行框架,以及实验性的 Wasm 插件运行时等。APISIX 多语言插件运行时提供多种开发语言的支持,比如 Golang、Java、Python、JS 等。
APISIX 目前也内置了各类插件,覆盖了 API 网关的各种领域,如认证鉴权、安全、可观测性、流量管理、多协议接入等。当前 APISIX 内置的插件使用原生 Lua 实现,关于各个插件的介绍与使用方式,可以查看相关插件文档。
基于 Nginx 开源版本,而 Nginx 并不支持动态配置,为什么 Apache APISIX 声称自己可以实现动态配置?
原文链接:https://apisix.apache.org/zh/blog/2021/08/25/why-apache-apisix-chose-nginx-and-lua/
Nginx 的路由需要在配置文件里面进行配置,每次更改路由,都需要 reload 之后才能生效。这是因为 Nginx 的路由分发只支持静态配置,不能动态增减路由。
为了实现路由动态配置,Apache APISIX 做了两件事:
- 在 Nginx 配置文件里面配置单个 server,这个 server 里面只有一个 location。我们把这个 location 作为主入口,这样所有的请求都会走到这个地方上来。
- 我们用 Lua 完成路由分发的工作。Apache APISIX 的路由分发模块,支持在运行时增减路由,这样就能动态配置路由了。
你可能会问,在 Lua 里面做路由分发,会比 Nginx 的实现慢吗?
就像前面提到过的一样,凡是对性能要求比较高的,我们会把核心代码用 C 改写。我们的路由分发模块就是这么干的。路由分发模块在匹配路由时,会采用一个前缀树来匹配。而这个前缀树是用 C 实现的。感兴趣的读者可以看下代码:https://github.com/api7/lua-resty-radixtree/ 。
采用 Lua 代码来做路由还有一个好处:它减低了二次开发的门槛。
如果在路由过程中需要有特殊的逻辑,用户可以实现成自定义的变量和运算符,比如通过 IP 库匹配到的地理位置来决定采用哪条路由。用户只需要写一些 Lua 代码,这要比修改 Nginx C module 的难度小多了。
在 Apache APISIX 里面,不仅仅路由是动态的,我们的 TLS 服务端证书和上游节点配置都是动态的,而且无需修改 Nginx —— 上述功能可以跑在官方的 Nginx + Lua 技术栈上。
总结: 动态性好一点,不用重reload nginx。
安装
如果你在安装 APISIX 时选择了 Docker 或 Helm 安装,那么 etcd 将会自动安装;如果你选择其他方法或者需要手动安装 APISIX,请参考以下步骤安装 etcd:
这里就是以docker安装为主。
快速启动脚本需要以下条件:
已安装 Docker,用于部署 etcd 和 APISIX。
已安装 curl,用于验证 APISIX 是否安装成功。
APISIX 可以借助 quickstart 脚本快速安装并启动:
curl -sL https://run.api7.ai/apisix/quickstart | sh
该命令启动 apisix-quickstart 和 etcd 两个容器,APISIX 使用 etcd 保存和同步配置。APISIX 和 etcd 容器使用 Docker 的 host 网络模式,因此可以从本地直接访问。
配置 APISIX
请不要手动修改 APISIX 安装目录下的 ./conf/nginx.conf 文件。当 APISIX 启动时,会根据 config.yaml 的配置自动生成新的 nginx.conf 并自动启动服务。
通过修改本地 ./conf/config.yaml 文件,或者在启动 APISIX 时使用 -c 或 --config 添加文件路径参数 apisix start -c
比如指定 APISIX 默认监听端口为 8000,并且设置 etcd 地址为 http://foo:2379,其他配置保持默认。在 ./conf/config.yaml 中只需这样配置:
apisix:node_listen: 8000 # APISIX listening portdeployment:role: traditionalrole_traditional:config_provider: etcdetcd:host:- "http://foo:2379"
更新 Admin API key
deployment:admin:admin_key-name: "admin"key: newsupersecurekey # 请修改 key 的值role: admin
建议修改 Admin API 的 key,保护 APISIX 的安全。
更新完成后,你可以使用新的 key 访问 Admin API:
curl http://127.0.0.1:9180/apisix/admin/routes?api_key=newsupersecurekey -i
配置路由
在 APISIX 中,路由配置通常是动态管理的,而不是静态写在 config.yaml 文件中。
APISIX 的路由配置是动态管理的,主要通过 API 或控制面工具(如 APISIX Dashboard)进行配置,并存储在 Etcd 中。config.yaml 文件主要用于配置 APISIX 的基本运行参数和与外部系统的集成设置。
Route 是什么#
Route(也称之为路由)是访问上游目标的路径,在 Apache 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"
}
配置负载均衡
创建一个具有两个上游服务的路由,访问 /headers 将被转发到 httpbin.org 和 mock.api7.ai 这两个上游服务,并且会返回请求头。
创建一个具有两个上游服务的路由,访问 /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。
密钥验证
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
本教程中,你将创建一个带有 Key Authentication 插件的 消费者,并学习如何启用和停用身份验证插件。
Consumer 是什么#
Consumer(也称之为消费者)是指使用 API 的应用或开发人员。
在 APISIX 中,消费者需要一个全局唯一的 名称,并从上面的列表中选择一个身份验证 插件。
Key Authentication 是什么#
**Key Authentication(也称之为密钥验证)**是一个相对比较简单但是应用广泛的身份验证方法,它的设计思路如下:
管理员为路由添加一个身份验证密钥(API 密钥)。
API 消费者在发送请求时,在查询字符串或者请求头中添加密钥。
创建消费者#
创建一个名为 tom 的消费者,并启用 key-auth 插件,密钥设置为 secret-key。所有携带密钥 secret-key 的请求都会被识别为消费者 tom。
caution
生产环境请使用复杂的密钥。
curl -i "http://127.0.0.1:9180/apisix/admin/consumers" -X PUT -d '
{"username": "tom","plugins": {"key-auth": {"key": "secret-key"}}
}'
如果消费者创建成功,你将得到返回 HTTP/1.1 201 Created。
启用 Authentication#
在教程配置路由中,我们已经创建了路由 getting-started-ip,我们通过 PATCH 方法为该路由增加 key-auth 插件:
curl -i "http://127.0.0.1:9180/apisix/admin/routes/getting-started-ip" -X PATCH -d '
{"plugins": {"key-auth": {}}
}'
如果增加插件成功,你将得到返回 HTTP/1.1 201 Created。
禁用 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}}}
}'
限速
APISIX 是一个统一的控制中心,它管理 API 和微服务的进出流量。除了客户端发来的合理的请求,还可能存在网络爬虫产生的不必要的流量,此外,网络攻击(比如 DDos)也可能产生非法请求。
APISIX 提供限速功能,通过限制在规定时间内发送到上游服务的请求数量来保护 APIs 和微服务。请求的计数在内存中完成,具有低延迟和高性能的特点。
在教程配置路由中,我们已经创建了路由 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}}
}'
上述配置将传入流量的速率限制为每 10 秒最多 2 个请求。
禁用 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}}}
}'