apisix初体验
apisix相关概念
路由(Route):通过定义一些规则来匹配客户端的请求,然后根据匹配结果加载并执行相应的插件,并把请求转发给到指定 上游(Upstream)。
服务(Service): Service 是某类 API 的抽象(也可以理解为一组 Route 的抽象)。
它通常与上游服务抽象是一一对应的,Route 与 Service 之间,通常是 N:1 的关系
插件(Plugin):配置可直接绑定在 Route 上,也可以被绑定在 Service 或 Consumer上。而对于同一 个插件的配置,只能有一份是有效的,配置选择优先级总是 Consumer > Route > Service。
插件的配置可以被直接绑定在指定 Route 中,也可以被绑定在 Service 中,不过 Route 中的插件配置 优先级更高。
消费者(Consumer):是某类服务的消费者,需与用户认证体系配合才能使用。
比如不同的 Consumer 请求同一个 API,网关服务根据当前请求用户信息,对应不同的 Plugin 或 Upstream 配置。
Docker安装APISIX
https://github.com/apache/apisix/blob/master/docs/zh/latest/getting-started.md
APISIX k8s服务发现使用
./apisix/conf/config.yaml
discovery: # kubernetes服务发现
kubernetes:
namespace_selector:
match:
- namespaces # 对应k8s的命名空间
dashboard配置k8s服务
service_name 必须满足格式: [namespace]/[name]:[portName]
namespace: Endpoints 所在的命名空间
name: Endpoints 的资源名
portName: Endpoints 定义包含的 ports.name 值,如果 Endpoints 没有定义 ports.name,请依次使用 targetPort, port 代替
<服务名称>/<服务下的部署名称>:tcpport<服务部署的port>
test-apisix/test-apisix.my_test:tcpport9080
APISIX路由配置使用
www.test-apisix.com /*
www.test-apisix.com /nginx/*
带路径是后端服务也要有对应的路径
上游配置使用
节点
httpbin.devops.svc.k8s.local 80的方式
从apisix日志可以看到ups转发为服务的svc上
kubectl get svc -n devops |grep 172.21.172.118
httpbin ClusterIP 172.21.172.118 80/TCP 31h
使用k8s服务发现
从apisix日志可以看出ups直接转发到pod ip
kubectl get pods -o wide -n devops |grep 172.29.196.26
httpbin-l793ophb-deploy-68dff4b69-gj6h8 1/1 Running 0 31h 172.29.196.26
Apache-APISIX 插件
插件使用bug,页面已经禁用,但是插件还一直生效。编辑plugin json格式手动删除即可。
⚠️通过dashboard操作插件的方式并不是通过页面禁用实现,有一个删除插件的按钮才能实现删除的操作,不然就需要手动编辑插件的json文件。这样还有一个问题可能当前操作不会发现,但是重启apisix后重新拉去配置,如果配置不当会导致apisix启动失败。
limit-req插件
限制请求速度的插件,使用的是漏桶算法。
"rate": 1,
"burst": 2
限制了每秒请求速率为 1,大于 1 小于 3 的会被加上延时,速率超过 3 就会被拒绝
https://www.bookstack.cn/read/apache-apisix-1.4-zh/8f85c755667b023c.md
limit-count插件
限制了 60 秒内只能访问 2 次
"count": 2,
"time_window": 60,
"key": "remote_addr",
basic-auth插件
适用于简单的登录校验
basic-auth 是一个认证插件,它需要与 consumer 一起配合才能工作。
添加 Basic Authentication 到一个 service 或 route。 然后 consumer 将其用户名和密码添加到请求头中以验证其请求。
proxy-rewrite插件
proxy-rewrite 插件可以针对我们的请求进行各种策略的转发。
proxy-rewrite默认在路由配置的【请求改写 】模块,对应静态改写和正则改写。
要注意 regex_uri 和 uri是互斥的,一起配置后regex_uri 是无效的。也就是说当同时配置 uri 和 regex_uri 属性时,优先使用 uri
可以从regex_uri 第一个参数中提取数据用于第二个参数
proxy rewrite 插件也支持REST API的形式
可以通过proxy rewrite 插件 增加公共的header
插件配置参考
uri方式-静态改写
{
"name": "xxx",
"upstream_id": "xxx",
"plugins": {
"proxy-rewrite": {
"disable": false,
"host": "www.apisix.com",
"uri": "/test/abc/topic"
}
}
}
regex_uri方式-正则改写
{
"name": "xxx",
"upstream_id": "xxx",
"plugins": {
"proxy-rewrite": {
"disable": false,
"host": "www.apisix.com",
"regex_uri": [
"^/test/topic/(.*)",
"/test/abc/topic/$1"
]
}
}
}
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!