1. Spring Cloud 简介
Spring Cloud 是一套基于 Spring Boot 的微服务开发工具集,提供分布式系统构建所需的服务发现、配置管理、熔断器、API 网关等核心组件。其生态整合了 Netflix OSS、Alibaba、Consul 等解决方案,支持快速搭建弹性扩展、容错能力强的云原生应用。
核心优势:
-
标准化:统一 Spring Boot 编程模型,降低学习成本。
-
模块化:按需引入组件(如 Spring Cloud Gateway、OpenFeign)。
-
云原生支持:无缝对接 Kubernetes、Docker 等平台。
-
生态丰富:支持多种注册中心(Nacos、Eureka)、配置中心(Config Server、Apollo)。
2. 环境准备与版本选择
-
组件选型:
-
服务注册中心:Nacos(替代 Eureka,支持 CP/AP 模式)。
-
API 网关:Spring Cloud Gateway(高性能,支持响应式编程)。
-
配置中心:Nacos Config(动态配置管理)。
-
服务调用:OpenFeign(声明式 REST 客户端)。
-
熔断限流:Sentinel(替代 Hystrix,功能更强大)。
-
3. 实战一:服务注册与发现(Nacos)
3.1 搭建 Nacos 服务端
-
下载并启动 Nacos:
wget https://github.com/alibaba/nacos/releases/download/2.2.3/nacos-server-2.2.3.tar.gz tar -zxvf nacos-server-2.2.3.tar.gz cd nacos/bin sh startup.sh -m standalone # 单机模式
访问
http://localhost:8848/nacos
,默认账号:nacos
,密码:nacos
。
3.2 创建微服务模块
-
订单服务(order-service):
<!-- pom.xml 依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2022.0.0.0</version> </dependency>
# application.yml spring: application: name: order-service cloud: nacos: discovery: server-addr: localhost:8848
-
用户服务(user-service):
重复上述步骤,修改spring.application.name
为user-service
。 -
验证服务注册:
-
访问 Nacos 控制台,查看服务列表中的
order-service
和user-service
。
-
4. 实战二:声明式服务调用(OpenFeign)
4.1 实现服务间通信
-
在订单服务中引入 OpenFeign:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
-
创建 Feign 客户端接口:
@FeignClient(name = "user-service") public interface UserClient { @GetMapping("/users/{id}") User getUser(@PathVariable Long id); }
-
启用 Feign 并调用服务:
@SpringBootApplication @EnableFeignClients public class OrderApplication { ... } @RestController public class OrderController { @Autowired private UserClient userClient; @GetMapping("/orders/{userId}") public Order getOrder(@PathVariable Long userId) { User user = userClient.getUser(userId); return new Order(1L, user.getId(), "已支付"); } }
4.2 负载均衡与重试
-
默认负载均衡:通过
@LoadBalanced
注解的RestTemplate
或 Feign 集成 Ribbon。 -
自定义重试策略:
# application.yml spring: cloud: loadbalancer: retry: enabled: true max-retries-on-next-server: 2 max-retries-on-same-server: 0
5. 实战三:动态配置管理(Nacos Config)
5.1 集中化配置
-
添加配置中心依赖:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
-
创建配置文件:
-
在 Nacos 控制台新建 Data ID:
order-service-dev.yml
,Group:DEFAULT_GROUP
,内容:logging: level: root: INFO order: maxItems: 100
-
-
客户端配置:
# bootstrap.yml spring: application: name: order-service profiles: active: dev cloud: nacos: config: server-addr: localhost:8848 file-extension: yml
-
动态刷新配置:
@RefreshScope @RestController public class ConfigController { @Value("${order.maxItems}") private int maxItems; @GetMapping("/config/maxItems") public int getMaxItems() { return maxItems; } }
6. 实战四:API 网关(Spring Cloud Gateway)
6.1 创建网关服务
-
引入依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
-
配置路由规则:
spring: cloud: gateway: routes: - id: user-service uri: lb://user-service predicates: - Path=/api/users/** filters: - StripPrefix=1
-
全局过滤器(鉴权示例):
@Component public class AuthFilter implements GlobalFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { String token = exchange.getRequest().getHeaders().getFirst("Authorization"); if (token == null) { exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); return exchange.getResponse().setComplete(); } return chain.filter(exchange); } }
7. 实战五:熔断与限流(Sentinel)
7.1 集成 Sentinel
-
添加依赖:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
-
定义流控规则:
@PostConstruct public void initFlowRules() { List<FlowRule> rules = new ArrayList<>(); FlowRule rule = new FlowRule(); rule.setResource("getUser"); rule.setGrade(RuleConstant.FLOW_GRADE_QPS); rule.setCount(10); // 每秒最大请求数 rules.add(rule); FlowRuleManager.loadRules(rules); }
-
熔断降级处理:
@FeignClient(name = "user-service", fallback = UserFallback.class) public interface UserClient { ... } @Component public class UserFallback implements UserClient { @Override public User getUser(Long id) { return new User(-1L, "默认用户"); } }
8. 高级实战:分布式链路追踪(Sleuth + Zipkin)
8.1 集成 Sleuth
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
8.2 部署 Zipkin 服务端
docker run -d -p 9411:9411 openzipkin/zipkin
8.3 客户端配置
spring:
zipkin:
base-url: http://localhost:9411
sleuth:
sampler:
probability: 1.0 # 采样率 100%
9. 项目结构示例
microservices/
├── api-gateway # 网关服务
├── config-server # 配置中心(可选)
├── order-service # 订单服务
├── user-service # 用户服务
└── common # 公共模块(DTO、工具类)
10. 常见问题与解决方案
Q1: 服务注册失败
-
检查 Nacos 服务端状态,确认客户端配置的
server-addr
正确。 -
查看日志中是否有网络连接异常。
Q2: Feign 调用返回 404
-
确认服务提供者的接口路径与 Feign 客户端定义一致。
-
检查是否缺少
@EnableFeignClients
注解。
Q3: 配置未动态刷新
-
确保使用
@RefreshScope
注解。 -
检查 Nacos 配置的 Data ID 和 Group 是否匹配。
Q4: 网关路由不生效
-
验证
uri
是否使用lb://service-name
格式。 -
检查过滤器是否修改了请求路径。
11. 总结与最佳实践
-
服务拆分原则:按业务领域划分微服务,避免过度拆分。
-
版本管理:通过
spring-cloud-dependencies
统一管理组件版本。 -
监控体系:集成 Prometheus + Grafana 实现多维监控。
-
安全防护:结合 OAuth2 和 JWT 实现服务鉴权。
-
持续交付:使用 Jenkins 或 GitLab CI 构建自动化流水线。
通过本实战指南,您已掌握 Spring Cloud 微服务架构的核心组件与开发流程。实际项目中,需根据业务规模选择合适的技术组合(如 Kubernetes 替代部分 Spring Cloud 功能),并持续优化性能与可靠性。