没我的允许别想让我服务

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

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的一些基本介绍,希望大家都能顺利配置成功。

相关文章
|
druid 关系型数据库 MySQL
【数据库】数据库连接池配置 testOnBorrow
【数据库】数据库连接池配置 testOnBorrow
1185 0
|
安全 数据建模 网络安全
什么是泛域名证书
什么是泛域名证书
2668 0
|
网络协议 安全 网络安全
【UDP】——为什么 UDP 数据包不能超过 512 个字节
一开始了解的是 DNS 服务使用的是 UDP 协议,后面看到 DNS 服务主要使用 UDP 协议,在少数情况(传输的数据超过 512 个字节)下也会使用 TCP 协议,因为 UDP 数据包不能超过 512 个字节。那问题来了,为什么 UDP 数据包不能超过 512 个字节呢?
4331 0
【UDP】——为什么 UDP 数据包不能超过 512 个字节
|
Ubuntu Linux iOS开发
问题./configure: error: the HTTP gzip module requires the zlib library.处理
问题./configure: error: the HTTP gzip module requires the zlib library.处理
1940 6
|
4月前
|
安全 Java 测试技术
说一说 Spring Security 中的单元测试
我是小假 期待与你的下一次相遇 ~
|
网络安全 网络架构
Nmap扫描六种端口状态介绍
Nmap扫描六种端口状态介绍
697 2
|
12月前
|
关系型数据库 数据库 PostgreSQL
在docker上部署postgresSQL主从
通过以上步骤,我们完成了在Docker环境中部署PostgreSQL主从复制的基本配置。请注意,实际生产环境中还需考虑安全性增强(如SSL加密)、监控、自动故障切换等高级配置。此外,根据具体的业务需求和规模,可能还需要考虑使用更专业的解决方案或工具,如Patroni、PgBouncer等,来进一步提升数据库集群的稳定性和效率。
768 0
|
druid Java 数据库连接
MyBatis初级实战之四:druid多数据源
完整的springboot+mybatis+druid多数据源开发和验证
4709 4
MyBatis初级实战之四:druid多数据源
|
XML JSON 前端开发
网络要素服务(WFS)详解
网络要素服务(WFS)详解
269 0