提示:本文原创作品,良心制作,干货为主,简洁清晰,一看就会
文章目录
- 前言
- 一、APISIX基础知识
- 1.1 APISIX是什么
- 1.2 APISIX 对比 Gateway
- 1.3 APISIX核心组件
- 二、APISIX部署
- 2.1 安装etcd
- 2.2 安装apisix
- 2.3 搭建中文dashboard
- 三、APISIX应用
- 3.1 基于 APISIX 网关实现 HTTP 请求路由转发
- 3.2 APISIX API访问
- 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集群
## 1. 安装tar包root@etcd:~# wget https://github.com/etcd-io/etcd/releases/download/v3.6.13/etcd-v3.6.13-linux-amd64.tar.gzroot@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 --versionetcd Version:3.6.13Git SHA:b0f9ef1Go Version:go1.25.11Go OS/Arch:linux/amd64## 2. 由于我的etcd和apisix不在一台机器上,所以etcd要运行远程连接root@etcd:~# mkdir -p /etc/etcdroot@etcd:~# vim /etc/etcd/etcd.conf.ymlname:defaultdata-dir:/var/lib/etcd/default.etcdlisten-client-urls:http://0.0.0.0:2379advertise-client-urls:http://192.168.13.138:2379listen-peer-urls:http://0.0.0.0:2380advertise-peer-urls:http://192.168.13.138:2380initial-cluster:default=http://192.168.13.138:2380initial-cluster-state:newinitial-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. 启动etcdroot@etcd:~# systemctl daemon-reloadroot@etcd:~# systemctl enable --now etcd2.2 安装apisix
apisix下载:https://apisix.apache.org/zh/docs/apisix/installation-guide/
该页面提供了各操作系统对应的安装教程,请选择与自身操作系统匹配的教程进行操作
## 1. 下载apisixroot@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.listroot@apisix:~# apt update && apt -a list apisixroot@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:traditionalrole_traditional:config_provider:etcdetcd:# etcd客户端连接地址,端口2379host:-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. 启动apisixroot@apisix:~# systemctl start apisix.service## 6. 测试能否连接etcdroot@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
## 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-r76root@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并使用宿主机网络,这样可以连接到etcdroot@etcd:~# docker run -d --network host --name apisix-dashboard bitnami/apisix-dashboard:3.0.1-debian-12-r76root@etcd:~# docker exec -it apisix-dashboard /bin/bashapisix-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:~# lsconf.yaml root@etcd:~# vim conf.yaml## 4. 重新运维dashboard并映射配置文件root@etcd:~# docker stop apisix-dashboardroot@etcd:~# docker rm apisix-dashboardroot@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-r76root@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 数据
## 1. 运行httpbin容器,就有了http://httpbin.org的效果root@ubuntu:~# docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/mccutchen/go-httpbin:v2.6.0root@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.0root@ubuntu:~# docker run --name httpbin -d -p 80:8080 mccutchen/go-httpbin:v2.6.0## 2. 访问"https://httpbin.org/anything/nihao会返回jsonroot@ubuntu:~# curl http://127.0.0.1:80/anything/nihao- 客户端访问httpbin会返回json
- apisix配置路由转发,如果接收
www.test.com/anything请求,转发至后端192.168.13.141
- 客户端访问apisix就会进行路由转发
root@client:~# curl -XGET -H"host: www.test.com" http://192.168.13.143:9080/anything/tom## 如果访问其它路径就报错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直接配置路由规则
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
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上刷新出路由规则
root@client:~# curl -XGET -H"host: www.test2.com" http://192.168.13.143:9080/get?name=jack3.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上了
## 访问生产者root@client:~# curl 192.168.13.141:8080/helloHello!I am producer!请求通过了!## 访问消费者的/call会调用生产者程序root@client:~# curl 192.168.13.142:8080/callHello!I am producer!请求通过了!修改apisix配置,添加nacos地址,然后重启apisix
root@apisix:~# vim /usr/local/apisix/conf/config.yamldiscovery: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 头部给后端微服务
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中自动刷新出路由规则
模拟客户端访问
root@client:~# curl -H "Host:www.jack.org" http://192.168.13.143:9080/callHello!I am producer!请求通过了!至此,我们就实现了 APISIX 网关的路由转发。配合 Nacos 服务发现,网关不再写死后端节点 IP,能够自动感知微服务实例的新增、下线,动态获取可用服务实例并做负载均衡转发,在微服务架构中至关重要。客户端只访问 APISIX 网关入口,由网关完成服务寻址和流量分发,实现了请求统一接入,降低客户端与后端服务的耦合度
注:
文中若有疏漏,欢迎大家指正赐教。
本文为100%原创,转载请务必标注原创作者,尊重劳动成果。
求赞、求关注、求评论!你的支持是我更新的最大动力,评论区等你~