Spring Cloud 微服务架构深度实践:从设计到生产级落地

张开发
2026/4/3 20:34:40 15 分钟阅读
Spring Cloud 微服务架构深度实践:从设计到生产级落地
写在前面本文不聊"什么是微服务"这类入门话题。我们直接聊生产级落地的核心痛点:服务治理、弹性设计、可观测性、安全,以及那些踩过坑才明白的实践。希望对你有帮助。一、架构设计:先想清楚边界1.1 服务拆分原则微服务第一步不是技术选型,而是拆多粗。拆法优点缺点按业务能力拆(DDD)独立演进,团队自治初期成本高按交易流程拆逻辑清晰跨服务事务难按读写拆(CQRS)性能好复杂度高实践建议:优先按业务能力边界拆,初期宁可粗一点也不要过度拆分。微服务一大半的坑都来自过于细粒度的拆分。1.2 领域驱动设计落地// 领域实体示例:订单域@AggregatepublicclassOrder{@AggregateIdentifierprivateOrderIdorderId;privateOrderStatusstatus;privateMoneytotalAmount;// 聚合内部保证一致性publicvoidaddItem(OrderItemitem){// 业务校验必须放在聚合根if(status!=OrderStatus.DRAFT){thrownewIllegalStateException("只有在草稿状态才能添加商品");}this.items.add(item);this.recalculateAmount();}}二、服务治理:Nacos + Ribbon 的正确姿势2.1 引入Nacos作为注册中心# application.ymlspring:cloud:nacos:discovery:server-addr:nacos-server:8848namespace:${NACOS_NAMESPACE:public}group:${SERVICE_GROUP:DEFAULT_GROUP}cluster-name:${NACOS_CLUSTER:DEFAULT}username:nacospassword:nacos生产级配置注意点:spring:cloud:nacos:discovery:# 打开权重负载均衡enabled:true# 心跳间隔(默认5秒)heartbeat-interval-ms:3000# 实例元数据metadata:version:${APP_VERSION:latest}region:${REGION:cn-south}environment:${ENV:prod}2.2 Ribbon vs OpenFeign:选哪个?特性RibbonOpenFeign编程方式接口+注解声明式接口与Spring集成一般深度集成请求重试支持通过Retryer日志需手动自动开启DEBUG推荐场景老项目迁移新项目推荐用 OpenFeign,代码更简洁:@FeignClient(name="user-service",path="/api/users",fallbackFactory=UserClientFallbackFactory.class,configuration=FeignConfiguration.class)publicinterfaceUserClient{@GetMapping("/{id}")UserDTOgetUserById(@PathVariableLongid);@PostMapping("/query")ListUserDTOqueryUsers(@RequestBodyUserQueryquery);}// 降级工厂@Component@Slf4jpublicclassUserClientFallbackFactoryimplementsFallbackFactoryUserClient{@OverridepublicUserClientcreate(Throwablecause){log.error("UserService调用失败",cause);returnnewUserClient(){@OverridepublicUserDTOgetUserById(Longid){// 降级返回兜底数据returnUserDTO.defaultUser(id);}@OverridepublicListUserDTOqueryUsers(UserQueryquery){returnCollections.emptyList();}};}}三、流量治理:Sentinel 熔断与限流3.1 引入SentineldependencygroupIdcom.alibaba.csp/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactId/dependency3.2 代码层面定义规则// 注解方式定义流控规则@RestController@RequestMapping("/api/orders")@Slf4jpublicclassOrderController{@GetMapping("/{orderId}")@SentinelResource(value="getOrder",blockHandler="getOrderBlockHandler",fallback="getOrderFallback")publicResultOrderVOgetOrder(@PathVariableLongorderId)

更多文章