APISIX-API服务网关

一、简介

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 的原因可能与以下几点有关:
  1. 功能集成与简化
    APISIX 本身提供了强大的 Admin API,用于管理和配置网关。通过 Admin API,用户可以直接操作 APISIX 的路由、插件等配置,而无需依赖 Dashboard。因此,为了简化部署流程,减少不必要的组件依赖,最新版本的 apisix-docker 可能选择移除 Dashboard。
  2. 部署灵活性
    Dashboard 的功能可以通过其他方式实现,例如通过自定义的管理界面或通过命令行工具。移除 Dashboard 后,用户可以根据自己的需求选择是否单独部署 Dashboard,而不是在默认的 Docker 部署中强制包含
  3. 性能与资源优化
    移除 Dashboard 可以减少 Docker 部署中的资源占用,尤其是在资源受限的环境中,用户可能更倾向于轻量化的部署
  4. 版本更新与兼容性
    如果 Dashboard 的版本更新与 APISIX 本身不完全同步,可能会导致兼容性问题。通过移除 Dashboard,用户可以更灵活地选择与 APISIX 兼容的 Dashboard 版本
如果需要使用 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: local
View 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

 

posted @   肖祥  阅读(185)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示