《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》
摘要: 原创出处 http://www.iocoder.cn/APISIX/install/ 「芋道源码」欢迎转载,保留摘要,谢谢!

🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

1. 概述

APISIX 是基于 OpenResty + etcd 实现的云原生高性能可扩展的微服务 API 网关。它是国人开源,目前已经进入 Apache 进行孵化,牛逼!!!

  • OpenResty:通过 Lua 扩展 Nginx 实现的可伸缩的 Web 平台。
  • etcd:Key/Value 存储系统。

APISIX 通过插件机制,提供了动态负载平衡、身份验证、限流限速等等功能,当然我们也可以自己开发插件进行拓展

整体架构

  • 动态负载均衡:跨多个上游服务的动态负载均衡,目前已支持 round-robin 轮询和一致性哈希算法。
  • 身份验证:支持 key-authJWTbasic-authwolf-rbac 等多种认证方式。
  • 限流限速:可以基于速率请求数并发等维度限制。

并且 APISIX 还支持 A/B 测试、金丝雀发布(灰度发布)、蓝绿部署、监控报警、服务可观测性、服务治理等等高级功能,这在作为微服务 API 网关非常重要的特性。

APISIX 的文档非常齐全,由于它是国人开源,所以文档也是中文友好。因此,艿艿这里就不哔哔介绍,胖友可以后续可以阅读如下:

下面,我们正式进入 APISIX 的极简入门之旅。

2. 快速安装

《APISIX 官方文档 —— 安装》中,介绍了源码包、RPM 包、Luarocks、Docker 四种安装方式。这里我们使用 CentOS 7.X 系统,所以采用 RPM 包。

因为 APISIX 是基于 OpenResty + etcd 来实现,所以需要安装它们两。

2.1 安装 OpenResty

安装 OpenResty,使用如下命令:

# 安装 OpenResty 的 YUM 软件源
$ yum install yum-utils
$ yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo

# 安装 OpenResty 软件
$ yum install -y openresty

2.2 安装 etcd

安装 etcd,使用如下命令:

# 安装 etcd
$ yum install -y etcd

# 启动 etcd
$ service etcd start

2.3 安装 APISIX

安装 APISIX,使用如下命令:

友情提示:这里我们安装的 APISIX 的版本是 1.2 版本。

最新版本的,可以从《APISIX 官方文档 —— 构建 Apache APISIX》获取。

# 安装 APISIX
$ yum install -y https://github.com/apache/incubator-apisix/releases/download/1.2/apisix-1.2-0.el7.noarch.rpm

# 启动 APISIX
$ apisix start

此时,APISIX 安装在 /usr/local/apisix/ 目录,使用如下命令:

$ cd /usr/local/apisix/
$ ls -ls
total 40
4 drwxr-xr-x 8 root root 4096 May 1 20:40 apisix # APISIX 程序
4 drwx------ 2 nobody root 4096 May 1 20:44 client_body_temp
4 drwxr-xr-x 3 root root 4096 May 1 20:50 conf # 配置文件
4 drwxr-xr-x 6 root root 4096 May 1 20:40 dashboard # APISIX 控制台
4 drwxr-xr-x 5 root root 4096 May 1 20:40 deps
4 drwx------ 2 nobody root 4096 May 1 20:44 fastcgi_temp
4 drwxrwxr-x 2 root root 4096 May 1 20:44 logs # 日志文件
4 drwx------ 2 nobody root 4096 May 1 20:44 proxy_temp
4 drwx------ 2 nobody root 4096 May 1 20:44 scgi_temp
4 drwx------ 2 nobody root 4096 May 1 20:44 uwsgi_temp

默认情况下,APISIX 启动在 9080 端口,使用如下命令:

$ curl http://127.0.0.1:9080/
{"error_msg":"failed to match any routes"}

3. APISIX 控制台

APISIX 内置控制台功能,方便我们进行 APISIX 的 Route、Consumer、Service、SSL、Upstream 的查看与维护。如下图所示:

APISIX 控制台

/usr/local/apisix/conf/nginx.conf 配置文件中,设置了 APISIX 控制台的访问路径为 /apisix/dashboard。如下图所示:

APISIX 控制台 - 配置

友情提示:如果胖友是安装 APISIX 在本机上,可以不执行如下步骤。

