一、简介
apisix是一款云原生微服务API网关,可以为API提供终极性能、安全性、开源和可扩展的平台。apisix基于Nginx和etcd实现,与传统API网关相比,apisix具有动态路由和插件热加载,特别适合微服务系统下的API管理。
Apisix 的诞生主要是为了是解决 Nginx 的动态配置问题以及网关功能扩展问题,其基于 Nginx 与 LuaJIT 技术带来的高性能、高灵活等特性打造。
核心概念
我们先来了解下apisix的一些核心概念,对我们接下来的使用会很有帮助!
- 上游(Upstream):可以理解为虚拟主机,对给定的多个目标服务按照配置规则进行负载均衡。
- 路由(Route):通过定义一些规则来匹配客户端的请求,然后对匹配的请求执行配置的插件,并把请求转发给指定的上游。
- 消费者(Consumer):作为API网关,有时需要知道API的消费方具体是谁,通常可以用来做身份认证。
- 服务(Service): 可以理解为一组路由的抽象。它通常与上游是一一对应的,路由与服务之间,通常是多对一的关系。
- 插件(Plugin):API网关对请求的增强操作,可以对请求增加限流、认证、黑名单等一系列功能。可以配置在消费者、服务和路由之上。
二、安装
下载安装文件
由于官方提供了Docker Compose部署方案,只需一个脚本即可安装apisix的相关服务,非常方便,这里我们也采用这种方案来部署。
首先下载apisix-docker项目,其实我们只需要使用其中的example目录就行了,下载地址:https://github.com/apache/apisix-docker
这里直接下载zip文件,得到文件: apisix-docker-master.zip
然后把zip文件上传到linux服务器的/opt目录,进行解压,得到目录/opt/apisix-docker-master
进入/opt/apisix-docker-master/example目录
主要文件如下:
apisix_conf # apisix配置文件目录 docker-compose.yml # docker-compose 部署脚本 etcd_conf # ectd配置文件目录 upstream # 两个测试用的Nginx服务配置
最新版本的docker-compose.yml,启动了5个服务,分别是:apisix,etcd,web1,web2,prometheus,grafana。
其中前2个,是最核心的,web1和web2是测试用的Nginx服务,最后2个是用来展示图表的。
但是这里,缺少一个核心服务apisix-dashboard,从3.6.0版本以后,就去除了apisix-dashboard。至于为什么要去除,原因不明。我从kimi得到的答案如下:
在最新版本的apisix-docker
中移除 apisix-dashboard
的原因可能与以下几点有关:
-
功能集成与简化
APISIX 本身提供了强大的 Admin API,用于管理和配置网关。通过 Admin API,用户可以直接操作 APISIX 的路由、插件等配置,而无需依赖 Dashboard。因此,为了简化部署流程,减少不必要的组件依赖,最新版本的apisix-docker
可能选择移除 Dashboard。 -
部署灵活性
Dashboard 的功能可以通过其他方式实现,例如通过自定义的管理界面或通过命令行工具。移除 Dashboard 后,用户可以根据自己的需求选择是否单独部署 Dashboard,而不是在默认的 Docker 部署中强制包含。 -
性能与资源优化
移除 Dashboard 可以减少 Docker 部署中的资源占用,尤其是在资源受限的环境中,用户可能更倾向于轻量化的部署。 -
版本更新与兼容性
如果 Dashboard 的版本更新与 APISIX 本身不完全同步,可能会导致兼容性问题。通过移除 Dashboard,用户可以更灵活地选择与 APISIX 兼容的 Dashboard 版本。
apisix-dashboard
容器,并通过配置文件将其与 APISIX 连接。
对于新手小白来说,其实是很需要apisix-dashboard,因为他提供了web页面操作,很方便,不需要你去调用api接口来修改配置。
安装apisix-dashboard
下载3.6.0版本的文件,链接如下:https://github.com/apache/apisix-docker/tree/release/apisix-3.6.0
下载zip文件,得到apisix-docker-release-apisix-3.6.0.zip
然后把zip文件上传到linux服务器的/opt目录,进行解压,得到目录/opt/apisix-docker-release-apisix-3.6.0
将3.6.0版本的example/dashboard_conf,拷贝到master分支目录
cp -r /opt/apisix-docker-release-apisix-3.6.0/example/dashboard_conf /opt/apisix-docker-master/example/
创建etcd数据目录,并设置文件权限。注意:如果不设置文件权限,会导致etcd启动失败。
cd /opt/apisix-docker-master/example/
mkdir etcd_data
chmod 777 -R etcd_data
修改master分支的docker-compose.yml文件,增加apisix-dashboard,修改etcd持久化配置。
完整的docker-compose.yml,内容如下:
# # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # version: "3" services: apisix-dashboard: image: apache/apisix-dashboard:3.0.1-alpine restart: always volumes: - ./dashboard_conf/conf.yaml:/usr/local/apisix-dashboard/conf/conf.yaml ports: - "9000:9000" networks: apisix: apisix: image: apache/apisix:${APISIX_IMAGE_TAG:-3.11.0-debian} restart: always volumes: - ./apisix_conf/config.yaml:/usr/local/apisix/conf/config.yaml:ro depends_on: - etcd ##network_mode: host ports: - "9180:9180/tcp" - "9080:9080/tcp" - "9091:9091/tcp" - "9443:9443/tcp" - "9092:9092/tcp" networks: apisix: etcd: image: bitnami/etcd:3.5.11 restart: always volumes: - ./etcd_data:/bitnami/etcd environment: ETCD_ENABLE_V2: "true" ALLOW_NONE_AUTHENTICATION: "yes" ETCD_ADVERTISE_CLIENT_URLS: "http://etcd:2379" ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2379" ports: - "2379:2379/tcp" networks: apisix: web1: image: nginx:1.19.0-alpine restart: always volumes: - ./upstream/web1.conf:/etc/nginx/nginx.conf ports: - "9081:80/tcp" environment: - NGINX_PORT=80 networks: apisix: web2: image: nginx:1.19.0-alpine restart: always volumes: - ./upstream/web2.conf:/etc/nginx/nginx.conf ports: - "9082:80/tcp" environment: - NGINX_PORT=80 networks: apisix: prometheus: image: prom/prometheus:v2.25.0 restart: always volumes: - ./prometheus_conf/prometheus.yml:/etc/prometheus/prometheus.yml ports: - "9090:9090" networks: apisix: grafana: image: grafana/grafana:7.3.7 restart: always ports: - "3000:3000" volumes: - "./grafana_conf/provisioning:/etc/grafana/provisioning" - "./grafana_conf/dashboards:/var/lib/grafana/dashboards" - "./grafana_conf/config/grafana.ini:/etc/grafana/grafana.ini" networks: apisix: networks: apisix: driver: bridge volumes: etcd_data: driver: localView Code
可以看到apisix-dashboard的版本为:3.0.1,其实这个版本也不低,算是最后一个版本了
查看镜像版本,链接地址:https://hub.docker.com/r/apache/apisix-dashboard/tags
可以看到latest版本,最近一次更新是2年前。3.0.1,也是2年前。 也就是说,这就是最后一个版本了,2年都没更新了,后续也不会再更新了。
启动服务
cd /opt/apisix-docker-master/example
docker-compose up -d
查看启动服务状态
# docker-compose ps Name Command State Ports ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- example-apisix-1 /docker-entrypoint.sh dock ... Up 0.0.0.0:9080->9080/tcp,:::9080->9080/tcp, 0.0.0.0:9091->9091/tcp,:::9091->9091/tcp, 0.0.0.0:9092->9092/tcp,:::9092->9092/tcp, 0.0.0.0:9180->9180/tcp,:::9180->9180/tcp, 0.0.0.0:9443->9443/tcp,:::9443->9443/tcp example-apisix-dashboard-1 /usr/local/apisix-dashboar ... Up 0.0.0.0:9000->9000/tcp,:::9000->9000/tcp example-etcd-1 /opt/bitnami/scripts/etcd/ ... Up 0.0.0.0:2379->2379/tcp,:::2379->2379/tcp, 2380/tcp example-grafana-1 /run.sh Up 0.0.0.0:3000->3000/tcp,:::3000->3000/tcp example-prometheus-1 /bin/prometheus --config.f ... Up 0.0.0.0:9090->9090/tcp,:::9090->9090/tcp example-web1-1 /docker-entrypoint.sh ngin ... Up 0.0.0.0:9081->80/tcp,:::9081->80/tcp example-web2-1 /docker-entrypoint.sh ngin ... Up 0.0.0.0:9082->80/tcp,:::9082->80/tcp
可以看到启动了7个服务,确保都是up状态。
三、web页面登录
接下来就可以通过可视化工具来管理apisix了,登录账号密码为admin:admin,访问地址:http://192.168.20.128:9000/
登录之后看下界面,还是挺漂亮的,apisix搭建非常简单
点击仪表盘-->现在配置,输入地址:http://192.168.20.128:3000/
添加完成之后,就可以看到仪表盘了
还有两个测试服务:
web1访问地址:http://192.168.20.128:9081/,访问就看到页面输出:hello web1
web2访问地址:http://192.168.20.128:9082/,访问就看到页面输出:hello web2
四、APISIX使用
apisix作为新一代的网关,不仅支持基本的路由功能,还提供了丰富的插件,功能非常强大。
基本使用:
我们先来体验下apisix的基本功能,之前已经启动了两个Nginx测试服务web1和web2,接下来我们将通过apisix的路由功能来访问它们
上游
首先我们需要创建上游(Upstream),上游相当于虚拟主机的概念,可以对真实的服务提供负载均衡功能;
点击创建
创建web1的上游,设置好名称、负载均衡算法和目标节点信息;
剩下的默认即可,然后就可以创建完成。
再按照上述方法创建web2的上游,创建完成后上游列表显示如下;
路由
创建web1的路由(Route),路由可以用于匹配客户端的请求,然后转发到上游;
点击创建
输入名称web1
输入路径/web1/*
选择好路由的上游为web1
接下来选择需要应用到路由上的插件,apisix的插件非常丰富,多达三十种,作为基本使用,我们暂时不选插件;
再创建web2的路由,创建完成后路由列表显示如下;
接下来我们通过apisix网关访问下
web1服务:http://192.168.20.128:9080/web1/
web2服务:http://192.168.20.128:9080/web2/
进阶使用
限流功能
有时候我们需要对网关进行限流操作,比如每个客户端IP在30秒内只能访问2次接口,可以通过启用limit-count插件来实现。
我们在创建路由的时候可以选择配置limit-count插件;
编辑路由web1,启动插件limit-count
然后对limit-count插件进行配置,根据remote_addr进行限流;
访问web1服务:http://192.168.20.128:9080/web1/
当我们在30秒内第3次调用接口时,apisix会返回503来限制我们的调用。
ip限制
假如我们需要对某个url做ip限制,只允许限定的ip访问,可以使用插件ip-restriction
编辑路由web2,启用插件
启用插件,如果你不知道怎么配置,可以点击文档
会打开一个新的链接:https://apisix.apache.org/docs/apisix/plugins/ip-restriction/
那么根据文档,修改配置
{ "whitelist": [ "127.0.0.1", "113.74.26.106/24" ], "message": "Do you want to do something bad?" }
效果如下:
访问web2服务:http://192.168.20.128:9080/web2/
这里就会出现错误提示了
总结
体验了一把apisix这个全新一代的API网关,有可视化管理的网关果然不一样,简单易用,功能强大!如果你的微服务是云原生的话,可以试着用它来做网关。
其实apisix并不是个小众框架,很多国内外大厂都在使用了,如果你想知道哪些公司在使用,可以参考下面的连接。
https://github.com/apache/apisix/blob/master/powered-by.md
apisix的官方文档非常友好,支持中文,简直是业界良心!过一遍官方文档基本就能掌握apisix了。
官方文档:https://apisix.apache.org/zh/docs/apisix/getting-started
本文参考链接:https://blog.csdn.net/weixin_43064185/article/details/130223907
标签:网关,0.0,tcp,API,APISIX,conf,web1,docker,apisix From: https://www.cnblogs.com/xiao987334176/p/18687471