SpringCloud 微服务架构实战:Nacos + Gateway + Feign 全链路拆解(含单体双模式)

📅 2026/7/16 11:00:38
SpringCloud 微服务架构实战:Nacos + Gateway + Feign 全链路拆解(含单体双模式)
SpringCloud 微服务架构实战Nacos Gateway Feign 全链路拆解含单体双模式演示地址http://ruoyioffice.com | 源码1·GitHubruoyi-office | 源码2·GitCoderuoyi-office | 源码3·Giteeruoyi-office | 微信17156169080备注「RuoYi Office」微服务这三个字听着高大上落地却处处是坑服务怎么注册、配置怎么集中管、网关怎么路由、服务间怎么调用、登录态和租户信息怎么透传……更现实的是很多中小团队其实并不需要一上来就拆微服务。本文基于 RuoYi Office 真实源码Spring Boot 3.5 Spring Cloud 2025 Spring Cloud Alibaba拆解一套 Nacos Gateway Feign 的微服务全链路并讲清它最妙的设计——一套代码单体和微服务两种模式自由切换。*▲ 微服务全景客户端 → Gateway统一入口/grayLb 灰度→ 各-server 服务注册 Nacos服务间走 Feign /rpc-api 直连配置走 Nacos 配置中心路由可热刷新引言微服务到底难在哪微服务的复杂度是从一个进程变成一堆进程要协同开始的。几个绕不开的痛点痛点一服务发现。服务实例动态上下线调用方怎么知道对方在哪痛点二配置散乱。十几个服务各有一套配置文件改个数据库地址要改十几处。痛点三统一入口。客户端不可能记住每个服务的地址需要一个网关统一对外。痛点四上下文透传。登录用户、租户 ID 在服务间调用时怎么传下去痛点五要不要拆。很多团队盲目上微服务结果运维成本暴涨、收益寥寥。现状后果硬编码服务地址实例变更就崩配置分散改一处要改十几遍无统一网关客户端要记一堆地址上下文丢失服务间调用丢登录态方案一句话Nacos 管注册和配置Gateway 管入口和路由Feign 管内部调用并透传上下文且支持单体/微服务双模式。一、最妙的设计一套代码双模式切换这套架构最务实的地方是同一份代码靠 Maven Profile 切换单体或微服务。中小团队先用单体省运维做大了再切微服务零重构模式命令部署形态适合单体mvn -P bootyudao-server一个进程聚合所有模块中小团队、起步期微服务mvn -P cloud默认Gateway N 个*-server独立部署规模化、需独立扩缩容!-- pom.xmlProfile 控制各子模块是否独立打 fat jar --profileidboot/idpropertiesskip.repackagetrue/skip.repackage/properties!-- 子模块不单独打包由 yudao-server 聚合 --/profileprofileidcloud/idactivationactiveByDefaulttrue/activeByDefault/activationpropertiesskip.repackagefalse/skip.repackage/properties!-- 各 *-server 独立 fat jar --/profile这是真正解决要不要上微服务焦虑的答案不用提前选边站单体起步、平滑演进。详见专文《单体还是微服务中小企业的务实选择》。二、Nacos注册中心 配置中心二合一Nacos 一个组件同时承担服务发现和配置集中管理。各服务通过config.import同时加载本地 profile 配置和 Nacos 配置# 各 *-server 的 application.yaml服务名 配置双源导入spring:application:name:system-server# 必须与网关路由 uri、Feign FeignClient name 一致config:import:-optional:classpath:application-${spring.profiles.active}.yaml# 本地 profile-optional:nacos:${spring.application.name}-${spring.profiles.active}.yaml# Nacos 配置# application-dev.yamlNacos 连接 灰度 metadataspring:cloud:nacos:server-addr:127.0.0.1:8848discovery:namespace:devmetadata:version:1.0.0# 灰度发布用的版本标config:namespace:devgroup:DEFAULT_GROUP设计要点服务注册无需EnableDiscoveryClientSpring Cloud 2020 引入 starter 即自动注册配置放 Nacos 后连网关路由都能在 Nacos 里热改、热刷新。三、Gateway统一入口 grayLb 灰度路由网关用显式静态路由不是 discovery.locator 自动发现URI 用自定义的grayLb://协议做灰度负载均衡。这样路由可控、可灰度# 网关路由每个模块一条grayLb 走灰度负载均衡spring:cloud:gateway:server:webflux:routes:-id:system-admin-apiuri:grayLb://system-server# 自定义灰度负载均衡协议predicates:-Path/admin-api/system/**# 统一前缀路由-id:crm-admin-apiuri:grayLb://crm-serverpredicates:-Path/admin-api/crm/**灰度负载均衡按请求头version匹配 Nacos 实例的metadata.version实现金丝雀发布// GrayLoadBalancer优先选 version 匹配的实例无匹配则回退全部实例ListServiceInstancechoseninstances.stream().filter(i-Objects.equals(version,i.getMetadata().get(version))).collect(Collectors.toList());if(CollUtil.isEmpty(chosen)){choseninstances;// 降级无匹配版本则用全部实例保证可用}returnNacosBalancer.getHostByRandomWeight3(chosen);// 按 Nacos 权重随机外部 API 统一走/admin-api/{module}/**前缀对外只暴露网关一个入口端口 48080。▲ 基础设施·Java 监控Spring Boot Admin实时查看各微服务实例的健康、JVM、线程、日志是微服务运维的仪表盘▲ 基础设施·API 访问日志各微服务system/crm/erp…的请求经网关统一转发路径、耗时、结果码全留痕可按服务/路由排查链路四、Feign服务间调用走 /rpc-api 直连对外 API 走/admin-api经网关服务间内部调用走/rpc-api经 Feign 直连不经网关路径分离、职责清晰。接口定义在*-api模块// AdminUserApi在 yudao-module-system-apiname 指向目标服务名FeignClient(nameApiConstants.NAME)// ApiConstants.NAME system-serverpublicinterfaceAdminUserApi{GetMapping(ApiConstants.PREFIX/get)// PREFIX /rpc-api/system/userCommonResultAdminUserRespDTOgetUser(RequestParam(id)Longid);}关键是上下文透传——服务间调用时用 Feign 拦截器把登录用户和租户 ID 带过去下游才知道现在是谁、哪个租户在调用// 框架内置 Feign 请求拦截器自动透传上下文LoginUserRequestInterceptor// 透传 login-user 头当前登录用户TenantRequestInterceptor// 透传 tenant-id 头当前租户DataPermissionRequestInterceptor// 透传数据权限上下文路径前缀用途是否经网关/admin-api/{module}对外管理端 API✅ 经 Gateway/app-api/{module}对外 App API✅ 经 Gateway/rpc-api/{module}服务间内部 RPC❌ Feign 直连诚实提示当前 Feign 客户端未实现 fallback 降级源码留有 TODO。生产对可用性要求高时建议补充fallbackFactory或引入熔断组件。五、技术亮点总结设计要点实现方式价值双模式Maven Profile boot/cloud单体起步、平滑演进注册配置Nacos 二合一服务发现 配置集中配置双源classpath Nacos import本地 远端热刷新统一入口Gateway 静态路由对外只暴露一个入口灰度发布grayLb version metadata金丝雀按版本路由上下文透传Feign 拦截器服务间不丢登录/租户六、快速体验在线演示http://ruoyioffice.com/web/账号admin/admin123操作路径基础设施 → 监控中心 → Java 监控 / API 接口文档推荐体验流程看 Java 监控里的服务实例 → 翻 API 接口聚合文档 → 对比-P boot/-P cloud启动仓库地址后端GitHub · GitCode · Gitee前端GitCode延伸阅读Spring Cloud Gateway 网关设计 · 单体还是微服务务实选择 · 多租户 SaaS 架构。常见问题FAQRuoYi Office 用的是什么微服务技术栈Spring Boot 3.5 Spring Cloud 2025 Spring Cloud AlibabaNacos 做注册中心和配置中心Spring Cloud Gateway 做网关OpenFeign 做服务间调用Java 17。一定要拆微服务吗不一定。这套架构支持一套代码双模式mvn -P boot打单体一个进程聚合所有模块mvn -P cloud打微服务。中小团队可先用单体省运维做大后再平滑切微服务无需重构。网关路由是自动发现的吗不是。采用显式静态路由表在 yaml 或 Nacos 配置URI 用自定义grayLb://协议做灰度负载均衡路由可控、可在 Nacos 热刷新而非 discovery.locator 自动生成。服务间调用怎么传登录用户和租户通过 Feign 请求拦截器自动透传LoginUserRequestInterceptor 传 login-user 头、TenantRequestInterceptor 传 tenant-id 头、DataPermissionRequestInterceptor 传数据权限上下文。对外和内部接口怎么区分对外管理端走/admin-api/{module}经网关对外 App 走/app-api/{module}服务间内部 RPC 走/rpc-api/{module}Feign 直连不经网关路径前缀分离。想要体验 RuoYi Office 的强大功能在线演示http://ruoyioffice.com/web/账号 admin / admin123源码仓库GitHub | GitCode | Gitee技术咨询添加微信17156169080备注「RuoYi Office」⭐如果觉得不错请给个 Star 支持一下