考虑到安全性,APISIX 控制台只允许本机访问,因此我们需要修改 /usr/local/apisix/conf/config.yaml 配置文件,增加允许访问的远程 IP 地址。如下图所示:

APISIX 控制台 - 修改配置

修改完配置后,使用 apisix restart 命令,重启 APISIX 来生效配置。然后,使用浏览器访问 http://172.16.48.185:9080/apisix/dashboard 地址,进入 APISIX 控制台。结果如下图所示:

APISIX 控制台 - 登陆

使用默认的「admin/123456」账号,登陆 APISIX 控制台。结果如下图:

APISIX 控制台 - 首页

友情提示:APISIX 控制台是通过调用 APISIX 提供的管理 API 来实现的,所以可以看看《APISIX 官方文档 —— 管理 API》

4. 动态负载均衡

本小节,我们来实现对后端服务提供的 API 接口进行负载均衡。考虑到方便,艿艿在 https://github.com/YunaiV/SpringBoot-Labs 仓库提供了一个 Spring Boot 项目 lab-56-demo01,如下图所示:

Spring Boot 项目

最终示例的效果,如下图所示:

项目效果

4.1 启动后端服务

分别执行 Demo01Application、Demo02Application 类,在 18080 和 28080 端口,启动两个后端服务。然后,调用示例 /demo/echo 接口,确认启动成功。

友情提示:10.8.8.18 地址,为艿艿部署后端服务的地址。

$ curl http://10.8.8.18:18080/demo/echo
echo:18080

$ curl http://10.8.8.18:28080/demo/echo
echo:28080

4.2 创建 APISIX Upstream

APISIX Upstream,是虚拟主机抽象,对给定的多个服务节点按照配置规则进行负载均衡。

更多 Upstream 的介绍,可以看《APISIX 官方文档 —— 架构设计(Upstream)》

在 APISIX 控制台的「Upstream」菜单中,创建一个 APISIX Upstream。如下图所示:

APISIX Upstream

4.3 创建 APISIX Route

APISIX Route,字面意思就是路由,通过定义一些规则来匹配客户端的请求,然后根据匹配结果加载并执行相应的 插件,并把请求转发给到指定 Upstream。

更多 Route 的介绍,可以看《APISIX 官方文档 —— 架构设计(Route)》

APISIX Route

4.4 简单测试

现在,我们来请求 APISIX 网关,转发请求到后端服务。

友情提示:172.16.48.185 地址,为艿艿部署 APISIX 网关的地址。

$ curl http://172.16.48.185:9080/demo/echo
echo:18080

$ curl http://172.16.48.185:9080/demo/echo
echo:28080

$ curl http://172.16.48.185:9080/demo/echo
echo:18080

$ curl http://172.16.48.185:9080/demo/echo
echo:28080

从结果可以看出,APISIX 网关使用轮询算法,将请求轮流转发到后端服务。

5. 限流限速

APISIX 内置了三个限流限速插件:

  • limit-count:基于“固定窗口”的限速实现。
  • limit-req:基于漏桶原理的请求限速实现。
  • limit-conn:限制并发请求(或并发连接)。

本小节,我们来演示使用 limit-req 插件,毕竟基于漏桶的限流算法,是目前较为常用的限流方式。

漏桶算法(Leaky Bucket)是网络世界中流量整形(Traffic Shaping)或速率限制(Rate Limiting)时经常使用的一种算法,它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。

漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。

漏桶算法

5.1 配置 limit-req 插件

「4. 动态负载均衡」小节中,我们已经创建了一个 APISIX Route。这里,我们给该 Route 配置下 limit-req 插件。如下图所示:

配置 limit-req 插件

  • rate:指定的请求速率(以秒为单位),请求速率超过 rate 但没有超过 (rate + brust)的请求会被加上延时
  • burst:请求速率超过 (rate + brust)的请求会被直接拒绝
  • rejected_code:当请求超过阈值被拒绝时,返回的 HTTP 状态码
  • key:是用来做请求计数的依据,当前接受的 key 有:”remote_addr”(客户端 IP 地址), “server_addr”(服务端 IP 地址), 请求头中的”X-Forwarded-For” 或 “X-Real-IP”。

