尧图精选

Spring Cloud微服务实战:Nacos+Gateway+Sentinel完整落地

🕒 发布时间:2026/9/16 17:21:22 📁 来源:尧图网络
简介这是一套基于Spring Cloud微服务架构的电商后台管理系统源码面向Java后端开发初学者与进阶者聚焦分布式系统实战解决商城类项目中商品、订单、用户、权限等核心模块的高可用设计与协同开发问题。资源包共282个文件含209个Java业务逻辑与控制器类、55个XML配置与Mapper映射文件、15个YML微服务配置项辅以Dockerfile容器化部署脚本、SQL建表语句及README说明整体387KB轻量易读。已有188人学习下载适合快速理解Spring Cloud AlibabaNacos、OpenFeign、Redis缓存穿透防护、RabbitMQ异步解耦、MinIO文件上传等典型场景实现。代码结构清晰分层涵盖AuthGlobalFilter网关鉴权、ProductController商品接口、OrderInfoServiceImpl订单服务、UserLoginServiceImpl登录认证等关键组件可直接导入IDE运行调试是微服务落地的完整教学级参考范例。1. 这不是又一个电商Demo尚品甄选商城管理系统源码本质是Spring Cloud微服务落地的完整工程切片你下载的(源码)基于Spring Cloud框架的尚品甄选商城管理系统.zip表面看是个带“尚品甄选”名字的商城系统但真正价值在于它是一套可运行、可调试、可拆解的Spring Cloud生产级微服务工程切片。它不依赖虚构的云平台或SaaS中间件所有模块用户中心、商品服务、订单服务、网关、配置中心都基于Spring Boot 2.7.x Spring Cloud 2021.0.x即Arbitrum版构建使用Nacos作为注册中心与配置中心OpenFeign做服务调用Sentinel实现流量控制——这些不是教程里的Hello World而是真实业务中“用户下单卡顿”“商品页缓存穿透”“秒杀接口熔断”等场景的代码映射。适合两类人刚学完Spring Cloud理论、正卡在“怎么把Eureka换成Nacos”“Feign怎么传JWT token”的中级开发者以及需要快速验证某项能力比如Spring Cloud Gateway集群部署、Sentinel规则持久化的架构师。它不教你怎么写Java语法只告诉你当“尚品甄选”要上新一批有机燕窝时这套系统里哪几行代码决定库存扣减是否原子、哪个配置项让网关能扛住3倍突发流量。2. 拆包即运行从ZIP解压到Nacos注册中心自动发现的最小闭环2.1 解压后目录结构解析识别核心模块与启动依赖链解压尚品甄选商城管理系统.zip后你会看到典型的多模块Maven结构shangpin-shop/ ├── pom.xml # 父POM定义spring-cloud-dependencies版本为2021.0.8 ├── shangpin-common/ # 公共工具类、统一返回体、异常处理器 ├── shangpin-gateway/ # Spring Cloud Gateway网关端口8080 ├── shangpin-user/ # 用户服务端口8081含登录、权限校验 ├── shangpin-product/ # 商品服务端口8082含SKU管理、分类树 ├── shangpin-order/ # 订单服务端口8083含创建、支付回调 ├── shangpin-config/ # Nacos配置中心客户端配置bootstrap.yml指向localhost:8848 └── docker-compose.yml # 可选一键拉起NacosMySQLRedis容器注意该工程未内置Nacos Server必须先独立部署Nacos推荐2.2.3版本。若直接启动服务会因nacos server not found报错退出。这是生产环境常见设计——配置中心与业务服务物理隔离。2.2 本地启动三步法Nacos → 配置导入 → 服务启动2.2.1 启动Nacos并导入预置配置下载Nacos 2.2.3 官方GitHub Release 解压后执行# Linux/Mac sh bin/startup.sh -m standalone # Windows cmd bin\startup.cmd -m standalone访问http://localhost:8848/nacos默认账号/密码nacos/nacos进入「配置管理」→「配置列表」→「 新建配置」依次导入以下3个关键配置Data ID格式为服务名.yamlGroup为DEFAULT_GROUPData IDGroup内容摘要shangpin-gateway.yamlDEFAULT_GROUPspring.cloud.gateway.routes定义了/user/**转发到lb://shangpin-user/product/**转发到lb://shangpin-productshangpin-user.yamlDEFAULT_GROUPspring.redis.hostlocalhost、spring.datasource.urljdbc:mysql://localhost:3306/shangpin_usershangpin-order.yamlDEFAULT_GROUPfeign.client.config.default.connectTimeout5000、sentinel.flowRules[0].resourceorder-create提示配置中的lb://表示LoadBalancer负载均衡Spring Cloud Gateway通过Nacos服务发现自动解析shangpin-user实例IP端口无需硬编码。这是区别于传统单体架构的核心能力。2.2.2 修改数据库连接并初始化SQL进入shangpin-shop/shangpin-user/src/main/resources/application-dev.yaml确认MySQL连接参数spring: datasource: url: jdbc:mysql://localhost:3306/shangpin_user?useSSLfalseserverTimezoneAsia/Shanghai username: root password: your_password # 替换为实际密码同理修改shangpin-order和shangpin-product模块中的对应配置。然后执行各模块src/main/resources/sql/下的初始化SQL如shangpin_user.sql创建用户表、shangpin_product.sql创建商品SPU/SKU表。2.2.3 逐模块启动并验证注册状态按顺序启动避免网关启动时下游服务未注册# 终端1启动用户服务 cd shangpin-user mvn spring-boot:run -Dspring.profiles.activedev # 终端2启动商品服务 cd shangpin-product mvn spring-boot:run -Dspring.profiles.activedev # 终端3启动订单服务 cd shangpin-order mvn spring-boot:run -Dspring.profiles.activedev # 终端4启动网关最后启动 cd shangpin-gateway mvn spring-boot:run -Dspring.profiles.activedev启动成功后访问http://localhost:8848/nacos→ 「服务管理」→ 「服务列表」应看到shangpin-user、shangpin-product、shangpin-order、shangpin-gateway四个服务全部健康Healthy。此时调用curl http://localhost:8080/product/api/v1/category/list将返回商品分类JSON证明服务间已通过Nacos完成自动发现与通信。3. 网关与熔断实战用Spring Cloud Gateway做集群用Sentinel防雪崩3.1 Spring Cloud Gateway集群部署为什么能水平扩展关键在状态分离shangpin-gateway模块默认单机运行但生产环境必须集群。其可集群的根本原因在于Gateway自身无状态所有路由规则、限流配置均从Nacos加载节点间不共享会话或缓存。这意味着你可以启动多个网关实例前端用Nginx做负载均衡完全透明。3.1.1 修改网关配置支持多实例在shangpin-gateway/src/main/resources/bootstrap.yml中确保Nacos配置中心地址正确并添加实例元数据用于后续灰度路由spring: cloud: nacos: discovery: server-addr: localhost:8848 metadata: version: v1.0 # 标记网关版本供灰度策略使用3.1.2 启动第二个网关实例端口8084复制shangpin-gateway目录为shangpin-gateway-2修改其application-dev.yamlserver: port: 8084 # 改为8084避免端口冲突 spring: cloud: nacos: discovery: instance-id: gateway-2 # 唯一标识然后执行cd shangpin-gateway-2 mvn spring-boot:run -Dspring.profiles.activedev回到Nacos控制台刷新「服务列表」shangpin-gateway服务下将显示两个健康实例gateway-1和gateway-2。此时用Nginx反向代理两者upstream gateway_cluster { server 127.0.0.1:8080 weight1; server 127.0.0.1:8084 weight1; } server { listen 80; location / { proxy_pass http://gateway_cluster; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }关键点Gateway集群不依赖Redis或数据库做会话同步因为它的核心功能路由转发、过滤器执行是纯内存计算。唯一外部依赖是Nacos配置中心——只要Nacos高可用Gateway集群就高可用。3.2 Sentinel流量防护在订单创建接口上配置QPS限流与降级shangpin-order模块已集成Sentinel但默认规则为空。需手动配置防止“双11”期间订单服务被刷爆。3.2.1 在Nacos中配置Sentinel流控规则进入Nacos控制台 → 「配置管理」→ 「 新建配置」创建shangpin-order-sentinel.yamlGroup:SENTINEL_GROUPflowRules: - resource: order-create grade: 1 # QPS模式0线程数 count: 100 # 每秒最多100次请求 limitApp: default strategy: 0 # 直接拒绝 controlBehavior: 0 # 快速失败并在shangpin-order/pom.xml中确认已引入依赖dependency groupIdcom.alibaba.csp/groupId artifactIdsentinel-spring-cloud-gateway-adapter/artifactId version2.2.9/version /dependency3.2.2 在订单服务中定义资源名打开shangpin-order/src/main/java/com/shangpin/order/controller/OrderController.java找到创建订单方法PostMapping(/api/v1/order/create) public ResultOrderVO createOrder(RequestBody OrderDTO dto) { // 关键用SentinelResource标注指定resourceorder-create return orderService.createOrder(dto); }确保orderService.createOrder()方法上添加了SentinelResource(value order-create, fallback createOrderFallback)注解并实现降级方法createOrderFallback返回友好提示如“系统繁忙请稍后再试”。3.2.3 验证限流效果启动JMeter或使用ab命令压测ab -n 200 -c 50 http://localhost:8080/order/api/v1/order/create当QPS超过100时约30%请求将返回{code:429,msg:系统繁忙}Sentinel默认BlockException响应而非500错误。这证明熔断生效——不是服务挂了而是主动拒绝保护数据库和下游支付服务不被拖垮。4. 微服务间通信深度调优OpenFeign超时、重试与JWT透传4.1 OpenFeign调用超时设置为什么商品服务查库存总超时查这三个参数shangpin-order调用shangpin-product查询库存时若网络抖动或商品服务GC暂停Feign默认1秒超时会导致订单创建失败。需在shangpin-order的application-dev.yaml中显式配置feign: client: config: default: connectTimeout: 5000 # 连接建立最大等待时间毫秒 readTimeout: 10000 # 连接建立后读取响应的最大时间毫秒 httpclient: enabled: true # 启用Apache HttpClient支持重试 max-connections: 200 # 最大连接数 max-connections-per-route: 50逻辑说明connectTimeout是TCP三次握手耗时上限readTimeout是从服务端返回第一个字节到接收完全部响应的时限。若商品服务处理一个SKU查询平均需800ms设readTimeout10000可容忍短时慢SQL避免误判为故障。4.2 Feign重试机制网络闪断时自动重发避免用户重复下单仅靠超时不够还需重试。在shangpin-order的FeignConfig.java中定义重试策略Configuration public class FeignConfig { Bean public Retryer feignRetryer() { // 最多重试3次首次调用2次重试间隔100ms最大间隔1000ms return new Retryer.Default(100, 1000, 3); } }同时在调用商品服务的Feign Client接口上启用FeignClient(name shangpin-product, configuration FeignConfig.class) public interface ProductClient { GetMapping(/api/v1/product/sku/{skuId}) ResultSkuVO getSkuById(PathVariable(skuId) Long skuId); }参数说明Retryer.Default构造函数中100是初始重试间隔ms1000是最大重试间隔ms3是最大重试次数。重试时会跳过幂等性不强的操作如POST创建但对GET查询库存这类安全操作非常有效。4.3 JWT Token透传网关鉴权后如何让订单服务拿到用户IDshangpin-gateway在/user/login接口生成JWT后需将其透传给下游服务。关键在网关的全局过滤器Component public class AuthHeaderFilter implements GlobalFilter { Override public MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) { String authHeader exchange.getRequest().getHeaders().getFirst(Authorization); if (authHeader ! null authHeader.startsWith(Bearer )) { // 将token放入请求头下游服务可通过RequestContextHolder获取 ServerHttpRequest request exchange.getRequest() .mutate() .header(X-Auth-Token, authHeader.substring(7)) // 去掉Bearer 前缀 .build(); exchange exchange.mutate().request(request).build(); } return chain.filter(exchange); } }在shangpin-order的Controller中即可获取GetMapping(/api/v1/order/user/{userId}) public ResultListOrderVO listByUser(RequestHeader(X-Auth-Token) String token) { // 解析token获取userId或直接调用认证服务校验 Long userId JwtUtil.getUserId(token); return orderService.listByUserId(userId); }注意此方案将Token明文透传生产环境建议用内部RPC协议或服务网格如Istio做mTLS加密但本项目作为学习样本透传方式最直观体现微服务间上下文传递原理。5. 生产级排错技巧当Nacos注册失败、Feign调用404、Sentinel规则不生效时查什么5.1 Nacos注册失败三步定位法现象服务启动日志出现failed to register service或Nacos控制台无服务实例。检查项命令/操作预期结果说明Nacos服务是否存活curl http://localhost:8848/nacos/v1/console/server/state返回JSON含running:true若超时检查Nacos进程是否运行、防火墙是否拦截8848端口服务配置是否正确查看shangpin-user/target/classes/bootstrap.yml中spring.cloud.nacos.discovery.server-addr值为localhost:8848非127.0.0.1某些Docker环境DNS解析异常Nacos客户端默认用InetAddress.getLocalHost().getHostAddress()获取IP若本机hostname解析异常会导致注册IP错误网络连通性telnet localhost 8848Linux或Test-NetConnection localhost -Port 8848Windows显示Connected若失败检查Nacos是否监听0.0.0.0:8848非127.0.0.1:88485.2 Feign调用返回404不只是路径问题先看服务发现现象shangpin-order调用shangpin-product接口返回404。排查层级操作判断依据Nacos服务发现访问http://localhost:8848/nacos/v1/ns/instance/list?serviceNameshangpin-product返回JSON中hosts数组非空且ip字段为服务真实IP非127.0.0.1Feign客户端URL在ProductClient接口方法上加RequestMapping(/api/v1/product)确保与商品服务Controller的RequestMapping一致若商品服务Controller是RequestMapping(/product)则Feign必须匹配否则网关路由或直连都会404服务端端口监听netstat -an | grep :8082Linux或netstat -ano | findstr :8082Windows确认8082端口处于LISTENING状态且PID对应shangpin-product进程5.3 Sentinel规则不生效检查规则加载源与资源埋点现象在Nacos配置了流控规则但压测时无任何限流响应。关键点检查方式正确做法规则分组是否匹配Nacos配置的Group必须与代码中InitExecutor.register指定的Group一致FlowRuleManager.loadRules(rules)前确认System.setProperty(project.name, shangpin-order)已设置且Nacos中Group为SENTINEL_GROUP资源名是否精确匹配在订单服务日志中搜索SphU.entry(order-create)若日志无此条说明SentinelResource未生效或方法未被调用若存在但无entry失败日志则规则未加载Sentinel Dashboard是否接入启动Sentinel Dashboardjava -jar sentinel-dashboard.jar访问http://localhost:8080→ 「簇点链路」应看到order-create资源点击「流控」可临时添加规则验证若此处生效而Nacos不生效说明Nacos配置监听未触发终极验证命令在订单服务JVM启动参数中加入-Dcsp.sentinel.dashboard.serverlocalhost:8080重启后访问Dashboard若「机器列表」显示服务IP则证明Sentinel Agent已注入此时Nacos规则必能生效。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联 返回资讯列表 →