• 1. 概述
  • 2. 快速安装
  • 3. APISIX 控制台
  • 4. 动态负载均衡
  • 5. 限流限速
  • 6. 身份验证
  • 7. 健康检查
  • 666. 彩蛋

  • 5.1 放假写的。

    啊!我是真的认真!!!

    1. 概述

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

    OpenResty:通过 Lua 扩展 NGINX 实现的可伸缩的 Web 平台。

    etcd:Key/Value 存储系统。

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

    开源的微服务网关(国产微服务网关APISIX)(1)

    整体架构

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

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

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

    • 《APISIX 官方文档 —— 简介》
    • 《APISIX 官方文档 —— 插件》
    • 《APISIX 官方文档 —— 白皮书》

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

    2. 快速安装

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

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

    2.1 安装 OpenResty

    安装 OpenResty,使用如下命令:

    #安装OpenResty的YUM软件源 $yuminstallyum-utils $yum-config-manager--add-repoopenresty/package/centos/openresty.repo #安装OpenResty软件 $yuminstall-yopenresty

    2.2 安装 etcd

    安装 etcd,使用如下命令:

    #安装etcd $yuminstall-yetcd #启动etcd $serviceetcdstart

    2.3 安装 APISIX

    安装 APISIX,使用如下命令:

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

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

    #安装APISIX $yuminstall-ygithub/apache/incubator-apisix/releases/download/1.2/apisix-1.2-0.el7.noarch.rpm #启动APISIX $apisixstart

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

    $cd/usr/local/apisix/ $ls-ls total40 4drwxr-xr-x8rootroot4096May120:40apisix#APISIX程序 4drwx------2nobodyroot4096May120:44client_body_temp 4drwxr-xr-x3rootroot4096May120:50conf#配置文件 4drwxr-xr-x6rootroot4096May120:40dashboard#APISIX控制台 4drwxr-xr-x5rootroot4096May120:40deps 4drwx------2nobodyroot4096May120:44fastcgi_temp 4drwxrwxr-x2rootroot4096May120:44logs#日志文件 4drwx------2nobodyroot4096May120:44proxy_temp 4drwx------2nobodyroot4096May120:44scgi_temp 4drwx------2nobodyroot4096May120:44uwsgi_temp

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

    $curl127.0.0.1:9080/ {"error_msg":"failedtomatchanyRoutes"}

    3. APISIX 控制台

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

    开源的微服务网关(国产微服务网关APISIX)(2)

    APISIX 控制台

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

    开源的微服务网关(国产微服务网关APISIX)(3)

    APISIX 控制台 - 配置

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

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

    开源的微服务网关(国产微服务网关APISIX)(4)

    APISIX 控制台 - 修改配置

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

    开源的微服务网关(国产微服务网关APISIX)(5)

    APISIX 控制台 - 登陆

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

    开源的微服务网关(国产微服务网关APISIX)(6)

    APISIX 控制台 - 首页

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

    4. 动态负载均衡

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

    开源的微服务网关(国产微服务网关APISIX)(7)

    Spring Boot 项目

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

    开源的微服务网关(国产微服务网关APISIX)(8)

    项目效果

    4.1 启动后端服务

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

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

    $curl10.8.8.18:18080/demo/echo echo:18080 $curl10.8.8.18:28080/demo/echo echo:28080

    4.2 创建 APISIX Upstream

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

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

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

    开源的微服务网关(国产微服务网关APISIX)(9)

    APISIX Upstream

    4.3 创建 APISIX Route

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

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

    开源的微服务网关(国产微服务网关APISIX)(10)

    APISIX Route

    4.4 简单测试

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

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

    $curl172.16.48.185:9080/demo/echo echo:18080 $curl172.16.48.185:9080/demo/echo echo:28080 $curl172.16.48.185:9080/demo/echo echo:18080 $curl172.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 插件。如下图所示:

    开源的微服务网关(国产微服务网关APISIX)(11)

    配置 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 简单测试

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

    开源的微服务网关(国产微服务网关APISIX)(12)

    简单测试

    6. 身份验证

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

    • key-auth:基于 Key Authentication 的用户认证。
    • JWT-auth:基于 JWT (JSON Web Tokens) Authentication 的用户认证。
    • basic-auth:基于 basic auth 的用户认证。
    • wolf-rbac:基于 RBAC 的用户认证及授权。需要额外搭建 wolf 服务,提供用户、角色、资源等信息。

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

    • 《JSON Web Token - 在Web应用间安全地传递信息》
    • 《八幅漫画理解使用 JSON Web Token 设计单点登录系统》

    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, RS256 和ES256,如果未指定,则默认使用 HS256。
      • exp: 可选字段,token 的超时时间,以秒为单位的计时。比如有效期是 5 分钟,那么就应设置为 5 * 60 = 300。

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

    开源的微服务网关(国产微服务网关APISIX)(13)

    配置 JWT-auth 插件

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

    6.2 简单测试

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

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

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

    开源的微服务网关(国产微服务网关APISIX)(14)

    Postman 模拟请求

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

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

    7. 健康检查

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

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

    666. 彩蛋

    暂时没有彩蛋。

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

    转载自作者:芋道源码

    原文链接:iocoder/APISIX/install/

    ,