Spring Cloud 框架
约 686 字大约 2 分钟
2026-04-29
一、Spring Cloud 简介
Spring Cloud 是基于 Spring Boot 的微服务开发工具集,提供了一整套分布式系统解决方案。
1.1 版本关系
| Spring Cloud | Spring Boot | 说明 |
|---|---|---|
| 2023.x(Leyton) | 3.2.x | 当前最新稳定版 |
| 2022.x(Kilburn) | 3.0.x / 3.1.x | 上一代 |
| 2021.x(Jubilee) | 2.7.x | 维护中 |
1.2 核心组件
Spring Cloud
├── 注册中心:Eureka / Nacos / Consul
├── 配置中心:Spring Cloud Config / Nacos Config
├── 网关:Spring Cloud Gateway / Zuul
├── 负载均衡:Spring Cloud LoadBalancer
├── 远程调用:OpenFeign
├── 熔断降级:Resilience4j / Sentinel
├── 链路追踪:Sleuth + Zipkin / Micrometer Tracing
└── 消息驱动:Spring Cloud Stream二、服务注册与发现
2.1 Eureka(Netflix)
// 服务端启动类
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}# eureka-server application.yml
server:
port: 8761
eureka:
client:
register-with-eureka: false # 不注册自己
fetch-registry: false# 客户端 application.yml
spring:
application:
name: user-service
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true2.2 Nacos(Alibaba,推荐)
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
namespace: dev2.3 对比
| Eureka | Nacos | Consul | |
|---|---|---|---|
| CAP | AP | AP/CP | CP |
| 配置中心 | 不支持 | 支持 | 支持 |
| 健康检查 | 客户端心跳 | TCP/HTTP/MySQL | TCP/HTTP/gRPC |
| 社区维护 | 停更(2.x) | 活跃 | 活跃 |
三、负载均衡
3.1 Spring Cloud LoadBalancer
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
// 使用(通过服务名调用)
User user = restTemplate.getForObject(
"http://user-service/api/users/" + id, User.class);3.2 负载均衡策略
@Bean
public ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(
Environment environment,
LoadBalancerClientFactory factory) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
return new RandomLoadBalancer(
factory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
}| 策略 | 说明 |
|---|---|
| RoundRobin(默认) | 轮询 |
| Random | 随机 |
| WeightedResponseTime | 响应时间加权 |
四、声明式调用 — OpenFeign
@FeignClient(name = "order-service",
fallbackFactory = OrderClientFallback.class)
public interface OrderClient {
@GetMapping("/api/orders/user/{userId}")
List<Order> getOrdersByUser(@PathVariable("userId") Long userId);
@PostMapping("/api/orders")
Order createOrder(@RequestBody Order order);
}
@Component
public class OrderClientFallback implements FallbackFactory<OrderClient> {
@Override
public OrderClient create(Throwable cause) {
return new OrderClient() {
public List<Order> getOrdersByUser(Long userId) {
return Collections.emptyList();
}
public Order createOrder(Order order) {
throw new RuntimeException("服务降级:" + cause.getMessage());
}
};
}
}五、API 网关 — Spring Cloud Gateway
5.1 路由配置
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/users/**
filters:
- StripPrefix=0
- id: order-service
uri: lb://order-service
predicates:
- Path=/api/orders/**
- Method=GET,POST5.2 全局过滤器
@Component
public class AuthFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange,
GatewayFilterChain chain) {
String token = exchange.getRequest().getHeaders()
.getFirst("Authorization");
if (!StringUtils.hasText(token)) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() { return 0; }
}5.3 限流
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/users/**
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
key-resolver: "#{@ipKeyResolver}"@Bean
public KeyResolver ipKeyResolver() {
return exchange -> Mono.just(
exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
}六、配置中心 — Spring Cloud Config
# 客户端
spring:
cloud:
config:
uri: http://localhost:8888
profile: dev
label: main@RestController
@RefreshScope
public class ConfigController {
@Value("${custom.config:default}")
private String config;
@GetMapping("/config")
public String getConfig() { return config; }
}七、常见问题
| 问题 | 解决 |
|---|---|
| 服务找不到 | 检查注册中心配置、服务名拼写 |
| 调用超时 | 调整 Feign/Gateway 超时配置 |
| 配置不刷新 | 添加 @RefreshScope + 调用 /actuator/refresh |
| 跨域问题 | 网关统一配置 CORS |
