尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

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

【APISIX:部署、路由与 Nacos 集成】 提示本文原创作品良心制作干货为主简洁清晰一看就会文章目录前言一、APISIX基础知识1.1 APISIX是什么1.2 APISIX 对比 Gateway1.3 APISIX核心组件二、APISIX部署2.1 安装etcd2.2 安装apisix2.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 APISIXSpring Cloud Gateway技术底层NginxLuaJITC实现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 Gateway1.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/GrafanaAPISIX 3.13 版本开始Dashboard 前端 UI 已经内嵌进 APISIX 主程序不再需要单独部署 apisix‑dashboard 独立容器 / 服务二、APISIX部署主机名IP地址作用说明etcd192.168.13.138部署etcd存储、APISIX‑Dashboard通过Dashboard配置网关路由规则apisix192.168.13.143APISIX网关节点处理真实业务流量2.1 安装etcdetcd下载https://github.com/etcd-io/etcd/releases/我这里只部署了一台etcd有条件的可以部署etcd集群## 1. 安装tar包rootetcd:~# wget https://github.com/etcd-io/etcd/releases/download/v3.6.13/etcd-v3.6.13-linux-amd64.tar.gzrootetcd:~# tar xf etcd-v3.6.13-linux-amd64.tar.gz -C /usr/local/rootetcd:~# cp /usr/local/etcd-v3.6.13-linux-amd64/etcd /usr/local/bin/rootetcd:~# cp /usr/local/etcd-v3.6.13-linux-amd64/etcdctl /usr/local/bin/rootetcd:~# etcd --versionetcd Version:3.6.13Git SHA:b0f9ef1Go Version:go1.25.11Go OS/Arch:linux/amd64## 2. 由于我的etcd和apisix不在一台机器上所以etcd要运行远程连接rootetcd:~# mkdir -p /etc/etcdrootetcd:~# 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:defaulthttp://192.168.13.138:2380initial-cluster-state:newinitial-cluster-token:etcd-cluster## 3. 配置 systemd 系统启动服务rootetcd:~# vim /lib/systemd/system/etcd.service[Unit]Descriptionetcd key-value store Documentationhttps://etcd.io/docs Afternetwork.target[Service]Typenotify ExecStart/usr/local/bin/etcd--config-file /etc/etcd/etcd.conf.yml Restartalways RestartSec10 LimitNOFILE65536[Install]WantedBymulti-user.target## 4. 启动etcdrootetcd:~# systemctl daemon-reloadrootetcd:~# systemctl enable --now etcd2.2 安装apisixapisix下载https://apisix.apache.org/zh/docs/apisix/installation-guide/该页面提供了各操作系统对应的安装教程请选择与自身操作系统匹配的教程进行操作## 1. 下载apisixrootapisix:~# wget -O - http://repos.apiseven.com/pubkey.gpg | sudo apt-key add -rootapisix:~# echo deb http://repos.apiseven.com/packages/debian bullseye main | sudo tee /etc/apt/sources.list.d/apisix.listrootapisix:~# apt update apt -a list apisixrootapisix:~# apt install -y apisix3.15.0-0## 2. 修改配置文件rootapisix:~# cp /usr/local/apisix/conf/config.yaml .rootapisix:~# 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. 初始化rootapisix:~# apisix init## 4. 配置文件格式检查rootapisix:~# apisix test## 5. 启动apisixrootapisix:~# systemctl start apisix.service## 6. 测试能否连接etcdrootapisix:~# curl http://192.168.13.138:2379/version{etcdserver:3.6.13,etcdcluster:3.6.0,storage:3.6.0}## 7. 调用 APISIX Admin API查询获取全部已经创建的路由列表目前为空rootapisix:~# curl http://127.0.0.1:9180/apisix/admin/routes?api_keyedd1c9f034335f136f87ad84b625c8f1 -i其他设备也可以查看apisix的路由配置列表是由于在allow_admin下配置了192.168.13.0/24浏览器访问apisix ip:9180/uiapisix3.13之后就自带英文dashboard2.3 搭建中文dashboard由于apisix自带的dashboard暂不支持中文所以我这里自己搭建一个中文dashboard渡渡鸟镜像同步站https://docker.aityp.com/可以去渡渡鸟上拉取apisix-dashboard## 1. 拉取apisix-dashboard镜像rootetcd:~# docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/bitnami/apisix-dashboard:3.0.1-debian-12-r76rootetcd:~# 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并使用宿主机网络这样可以连接到etcdrootetcd:~# docker run -d --network host --name apisix-dashboard bitnami/apisix-dashboard:3.0.1-debian-12-r76rootetcd:~# docker exec -it apisix-dashboard /bin/bashapisix-dashboardetcd:/opt/bitnami/apisix-dashboard$ ls conf/ conf.yaml customize_schema.json schema.json## 3. 默认不允许远程访问apix dashboard,只允许本地127.0.0.1访问rootetcd:~# docker cp apisix-dashboard:/opt/bitnami/apisix-dashboard/conf/conf.yaml .rootetcd:~# lsconf.yaml rootetcd:~# vim conf.yaml## 4. 重新运维dashboard并映射配置文件rootetcd:~# docker stop apisix-dashboardrootetcd:~# docker rm apisix-dashboardrootetcd:~# 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-r76rootetcd:~# netstat -tnlp浏览器访问http://192.168.13.138:9000进去就是中文dashboard三、APISIX应用3.1 基于 APISIX 网关实现 HTTP 请求路由转发主机名IP地址作用说明etcd192.168.13.138部署etcd存储、APISIX‑Dashboard通过Dashboard配置网关路由规则client192.168.13.139客户端测试机器发起访问请求ubuntu192.168.13.141部署httpbin测试服务作为后端目标服务apisix192.168.13.143APISIX网关节点接收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的效果rootubuntu:~# docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/mccutchen/go-httpbin:v2.6.0rootubuntu:~# 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.0rootubuntu:~# docker run --name httpbin -d -p 80:8080 mccutchen/go-httpbin:v2.6.0## 2. 访问https://httpbin.org/anything/nihao会返回jsonrootubuntu:~# curl http://127.0.0.1:80/anything/nihao客户端访问httpbin会返回jsonapisix配置路由转发如果接收www.test.com/anything请求转发至后端192.168.13.141客户端访问apisix就会进行路由转发rootclient:~# curl -XGET -Hhost: www.test.com http://192.168.13.143:9080/anything/tom## 如果访问其它路径就报错rootclient:~# curl -XGET -Hhost: 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直接配置路由规则rootclient:~# curl https://httpbin.org/get?namejack在apisix上直接用API配置路由规则通过 Admin API 创建 ID 为 1 的路由仅匹配 Host 为www.test2.com、GET 方法、路径/get的请求采用轮询负载均衡将请求转发至后端节点192.168.13.141:80rootapisix:~# 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上刷新出路由规则rootclient:~# curl -XGET -Hhost: www.test2.com http://192.168.13.143:9080/get?namejack3.3 Apache APISIX集成Nacos实现服务发现实验目的搭建Nacos注册中心实现生产者、消费者服务注册与调用同时配置APISIX网关对外暴露统一路由将指定请求转发至消费者服务验证服务发现与网关代理能力主机名IP地址作用说明etcd192.168.13.138部署etcd存储、APISIX‑Dashboard可视化配置网关路由规则client192.168.13.139客户端测试机器用于发起访问请求nacos192.168.13.140Nacos服务注册中心完成服务注册与服务发现producer192.168.13.141服务生产者提供/hello网页接口服务注册到Nacosconsumer192.168.13.142服务消费者访问/call接口通过Nacos服务发现调用producer提供的接口apisix192.168.13.143APISIX网关节点请求访问/jack时转发至后端192.168.13.142/call目前我的消费者和生产者都已经注册到nacos上了## 访问生产者rootclient:~# curl 192.168.13.141:8080/helloHello!I am producer!请求通过了!## 访问消费者的/call会调用生产者程序rootclient:~# curl 192.168.13.142:8080/callHello!I am producer!请求通过了!修改apisix配置添加nacos地址然后重启apisixrootapisix:~# 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 头部给后端微服务rootapisix:~# 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中自动刷新出路由规则模拟客户端访问rootclient:~# curl -H Host:www.jack.org http://192.168.13.143:9080/callHello!I am producer!请求通过了!至此我们就实现了 APISIX 网关的路由转发。配合 Nacos 服务发现网关不再写死后端节点 IP能够自动感知微服务实例的新增、下线动态获取可用服务实例并做负载均衡转发在微服务架构中至关重要。客户端只访问 APISIX 网关入口由网关完成服务寻址和流量分发实现了请求统一接入降低客户端与后端服务的耦合度注文中若有疏漏欢迎大家指正赐教。本文为100%原创转载请务必标注原创作者尊重劳动成果。求赞、求关注、求评论你的支持是我更新的最大动力评论区等你
返回列表