Spring Cloud已经是Java程序员的必备技能之一。从SOA到微服务,编写API成为每天的日常。但到了一定规模,我们就会面临这样的一些问题:
- 实现API的服务的认证和授权
- 定向发布服务给特定使用者
- 多套运行环境的管理
- 负载均衡,多节点管理
- 访问统计,流量监控,运维分析
在Spring全家桶里,有一系列服务治理的工具,包括Eureka、Hystrix、Zuul、Consul等等,国内比较出名的有Nacos、Sentinel等等。
本文给大家介绍一个新的选择: Apisix
Apisix,官网 https://apisix.apache.org/zh/ ,一个具有中国特色的命名产品,中国团队主创开源产品,Apache收录。
官方对自己的描述是: 全生命周期API管理
来一段官方植入:
Apache 软件基金会下的的云原生 API 网关项目 动态、实时、高性能 提供了负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性 主要处理南北向流量,亦可用于东西向
经过一段时间的体验,我已经在两套生产环境成功使用,主要体会是:
- Nginx威力加强版OpenResty的更加强版
- 图形化配置功能
- 配套监控功能
- 大量插件提供个性功能扩展
本文抛砖引玉,为大家能快速上手做个简单介绍.
0. 安装须知
Apisix适用于Linux,Unix,Docker,K8s,和市面上主要云,但不支持Windows
本文步骤基于Apisix 2.11.0进行介绍,环境以CentOS 7.6 为例
1. 安装
安装步骤包括以下内容
- OpenResty
- etcd
- apisix
- apisix dashboard (可选,建议安装)
1.1 准备工作
1.判断是x64还是arm, 决定了后续下载的安装包是x64还是其他的, 本文以x64为例
uname -m
2.增加仓库源,如果有可以忽略
yum-config-manager --add-repo https://repos.apiseven.com/packages/centos/apache-apisix.repo
3.安装依赖的OpenResty
yum install -y https://repos.apiseven.com/packages/centos/apache-apisix-repo-1.0-1.noarch.rpm
4.安装依赖的etcd
我的yum只能装 3.3,而apisix要求3.4,因此放弃yum安装,改用下载安装方式
# 下载安装包 curl -L https://github.com/etcd-io/etcd/releases/download/v3.5.1/etcd-v3.5.1-linux-amd64.tar.gz # 建目录 mkdir /usr/local/etcd # 解压 tar -zxvf etcd-v3.5.1-linux-amd64.tar.gz -C /usr/local/etcd # 查看目录,如果多套了一层目录,则移到外层,以下4行看情况而定 cd /usr/local/etcd/etcd-v3.5.1-linux-amd64/ mv * /usr/local/etcd cd .. rmdir etcd-v3.5.1-linux-amd64/ # 创建软连接 ln -s /usr/local/etcd/etcd /usr/bin/etcd ln -s /usr/local/etcd/etcdctl /usr/bin/etcdctl # 创建服务文件 /lib/systemd/system/etcd.service [Service] Type=notify ExecStart=/usr/local/etcd/etcd --name my-etcd-1 --listen-client-urls http://0.0.0.0:2379 --advertise-client-urls http://0.0.0.0:2379 --listen-peer-urls http://0.0.0.0:2380 --initial-advertise-peer-urls http://0.0.0.0:2380 --initial-cluster my-etcd-1=http://0.0.0.0:2380 [Install] WantedBy=multi-user.targe #启动etcd服务 systemctl start etcd
1.2 安装apisix
1.安装主程序, 以x86安装包为例
yum install -y https://repos.apiseven.com/packages/centos/7/x86_64/apisix-2.11.0-0.el7.x86_64.rpm
安装后的位置为
/usr/bin/apisix /usr/local/apisix
2.初始化
apisix init # 如果提示,表示系统配置的1024太小 Warning! Current maximum number of open file descriptors [1024] is not greater than 1024,please increase user limits by execute 'ulimit -n <new user limits>' ,otherwise the performance is low. # 则运行,修改为一个比较大的数字,最大65535 ulimit -n 8192 apisix init
3.测试配置文件
# 将根据 config.yaml 生成 nginx.conf ,并检查 nginx.conf 的语法是否正确 apisix test
正式使用时,将config-default的内容全部复制到config里面,原config内容都不要,以后只改config一个文件
4.常用指令
# 启动 apisix start # 优雅停止 apisix quit # 强制停止 apisix stop # 帮助 apisix help
1.3 安装dashboard
dashboard主要可以进行API的可视化配置,相当于图形化控制面板
可以选择不安装,那么所有的配置都要通过命令API完成,比较麻烦
避免在学习配置命令上花费过多的时间,减少学习成本。
还可以集成监控界面,对流量和性能进行监控。
1.安装程序
yum install -y https://github.com/apache/apisix-dashboard/releases/download/v2.10.1/apisix-dashboard-2.10.1-0.el7.x86_64.rpm
2.创建服务文件
# 创建文件 /lib/systemd/system/apisix-dashboard.service [Unit] Description=apisix-dashboard Conflicts=apisix-dashboard.service After=network-online.target [Service] WorkingDirectory=/usr/local/apisix/dashboard ExecStart=/usr/local/apisix/dashboard/manager-api -c /usr/local/apisix/dashboard/conf/conf.yaml # 可以执行以下指令自动创建 echo "[Unit] Description=apisix-dashboard Conflicts=apisix-dashboard.service After=network-online.target [Service] WorkingDirectory=/usr/local/apisix/dashboard ExecStart=/usr/local/apisix/dashboard/manager-api -c /usr/local/apisix/dashboard/conf/conf.yaml" > /usr/lib/systemd/system/apisix-dashboard.service
3.启动
systemctl start apisix-dashboard
默认地址 http://127.0.0.1:9000 默认账密 admin / admin
4.停止
systemctl stop apisix-dashboard
5.修改配置文件
默认只能被127.0.0.1访问,而我们往往需要用客户机来访问服务器
因此修改/usr/local/apisix/dashboard/conf/conf.yaml文件
conf: listen: host: 0.0.0.0 # host: 127.0.0.1 # 仅本机访问 port: 9000 allow_list: - 127.0.0.1 # 仅本机访问 - 192.168.2.0/24 # 允许其他192.168.2网段的其他ip的机器访问,根据实际情况修改
修改后重启服务即可
1.4 安装grafana和prometheus进行监控
这是一个可选配置,不影响正常使用
只是提供了一系列可视化流量监控的功能
我们将会在后面单独写一个文章进行讲解
今天暂时略过
2. 配置和管理
apisix提供了包括一系列管理api,用于将我们的服务配置在网关上
访问前缀为 ip:9080/apisix/admin
但是,大部分功能可以借助dashboard配置完成。
如果通过命令配置,需配合admin的key使用,见config-default.yaml中admin段内容
2.1 名词解释
2.1.1 路由Route
Route通过定义字符串的表达式来匹配客户端的请求,然后根据匹配到的结果决定访问,并可以使用配置的插件,最后把请求转发给到指定 Upstream。
三部分组成: 匹配规则(可以根据请求host、uri等),插件配置(身份认证、限流等,可选项),上游信息
可以简单把他看做nginx里的location
外部请求必须通过route访问服务资源
2.1.2 服务Service
Service 是某类服务的抽象,它通常与upstream是1:1的
Route 与 Service 之间,可以是 N:1 的关系,也可以是1:1的
可以认为,service里包含了一个upstream,并且可以1~n个route指向这个service
外部请求只能通过route访问到service
2.1.3 上游Upstream
Upstream 目的是进行负载均衡,这个思想在nginx里就有了,可以平行部署多个真实的服务,用一个Up命名统称他们。Upstream 的地址信息可以直接配置到 Route(或 Service) 上
可以 route->upstream,也可以 route->service(upstream)
2.1.4 消费者/访问者Consumer
非必要,但是对于 API 网关,可以用这个功能对访问者进行管理
访问者可以辨识,方法有通过请求方的域名、 IP 地址等方式,对访问者进行识别,然后对方的请求可以先进行插件过滤再转发。
通常Consumer 是某个服务的消费者,要达到效果,需要跟用户认证体系配套使用,后面章节有提到各种认证方法。
比如,我们部署在网关的服务
对A类用户和B类用户提供不同的安全和流量策略
就可以通过消费者来配置
2.2 管理api
语法参考官方文档 https://apisix.apache.org/zh/docs/apisix/admin-api/
所有配置都可以通过管理API实现,但有一定学习成本
可通过api进行消费者、路由、服务、上游等查询功能,例如查询消费者
# key在apisix配置文件中,有默认key,使用时请修改 get http://192.168.2.12:9080/apisix/admin/consumers header X-API-KEY : edd1**************************c8f1
如不想学习 (比如我懒),或者学不会,可以看下一节,通过图形化配置。
2.3 通过dashboard管理
通过界面管理更加简易
2.3.1 路由
1.基本步骤: 填写名称,路径,下一步; 手工,填写上游信息,下一步; 选择插件,下一步,保存完成
2.路由使用服务: 填写名称,绑定服务,路径,下一步; 不选择,下一步; 选择插件,下一步,保存完成
3.路由使用上游: 填写名称,路径,下一步; 选择上游,下一步; 选择插件,下一步,保存完成
2.3.2 上游
上游是资源节点的最基层管理单元
基本步骤: 填写名称,目标节点s,保存
2.3.3 服务
1.基本步骤: 填写名称,上游手工,目标节点s,下一步; 选择插件,下一步; 保存完成
2.服务使用上游: 填写名称,选择上游,下一步; 选择插件,下一步; 保存完成
3. 插件
插件可以帮助我们快速实现需要的功能配置,主要包括网络请求,重定向,gzip,realip,各种auth,安全相关,流量管理等等。
大部分插件采用Lua编写,可以自定义插件进行补充。
以下介绍几个常用认证插件.
3.1 jwt插件
可提供验证服务,令符合条件的消费者,通过路由访问服务资源
步骤:
1.创建资源和路由,此时通过路由能正确访问资源
2.创建消费者,启用jwt-auth插件,设置key和secret,默认有效期86400秒
{ "disable": false, "exp": 86400, "key": "mykey", "secret": "mysecret" }
3.修改路由,设置插件jwt-auth启用
"jwt-auth": { "disable": false }
4.此时访问路由会得到错误提示
{"message":"Missing JWT token in request"}
5.调用jwt获取token
get http://192.168.2.12:9080/apisix/plugin/jwt/sign?key=mykey # 返回token内容 eyJhbGjyuwUz****************************************1gsqxW83vfElE3LXCWbr6Vo
6.调用路由时,有3种方式加入token
header加入 Authorization: token param加入 jwt: token cookie加入 jwt: token
7.以上方式加入后,路由请求正常
8.如果有多个消费者和路由要匹配,则在路由处增加consumer-restriction插件
"plugins": { "jwt-auth": {}, "consumer-restriction": { "whitelist": [ "comsumer1" ] } }
3.2 basic认证
1.在消费者中,创建账号和密码
2.配置路由,启用basic插件
3.访问路由时,需在弹窗输入账号密码
3.3 key认证
1.在消费者中创建key
2.配置路由,启用key插件
3.访问路由时,需要在head里传入 apikey: key内容
4.相关启动指令整合
由于整个Apisix由多个部分组成,下面我们把启动命令整合在一起
顺序是:启动etcd,启动apisix,启动dashboard
systemctl start etcd apisix start systemctl start apisix-dashboard
以上就是关于Apisix的一些基本介绍,希望大家都能顺利配置成功。