上述配置限制了每秒请求速率为 1,大于 1 小于 3 的会被加上延时,速率超过 3 就会被拒绝

5.2 简单测试

快速多次请求 http://172.16.48.185:9080/demo/echo 地址,我们会看到页面返回 503 错误码,成功被 APISIX 所限流。如下图所示:

简单测试

6. 身份验证

APISIX 内置了四个身份验证插件:

  • key-auth:基于 Key Authentication 的用户认证。
  • JWT-auth:基于 JWT (JSON Web Tokens) Authentication 的用户认证。
  • basic-auth:基于 basic auth 的用户认证。
  • wolf-rbac:基于 RBAC 的用户认证及授权。

    需要额外搭建 wolf 服务,提供用户、角色、资源等信息。

本小节,我们来演示使用 JWT-auth 插件,大家比较熟知的认证方式。不了解的胖友,可以阅读如下文章:

6.1 配置 JWT-auth 插件

① 在 APISIX 控制台的「Consumer」菜单中,创建一个 APISIX Consumer,使用 JWT-auth 插件。如下图所示:

Consumer 是某类服务的消费者,需与用户认证体系配合才能使用。

更多 Consumer 的介绍,可以看《APISIX 官方文档 —— 架构设计(Consumer)》

  • 创建 Consumer 01
  • 创建 Consumer 02

    其中每个属性的作用如下:

    • key: 不同的 consumer 对象应有不同的值,它应当是唯一的。不同 consumer 使用了相同的 key ,将会出现请求匹配异常。
    • secret: 可选字段,加密秘钥。如果您未指定,后台将会自动帮您生成。
    • algorithm:可选字段,加密算法。目前支持 HS256, HS384, HS512, RS256ES256,如果未指定,则默认使用 HS256
    • exp: 可选字段,token 的超时时间,以秒为单位的计时。比如有效期是 5 分钟,那么就应设置为 5 * 60 = 300

② 在「4. 动态负载均衡」小节中,我们已经创建了一个 APISIX Route。这里,我们给该 Route 配置下 JWT-auth 插件。如下图所示:

配置 JWT-auth 插件

友情提示:是不是觉得配置过程有点怪怪的,淡定~

6.2 简单测试

① 调用 jwt-auth 插件提供的签名接口,获取 Token。

# key 参数,为我们配置 jwt-auth 插件时,设置的 key 属性。
$ curl http://172.16.48.185:9080/apisix/plugin/jwt/sign?key=yunai
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJ5dW5haSIsImV4cCI6MTU4ODQ3MzA5NX0.WlLhM_gpr-zWKXCcXEuSuw-7JosU9mnHwfeSPtspCGo

② 使用 Postman 模拟调用示例 /demo/echo 接口,并附带上 JWT。如下图所示:

Postman 模拟请求

友情提示:至此,我们已经完成了 JWT-auth 插件的学习。

胖友可以先删除示例 Route 配置的 JWT-auth 插件,方便模拟请求哈。

7. 健康检查

因为 APISIX 控制台暂未提供健康检查的配置功能,艿艿等后续有了在补充。

胖友可以先阅读《APISIX 官方文档 —— 健康检查》,使用 APISIX Admin API 进行添加健康检查的配置。

666. 彩蛋

暂时没有彩蛋。

😈 继续跟进 APISIX 的演进和变化~

文章目录
  1. 1. 1. 概述
  2. 2. 2. 快速安装
    1. 2.1. 2.1 安装 OpenResty
    2. 2.2. 2.2 安装 etcd
    3. 2.3. 2.3 安装 APISIX
  3. 3. 3. APISIX 控制台
  4. 4. 4. 动态负载均衡
    1. 4.1. 4.1 启动后端服务
    2. 4.2. 4.2 创建 APISIX Upstream
    3. 4.3. 4.3 创建 APISIX Route
    4. 4.4. 4.4 简单测试
  5. 5. 5. 限流限速
    1. 5.1. 5.1 配置 limit-req 插件
    2. 5.2. 5.2 简单测试
  6. 6. 6. 身份验证
    1. 6.1. 6.1 配置 JWT-auth 插件
    2. 6.2. 6.2 简单测试
  7. 7. 7. 健康检查
  8. 8. 666. 彩蛋