首页 > 其他分享 >APISIX-API服务网关

APISIX-API服务网关

时间:2025-01-23 15:33:32浏览次数:1  
标签:网关 0.0 tcp API APISIX conf web1 docker apisix

一、简介

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

 

标签:网关,0.0,tcp,API,APISIX,conf,web1,docker,apisix
From: https://www.cnblogs.com/xiao987334176/p/18687471

相关文章

  • 国税发票查验-电子发票真伪查验API查验结果示例
    现如今,随着发票在业务场景中的广泛使用与电子发票的不断普及,企业面临的挑战之一是如何确保财务数据的高效与准确。在面对大量的财务发票时,通过传统手动录入与核对发票真伪的方法让财务工作者头疼不已,熬夜加班是财务的常态,且手动核验的方式极易出现人为误差,导致虚假发票进入......
  • C# WebAPI 插件热插拔
    背景WebAPI插件热插拔是指在不重启应用程序的情况下,能够动态地加载、更新或卸载功能模块(即插件)的能力。这种设计模式在软件开发中非常有用,尤其是在需要频繁更新或扩展功能的大型系统中。通过实现插件架构,可以将系统的不同部分解耦,使得它们可以独立开发、测试和部署。对于WebAPI......
  • docker-py:在Python中轻松使用Docker引擎API,更加灵活地管理和使用容器性
    Docker是一种流行的容器技术,让开发者能够在各种环境中快速地构建、部署和管理应用程序。而docker-py是一个强大的Python库,可以让你通过Python代码与Docker引擎API进行互动,实现与Docker命令相同的功能。本文将详细介绍docker-py的安装、使用以及一些常见的操作示例,帮助你更好地利用......
  • 【Java开发】magic-api:一个Java接口快速开发框架
    今天给小伙伴们介绍一个Java接口快速开发框架-magic-api简介magic-api是一个基于Java的接口快速开发框架,编写接口将通过magic-api提供的UI界面完成,自动映射为HTTP接口,无需定义Controller、Service、Dao、Mapper、XML、VO等Java对象即可完成常见的HTTPAPI接口开......
  • 混元API的加密机制与原生集成实战
    今天,我们将重点讨论在对接混元大模型时需要特别关注的几个要点。首先,最为关键的一点是,混元大模型的加密方式相比于其他大模型更为复杂和严密。在对接过程中,我们通常避免使用混元官方提供的SDK进行集成,主要是因为官方SDK的应用场景存在一定的限制。若能实现原生对接,将能够提供更加......
  • asyncAPI
    async.cu#include<stdio.h>#include<cuda_runtime.h>#include<cuda_profiler_api.h>template<typenameT>voidcheck(Tresult,charconst*constfunc,constchar*constfile,intconstline){if(result){......
  • API 设计之禅
    API设计之禅译者按:本文翻译自HowtodesignagoodAPIandwhyitmatters。根据笔者经历,很多大厂程序员所写的代码和大厂内部封装的各种中间件、类库,毫不客气地说,90%都是没有经过仔细考虑的,经常有各种各样的性能、拓展、可读性、一致性等问题。本文总结深刻,建议反复阅读学习......
  • 如何保护 Flask API 的安全性?
    保护FlaskAPI的安全性至关重要,以防止未经授权的访问、数据泄露和恶意攻击。以下是加强FlaskAPI安全性的最佳实践:1.使用身份验证和授权确保API只能被授权用户访问:(1)使用JWT(JSONWebToken)JWT是常见的身份验证机制,可用于身份验证和用户权限控制。安装F......
  • JS-Web API -day04
    一、日期对象1.1实例化日期对象实例化:new关键字获得当前时间        constdata=newDate()获得指定时间        constdata1=newDate('2024-5-108:30:00')     1.2日期对象方法常见的时期对象方法:getFullYear()、getMonth()、g......
  • jenkins-通过api获取所有job及最新build信息
    日常维护的API接口功能:前提:python1.获取所有job:defget_all_jobs(jenkins_url,username,password):url=f"{jenkins_url}/api/json"response=requests.get(url,auth=(username,password))ifresponse.status_code==200:data=response......