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"
      ]
    }
  }
}