【APISIX:部署、路由与 Nacos 集成】

提示:本文原创作品,良心制作,干货为主,简洁清晰,一看就会

文章目录

  • 前言
  • 一、APISIX基础知识
    • [1.1 APISIX是什么](#1.1 APISIX是什么)
    • [1.2 APISIX 对比 Gateway](#1.2 APISIX 对比 Gateway)
    • [1.3 APISIX核心组件](#1.3 APISIX核心组件)
  • 二、APISIX部署
    • [2.1 安装etcd](#2.1 安装etcd)
    • [2.2 安装apisix](#2.2 安装apisix)
    • [2.3 搭建中文dashboard](#2.3 搭建中文dashboard)
  • 三、APISIX应用
    • [3.1 基于 APISIX 网关实现 HTTP 请求路由转发](#3.1 基于 APISIX 网关实现 HTTP 请求路由转发)
    • [3.2 APISIX API访问](#3.2 APISIX API访问)
    • [3.3 Apache APISIX集成Nacos实现服务发现](#3.3 Apache APISIX集成Nacos实现服务发现)

前言

在微服务架构日益普及的今天,一个系统往往由数十甚至上百个服务组成。如何统一管理这些服务的对外入口?如何实现路由转发、负载均衡、身份认证、限流熔断等通用能力?API 网关应运而生

Apache APISIX 作为一款云原生的高性能 API 网关,凭借其动态路由、插件化架构以及丰富的生态集成能力,在众多网关中脱颖而出,已成为企业构建微服务架构的热门选择

本文从 APISIX 的基础概念出发,逐步带你完成 etcd、APISIX 及 Dashboard 的部署,并通过 HTTP 请求路由转发集成 Nacos 实现服务发现 两个实战案例,让你从零到一掌握 APISIX 的核心应用,快速落地到实际项目中

一、APISIX基础知识

1.1 APISIX是什么

Apache APISIX 是Apache基金会开源的云原生API网关,基于 Nginx + LuaJIT 开发,采用 DP(数据平面)/CP(控制平面)分离架构

专门做流量入口,处理客户端到后端服务。配置存etcd,配置变更热更新、不用重启网关

核心功能

路由转发:基于域名、路径、请求头、cookie等匹配路由,代理转发到上游服务

丰富插件生态:限流、熔断、多种认证、IP黑白名单、请求改写...

动态配置:路由、插件、上游全部动态修改,不需要重启网关,秒级生效

可观测:原生对接Prometheus、SkyWalking,输出指标、链路追踪、访问日志

...

1.2 APISIX 对比 Gateway

对比项 Apache APISIX Spring Cloud Gateway
技术底层 Nginx+LuaJIT,C实现 Java Reactor Netty,跑在JVM
性能 性能高,资源占用小,适合大流量 一般,受JVM GC影响
配置更新 etcd存储,动态热更新,无需重启 默认需重启;动态配置要二次开发,存在延迟
插件能力 大量内置插件;Lua开发插件,无需打包重编译 基础能力,复杂逻辑需写Java、重新打包
集群管理 DP/CP分离,etcd实现多节点配置自动同步 无原生集群,依赖外部配置中心
协议支持 HTTP/gRPC/Dubbo/TCP/UDP多协议 主打HTTP,其他协议需二次开发
运维控制台 新版自带Dashboard可视化管理 无官方UI,需要自建

对外大流量入口网关、K8s、多语言业务 → APISIX优先

纯SpringCloud微服务,内部网关,希望全部Java开发 → Spring Cloud Gateway

1.3 APISIX核心组件

Apache APISIX云原生网关采用数据平面DP与控制平面CP分离架构,流量转发和配置管理解耦

DP数据平面:处理真实业务流量,执行网关插件、转发请求,是性能核心,不管理配置

CP控制平面:只做配置管理,不处理业务流量;运维通过Dashboard页面或Manager API操作,配置存入etcd集群(保存路由、插件、上游等全部配置);DP节点监听etcd,配置变更实现热更新,无需重启网关

完整数据流

1,运维人员在Dashboard页面配置路由/限流/认证规则

2,配置写入etcd集群持久保存

3,所有APISIX数据平面节点监听etcd,实时拉取最新配置,热加载生效,无需重启

4,用户请求进来,APISIX执行插件逻辑,转发到后端服务

5,同时输出监控、链路数据给SkyWalking/Prometheus/Grafana

APISIX 3.13 版本开始,Dashboard 前端 UI 已经内嵌进 APISIX 主程序,不再需要单独部署 apisix‑dashboard 独立容器 / 服务

二、APISIX部署

主机名 IP地址 作用说明
etcd 192.168.13.138 部署etcd存储、APISIX‑Dashboard;通过Dashboard配置网关路由规则
apisix 192.168.13.143 APISIX网关节点,处理真实业务流量

2.1 安装etcd

etcd下载:https://github.com/etcd-io/etcd/releases/

我这里只部署了一台etcd,有条件的可以部署etcd集群

yaml 复制代码
## 1. 安装tar包
root@etcd:~# wget https://github.com/etcd-io/etcd/releases/download/v3.6.13/etcd-v3.6.13-linux-amd64.tar.gz
root@etcd:~# tar xf etcd-v3.6.13-linux-amd64.tar.gz -C /usr/local/
root@etcd:~# cp /usr/local/etcd-v3.6.13-linux-amd64/etcd /usr/local/bin/
root@etcd:~# cp /usr/local/etcd-v3.6.13-linux-amd64/etcdctl /usr/local/bin/
root@etcd:~# etcd --version
etcd Version: 3.6.13
Git SHA: b0f9ef1
Go Version: go1.25.11
Go OS/Arch: linux/amd64

## 2. 由于我的etcd和apisix不在一台机器上,所以etcd要运行远程连接
root@etcd:~# mkdir -p /etc/etcd
root@etcd:~# vim /etc/etcd/etcd.conf.yml 
name: default
data-dir: /var/lib/etcd/default.etcd
listen-client-urls: http://0.0.0.0:2379
advertise-client-urls: http://192.168.13.138:2379
listen-peer-urls: http://0.0.0.0:2380
advertise-peer-urls: http://192.168.13.138:2380
initial-cluster: default=http://192.168.13.138:2380   
initial-cluster-state: new
initial-cluster-token: etcd-cluster

## 3. 配置 systemd 系统启动服务
root@etcd:~# vim /lib/systemd/system/etcd.service
[Unit]
Description=etcd key-value store
Documentation=https://etcd.io/docs
After=network.target

[Service]
Type=notify
ExecStart=/usr/local/bin/etcd --config-file /etc/etcd/etcd.conf.yml
Restart=always
RestartSec=10
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

## 4. 启动etcd
root@etcd:~# systemctl daemon-reload
root@etcd:~# systemctl enable --now etcd

2.2 安装apisix

apisix下载:https://apisix.apache.org/zh/docs/apisix/installation-guide/

该页面提供了各操作系统对应的安装教程,请选择与自身操作系统匹配的教程进行操作

yaml 复制代码
## 1. 下载apisix
root@apisix:~# wget -O - http://repos.apiseven.com/pubkey.gpg | sudo apt-key add -
root@apisix:~# echo "deb http://repos.apiseven.com/packages/debian bullseye main" | sudo tee /etc/apt/sources.list.d/apisix.list
root@apisix:~# apt update && apt -a list apisix
root@apisix:~# apt install -y apisix=3.15.0-0

## 2. 修改配置文件
root@apisix:~# cp /usr/local/apisix/conf/config.yaml .
root@apisix:~# vim /usr/local/apisix/conf/config.yaml  # 只保留以下几行
deployment:
  role: traditional
  role_traditional:
    config_provider: etcd
  etcd:
    # etcd客户端连接地址,端口2379
    host:
      - http://192.168.13.138:2379
  # Admin API管理接口配置(9180端口)
  admin:
    # admin接口访问密钥,可以配置多个密钥,不同角色权限不同
    admin_key:
      - name: admin       # 密钥名称标识
        key: edd1c9f034335f136f87ad84b625c8f1  # admin接口请求携带的X‑API‑KEY密钥,随机生成一串即可
        role: admin       # 角色admin拥有全部读写权限
    # 开启内置Admin UI可视化管理页面
    enable_admin_ui: true
    # 允许访问admin接口的IP网段白名单,不在列表的IP禁止调用admin接口
    allow_admin:
      - 127.0.0.0/24      # 本机回环网段
      - 192.168.13.0/24   # 实验内网网段,内网机器可以调用admin接口

## 3. 初始化
root@apisix:~# apisix init

## 4. 配置文件格式检查
root@apisix:~# apisix test

## 5. 启动apisix
root@apisix:~# systemctl start apisix.service 

## 6. 测试能否连接etcd
root@apisix:~# curl http://192.168.13.138:2379/version
{"etcdserver":"3.6.13","etcdcluster":"3.6.0","storage":"3.6.0"}

## 7. 调用 APISIX Admin API,查询获取全部已经创建的路由列表,目前为空
root@apisix:~# curl http://127.0.0.1:9180/apisix/admin/routes?api_key=edd1c9f034335f136f87ad84b625c8f1 -i

其他设备也可以查看apisix的路由配置列表,是由于在allow_admin下配置了192.168.13.0/24

浏览器访问apisix ip:9180/ui,apisix3.13之后就自带英文dashboard

2.3 搭建中文dashboard

由于apisix自带的dashboard暂不支持中文,所以我这里自己搭建一个中文dashboard

渡渡鸟镜像同步站:https://docker.aityp.com/

可以去渡渡鸟上拉取apisix-dashboard

yaml 复制代码
## 1. 拉取apisix-dashboard镜像
root@etcd:~# docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/bitnami/apisix-dashboard:3.0.1-debian-12-r76
root@etcd:~# docker tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/bitnami/apisix-dashboard:3.0.1-debian-12-r76  docker.io/bitnami/apisix-dashboard:3.0.1-debian-12-r76

## 2. 运行apisix-dashboard并使用宿主机网络,这样可以连接到etcd
root@etcd:~# docker run -d --network host --name apisix-dashboard bitnami/apisix-dashboard:3.0.1-debian-12-r76
root@etcd:~# docker exec -it apisix-dashboard /bin/bash
apisix-dashboard@etcd:/opt/bitnami/apisix-dashboard$ ls conf/
conf.yaml  customize_schema.json  schema.json

## 3. 默认不允许远程访问apix dashboard,只允许本地127.0.0.1访问
root@etcd:~# docker cp apisix-dashboard:/opt/bitnami/apisix-dashboard/conf/conf.yaml .
root@etcd:~# ls
conf.yaml
root@etcd:~# vim conf.yaml
yaml 复制代码
## 4. 重新运维dashboard并映射配置文件
root@etcd:~# docker stop apisix-dashboard 
root@etcd:~# docker rm apisix-dashboard 
root@etcd:~# docker run -d --network host --name apisix-dashboard -v /root/conf.yaml:/opt/bitnami/apisix-dashboard/conf/conf.yaml bitnami/apisix-dashboard:3.0.1-debian-12-r76 
root@etcd:~# netstat -tnlp

浏览器访问:http://192.168.13.138:9000,进去就是中文dashboard

三、APISIX应用

3.1 基于 APISIX 网关实现 HTTP 请求路由转发

主机名 IP地址 作用说明
etcd 192.168.13.138 部署etcd存储、APISIX‑Dashboard;通过Dashboard配置网关路由规则
client 192.168.13.139 客户端测试机器,发起访问请求
ubuntu 192.168.13.141 部署httpbin测试服务,作为后端目标服务
apisix 192.168.13.143 APISIX网关节点;接收 www.test.com/anything 请求,转发至后端192.168.13.141

注:http://httpbin.org开源免费的 HTTP 测试服务网站,专门用来调试、测试 HTTP 请求,相当于一个 "镜子服务器":你发什么请求给它,它就把收到的全部信息(请求头、参数、IP、body)以 JSON 返回给你

整个请求的流转逻辑

Client (139) curl -H "Host: www.test.com" http://192.168.13.143:9080/anything

↓ (根据 Host 头匹配路由)

APISIX 网关 (143) 查询 etcd 中的配置,匹配到 upstream 指向 192.168.13.141

↓ (反向代理)

httpbin 后端 (141) 接收请求,处理 /anything,返回请求详情

↓ (响应原路返回)

Client (139) 收到 httpbin 返回的 JSON 数据

yaml 复制代码
## 1. 运行httpbin容器,就有了http://httpbin.org的效果
root@ubuntu:~# docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/mccutchen/go-httpbin:v2.6.0
root@ubuntu:~# docker tag  swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/mccutchen/go-httpbin:v2.6.0  docker.io/mccutchen/go-httpbin:v2.6.0
root@ubuntu:~# docker run --name httpbin -d -p 80:8080 mccutchen/go-httpbin:v2.6.0

## 2. 访问"https://httpbin.org/anything/nihao会返回json
root@ubuntu:~# curl http://127.0.0.1:80/anything/nihao
  1. 客户端访问httpbin会返回json
  1. apisix配置路由转发,如果接收 www.test.com/anything 请求,转发至后端192.168.13.141
  1. 客户端访问apisix就会进行路由转发
yaml 复制代码
root@client:~# curl -XGET -H"host: www.test.com" http://192.168.13.143:9080/anything/tom
yaml 复制代码
## 如果访问其它路径就报错
root@client:~# curl -XGET -H"host: www.test.com" http://192.168.13.143:9080/other/alice
{"error_msg":"404 Route Not Found"}

3.2 APISIX API访问

APISIX通过端口9108/TCP提供API访问,我们可以利用API直接配置路由规则

yaml 复制代码
root@client:~# curl "https://httpbin.org/get?name=jack"

在apisix上直接用API配置路由规则,通过 Admin API 创建 ID 为 1 的路由;仅匹配 Host 为www.test2.com、GET 方法、路径/get的请求;采用轮询负载均衡,将请求转发至后端节点192.168.13.141:80

yaml 复制代码
root@apisix:~# curl http://127.0.0.1:9180/apisix/admin/routes/1 \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d '
{
    "name": "httpbin-test2",
    "methods": ["GET"],
    "hosts": ["www.test2.com"],
    "uri": "/get",
    "upstream": {
        "type": "roundrobin",
        "nodes": {
            "192.168.13.141:80": 1
        }
    }
}'

上述命令执行后,会直接在dashboard上刷新出路由规则

yaml 复制代码
root@client:~# curl -XGET -H"host: www.test2.com" http://192.168.13.143:9080/get?name=jack

3.3 Apache APISIX集成Nacos实现服务发现

实验目的:搭建Nacos注册中心,实现生产者、消费者服务注册与调用;同时配置APISIX网关,对外暴露统一路由,将指定请求转发至消费者服务,验证服务发现与网关代理能力

主机名 IP地址 作用说明
etcd 192.168.13.138 部署etcd存储、APISIX‑Dashboard;可视化配置网关路由规则
client 192.168.13.139 客户端测试机器,用于发起访问请求
nacos 192.168.13.140 Nacos服务注册中心,完成服务注册与服务发现
producer 192.168.13.141 服务生产者,提供 /hello 网页接口服务,注册到Nacos
consumer 192.168.13.142 服务消费者;访问 /call 接口,通过Nacos服务发现调用producer提供的接口
apisix 192.168.13.143 APISIX网关节点;请求访问 /jack 时,转发至后端 192.168.13.142/call

目前我的消费者和生产者都已经注册到nacos上了

yaml 复制代码
## 访问生产者
root@client:~# curl 192.168.13.141:8080/hello
Hello ! I am producer ! 请求通过了!

## 访问消费者的/call会调用生产者程序
root@client:~# curl 192.168.13.142:8080/call
Hello ! I am producer ! 请求通过了!

修改apisix配置,添加nacos地址,然后重启apisix

yaml 复制代码
root@apisix:~# vim /usr/local/apisix/conf/config.yaml
discovery:
  nacos:
    host:
      - "http://192.168.13.140:8848"

在apisix中创建路由转发,调用 apisix admin api 创建 ID 为 2 的路由

匹配 Host 为www.jack.org、GET 请求、路径/call;启用 Nacos 服务发现,从 Nacos 获取consumer‑web服务实例,轮询转发请求,并透传客户端 Host 头部给后端微服务

yaml 复制代码
root@apisix:~# curl http://127.0.0.1:9180/apisix/admin/routes/2 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '{
    "uri": "/call",
    "name": "apisix-java",
    "methods": ["GET"],
    "hosts": ["www.jack.org"],
    "upstream": {
        "type": "roundrobin",
        "scheme": "http",
        "discovery_type": "nacos",
        "pass_host": "pass",
        "service_name": "consumer-web"
    }
}'

可以看到dashboard中自动刷新出路由规则

模拟客户端访问

yaml 复制代码
root@client:~# curl -H "Host:www.jack.org" http://192.168.13.143:9080/call
Hello ! I am producer ! 请求通过了!

至此,我们就实现了 APISIX 网关的路由转发。配合 Nacos 服务发现,网关不再写死后端节点 IP,能够自动感知微服务实例的新增、下线,动态获取可用服务实例并做负载均衡转发,在微服务架构中至关重要。客户端只访问 APISIX 网关入口,由网关完成服务寻址和流量分发,实现了请求统一接入,降低客户端与后端服务的耦合度

注:

文中若有疏漏,欢迎大家指正赐教。

本文为100%原创,转载请务必标注原创作者,尊重劳动成果。

求赞、求关注、求评论!你的支持是我更新的最大动力,评论区等你~

相关推荐
易番番ERP1 天前
品牌代理商SKU繁多,ERP如何高效处理新旧规格替换?
数据库·微服务·云原生·sku·易番番erp
成为你的宁宁2 天前
【运维读懂 Spring Cloud Gateway】
gateway·api网关
星期一研究室2 天前
AI 生成一堆素材后,怎么整理成好找又好用的视觉资产库?
微服务·产品·设计
二十雨辰2 天前
[Java]-微服务面试题
java·开发语言·微服务
hopsky3 天前
apisix 高性能利用worker方案
apisix
vHelios3 天前
【电商项目】商品搜索开发复盘(1):根据需求拆解搜索接口的设计逻辑
java·微服务·es
老郑聊AI业财智造3 天前
TOGAF、DDD与微服务:软件架构的多维透视
spring boot·spring cloud·微服务·金融·架构·软件工程·制造
Raas1003 天前
MAI Gateway(魔芋企业级AI网关):企业AI网关的合规审计与调用留痕设计
大数据·人工智能·gateway·企业·api网关·mai gateway·企业级网关
linweidong3 天前
钉钉Java面经及参考答案
nacos·协程·垃圾收集器·jvm调优·spring ioc·脏读·mysql索引