没我的允许别想让我服务

简介: 没我的允许别想让我服务

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. 安装

安装步骤包括以下内容

  1. OpenResty
  2. etcd
  3. apisix
  4. 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。

三部分组成: 匹配规则(可以根据请求hosturi等),插件配置(身份认证、限流等,可选项),上游信息

可以简单把他看做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的一些基本介绍,希望大家都能顺利配置成功。

相关文章
|
9月前
|
缓存 运维 安全
【干货】桌面运维当中,我最常见遇到的几个问题!
作为体制内单位的信息化部门,不管大小事凡是涉及到信息化相关的都会来找我们,平常碰到最多的当然是电脑使用方面的了,比如什么C盘满了让我们帮忙清一下,电脑太慢了让我们帮忙看看啥的,一般新来的小伙子们就会被分配去干这些事情,但是由于在大学或者研究生阶段若非兴趣使然其实很难去了解计算机的一些基础运维知识,这里我也整理了自己常用的一些命令和技巧,帮助小伙伴快速入门。这篇文章主要是针对Windows操作系统而言的,因为目前大部分还依然使用的是Windows操作系统哈
【干货】桌面运维当中,我最常见遇到的几个问题!
|
9月前
|
资源调度 监控 API
开源API网关APISIX分析与使用
开源API网关APISIX分析与使用
550 0
|
druid 关系型数据库 MySQL
【数据库】数据库连接池配置 testOnBorrow
【数据库】数据库连接池配置 testOnBorrow
798 0
|
8月前
|
JavaScript Java Go
Nacos vs. Eureka:微服务注册中心的对比
Nacos vs. Eureka:微服务注册中心的对比
545 0
|
9月前
|
调度 数据安全/隐私保护 Docker
docker启动xxl-job-admin
docker启动xxl-job-admin
232 0
|
9月前
|
JavaScript
【vue】 vue2 实现飘窗效果
【vue】 vue2 实现飘窗效果
183 1
|
9月前
|
存储 Java
模式匹配魔法:Java 21中switch语句的巨大进化
模式匹配魔法:Java 21中switch语句的巨大进化
182 0
|
9月前
|
JavaScript
vue element upload组件配合axios实现用 “Content-Type“: “multipart/form-data“上传方式导入xls文件
vue element upload组件配合axios实现用 “Content-Type“: “multipart/form-data“上传方式导入xls文件
|
9月前
|
JSON JavaScript 前端开发
Mr_HJ / form-generator项目文档学习与记录
Mr_HJ / form-generator项目文档学习与记录
165 0
|
9月前
|
缓存 安全 应用服务中间件
开源API网关APISIX源码分析(二)
开源API网关APISIX源码分析(二)
339 0