Spring Cloud 框架笔记
·
一、Spring Cloud 核心定位
Spring Cloud 是构建分布式系统/微服务架构的一站式解决方案,它基于 Spring Boot 提供了一套完整的微服务开发工具集。微服务架构包括了:服务治理、配置管理、服务调用、网关路由、链路追踪、消息驱动、服务注册与发现、负载均衡、熔断降级
二、核心特点概览
1. 分布式系统解决方案全家桶
# Spring Cloud 技术栈组成
Spring Cloud =
├── 服务注册与发现:Eureka, Nacos, Consul
├── 配置中心:Config, Nacos, Apollo
├── 服务调用:OpenFeign, RestTemplate
├── 负载均衡:Ribbon, LoadBalancer
├── 服务熔断:Hystrix, Sentinel, Resilience4j
├── API网关:Gateway, Zuul
├── 链路追踪:Sleuth + Zipkin, SkyWalking
├── 消息驱动:Stream
├── 安全认证:Security, OAuth2
└── 分布式事务:Seata
三、详细特点分析
1. 服务治理能力强大
服务注册与发现
// 服务提供者
@SpringBootApplication
@EnableDiscoveryClient // 开启服务发现
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
// 服务消费者
@RestController
public class OrderController {
// 通过服务名调用,而非硬编码IP
@Autowired
private LoadBalancerClient loadBalancer;
@GetMapping("/order/user/{userId}")
public User getUser(@PathVariable Long userId) {
// 通过服务名获取实例
ServiceInstance instance = loadBalancer.choose("user-service");
String url = String.format("http://%s:%s/user/%s",
instance.getHost(), instance.getPort(), userId);
// 发送请求
return restTemplate.getForObject(url, User.class);
}
}
负载均衡
// 1. Ribbon(Spring Cloud 2020以前)
@Configuration
public class RibbonConfig {
@Bean
@LoadBalanced // 启用负载均衡
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
// 2. Spring Cloud LoadBalancer(新版)
@Configuration
@LoadBalancerClient(
name = "user-service",
configuration = CustomLoadBalancerConfig.class
)
public class LoadBalancerConfig {
}
// 使用 OpenFeign(声明式HTTP客户端)
@FeignClient(name = "user-service",
configuration = FeignConfig.class)
public interface UserServiceClient {
@GetMapping("/user/{id}")
User getUserById(@PathVariable("id") Long id);
@PostMapping("/user")
User createUser(@RequestBody User user);
}
2. 配置中心化与动态刷新
# 集中式配置管理
# config-server 配置
server:
port: 8888
spring:
cloud:
config:
server:
git:
uri: https://github.com/config-repo
search-paths: '{application}'
# 客户端配置
# bootstrap.yml(优先加载)
spring:
application:
name: user-service
cloud:
config:
uri: http://localhost:8888
label: master
profile: dev
# 动态刷新配置
@RestController
@RefreshScope // 支持配置热更新
public class ConfigController {
@Value("${app.feature.enabled:false}")
private boolean featureEnabled;
@GetMapping("/feature")
public String getFeature() {
return "Feature enabled: " + featureEnabled;
}
}
// 发送刷新请求
// POST /actuator/refresh
3. 服务熔断与降级
// 1. Hystrix(Spring Cloud 2020以前)
@SpringBootApplication
@EnableCircuitBreaker // 启用熔断器
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@Service
public class OrderService {
@HystrixCommand(
fallbackMethod = "getUserFallback",
commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000"),
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000")
}
)
public User getUser(Long userId) {
// 调用用户服务
return userServiceClient.getUserById(userId);
}
// 降级方法
public User getUserFallback(Long userId, Throwable throwable) {
// 返回兜底数据
return User.builder()
.id(userId)
.name("默认用户")
.email("default@example.com")
.build();
}
}
// 2. Resilience4j(新版推荐)
@Configuration
public class Resilience4jConfig {
@Bean
public CircuitBreakerConfig circuitBreakerConfig() {
return CircuitBreakerConfig.custom()
.failureRateThreshold(50) // 失败率阈值
.waitDurationInOpenState(Duration.ofMillis(10000))
.slidingWindowSize(10)
.build();
}
@Bean
public TimeLimiterConfig timeLimiterConfig() {
return TimeLimiterConfig.custom()
.timeoutDuration(Duration.ofSeconds(3))
.build();
}
}
@Service
public class ProductService {
private final CircuitBreaker circuitBreaker;
private final TimeLimiter timeLimiter;
public ProductService(ProductClient productClient) {
this.circuitBreaker = CircuitBreaker.ofDefaults("productService");
this.timeLimiter = TimeLimiter.of(Duration.ofSeconds(3));
}
@CircuitBreaker(name = "productService", fallbackMethod = "fallback")
@TimeLimiter(name = "productService")
public CompletableFuture<Product> getProduct(Long id) {
return CompletableFuture.supplyAsync(() ->
productClient.getProductById(id)
);
}
public CompletableFuture<Product> fallback(Long id, Exception e) {
return CompletableFuture.completedFuture(
Product.builder()
.id(id)
.name("默认商品")
.price(BigDecimal.ZERO)
.build()
);
}
}
4. 智能路由网关
// Spring Cloud Gateway(新一代网关)
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
// 路由配置
@Configuration
public class RouteConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("user_route", r -> r
.path("/api/user/**")
.filters(f -> f
.addRequestHeader("X-Request-Id", UUID.randomUUID().toString())
.addResponseHeader("X-Response-Time", LocalDateTime.now().toString())
.circuitBreaker(config -> config
.setName("userCircuitBreaker")
.setFallbackUri("forward:/fallback/user"))
)
.uri("lb://user-service")) // 负载均衡到服务
.route("order_route", r -> r
.path("/api/order/**")
.filters(f -> f
.rewritePath("/api/order/(?<segment>.*)", "/$\\{segment}")
.retry(config -> config
.setRetries(3)
.setStatuses(HttpStatus.INTERNAL_SERVER_ERROR))
)
.uri("lb://order-service"))
.route("auth_route", r -> r
.path("/auth/**")
.filters(f -> f
.filter(new AuthFilter()) // 自定义过滤器
)
.uri("http://localhost:8081"))
.build();
}
}
// 自定义过滤器
@Component
public class AuthFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest()
.getHeaders()
.getFirst("Authorization");
if (!isValidToken(token)) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
// 添加自定义头
ServerHttpRequest request = exchange.getRequest().mutate()
.header("X-User-Id", extractUserId(token))
.build();
return chain.filter(exchange.mutate().request(request).build());
}
@Override
public int getOrder() {
return -1; // 优先级
}
}
5. 分布式链路追踪
// Spring Cloud Sleuth + Zipkin
@SpringBootApplication
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
// 配置 Sleuth
@Bean
public Sampler defaultSampler() {
return Sampler.ALWAYS_SAMPLE; // 全量采样
}
}
// 自动注入 TraceId 和 SpanId
@RestController
@Slf4j
public class OrderController {
@GetMapping("/order/{id}")
public Order getOrder(@PathVariable Long id) {
// 日志自动添加 [order-service, traceId, spanId]
log.info("Fetching order with id: {}", id);
// 调用其他服务时会自动传递 trace 信息
User user = userServiceClient.getUser(order.getUserId());
return order;
}
}
// Zipkin 配置
spring:
zipkin:
base-url: http://localhost:9411
sender:
type: web
sleuth:
sampler:
probability: 1.0 # 采样率
6. 消息驱动微服务
// Spring Cloud Stream(基于消息中间件的服务通信)
@SpringBootApplication
@EnableBinding({OrderChannel.class, PaymentChannel.class})
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
}
// 定义消息通道
interface OrderChannel {
String INPUT = "order-input";
String OUTPUT = "order-output";
@Input(INPUT)
SubscribableChannel input();
@Output(OUTPUT)
MessageChannel output();
}
// 消息生产者
@Service
@Slf4j
public class OrderService {
@Autowired
private OrderChannel orderChannel;
public void createOrder(Order order) {
// 发送订单创建事件
Message<OrderEvent> message = MessageBuilder
.withPayload(OrderEvent.created(order))
.setHeader("eventType", "ORDER_CREATED")
.build();
orderChannel.output().send(message);
log.info("Order created event sent: {}", order.getId());
}
}
// 消息消费者
@Component
@Slf4j
public class PaymentListener {
@StreamListener(OrderChannel.INPUT)
public void handleOrderCreated(OrderEvent event) {
log.info("Received order event: {}", event.getOrderId());
// 处理订单创建事件,触发支付
if ("ORDER_CREATED".equals(event.getType())) {
processPayment(event.getOrderId());
}
}
// 函数式编程风格(Spring Cloud Stream 3.x+)
@Bean
public Consumer<OrderEvent> orderCreated() {
return event -> {
log.info("Processing order: {}", event.getOrderId());
// 业务逻辑
};
}
}
7. 分布式配置管理
// Spring Cloud Config 客户端
@RestController
@RefreshScope
public class ConfigController {
// 注入配置中心的配置
@Value("${app.feature.flags.newPayment:false}")
private boolean newPaymentFeature;
@Value("${app.rate.limits.maxRequestsPerMinute:100}")
private int rateLimit;
// 动态更新配置
@PostMapping("/config/refresh")
public String refreshConfig() {
// 触发配置刷新
// 实际通过 /actuator/refresh 端点
return "Configuration refreshed";
}
}
// 配置中心管理多个环境的配置
# GitHub仓库结构
config-repo/
├── application.yml # 全局配置
├── order-service/
│ ├── order-service.yml # 服务专用配置
│ ├── order-service-dev.yml
│ └── order-service-prod.yml
└── user-service/
├── user-service.yml
├── user-service-dev.yml
└── user-service-prod.yml
8. 安全认证与授权
// Spring Cloud Security + OAuth2
@EnableResourceServer // 资源服务器
@EnableAuthorizationServer // 授权服务器
@SpringBootApplication
public class AuthServiceApplication {
public static void main(String[] args) {
SpringApplication.run(AuthServiceApplication.class, args);
}
}
// JWT令牌配置
@Configuration
public class JwtConfig {
@Bean
public TokenStore tokenStore() {
return new JwtTokenStore(jwtAccessTokenConverter());
}
@Bean
public JwtAccessTokenConverter jwtAccessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setSigningKey("mySecretKey");
return converter;
}
}
// 资源服务器配置
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/public/**").permitAll()
.antMatchers("/api/orders/**").hasRole("USER")
.antMatchers("/api/admin/**").hasRole("ADMIN")
.anyRequest().authenticated();
}
}
// 服务间认证
@FeignClient(name = "user-service",
configuration = FeignClientConfig.class)
public interface UserServiceClient {
@GetMapping("/user/{id}")
User getUserById(@PathVariable Long id);
}
@Configuration
public class FeignClientConfig {
@Bean
public RequestInterceptor oauth2FeignRequestInterceptor() {
return requestTemplate -> {
// 自动传递OAuth2令牌
Authentication authentication = SecurityContextHolder
.getContext()
.getAuthentication();
if (authentication != null && authentication.getCredentials() instanceof OAuth2AccessToken) {
OAuth2AccessToken token = (OAuth2AccessToken) authentication.getCredentials();
requestTemplate.header("Authorization", "Bearer " + token.getValue());
}
};
}
}
四、Spring Cloud 优势总结
1. 完整微服务解决方案
| 组件 | 解决问题 | 技术实现 |
|---|---|---|
| 服务治理 | 服务注册、发现、调用 | Eureka/Nacos + OpenFeign |
| 负载均衡 | 请求分发、故障转移 | Ribbon/LoadBalancer |
| 熔断降级 | 服务雪崩防护 | Hystrix/Sentinel/Resilience4j |
| 配置中心 | 统一配置管理 | Config/Nacos/Apollo |
| API网关 | 统一入口、路由转发 | Gateway/Zuul |
| 链路追踪 | 请求链路追踪 | Sleuth + Zipkin |
| 消息驱动 | 异步通信、事件驱动 | Stream |
| 安全认证 | 统一认证授权 | Security + OAuth2 |
2. 与 Spring Boot 深度集成
// Spring Cloud 基于 Spring Boot,配置简单
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
@EnableFeignClients
@EnableConfigServer
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
// 自动配置大量组件
// 只需添加依赖,大部分配置自动完成
3. 云原生支持
# 支持容器化部署
spring:
cloud:
kubernetes:
enabled: true
discovery:
all-namespaces: true
config:
sources:
- name: ${spring.application.name}
namespace: default
# 支持服务网格
spring:
cloud:
istio:
enabled: true
host: istio-pilot.istio-system
port: 15010
4. 丰富的生态整合
<!-- Spring Cloud Alibaba 生态 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- 腾讯、华为云等云厂商集成 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-tencent-polaris</artifactId>
</dependency>
五、版本演进与选择
Spring Cloud 发展历程
-
Finchley (2018):支持 Spring Boot 2.0
-
Greenwich (2019):强化响应式编程支持
-
Hoxton (2020):淘汰部分 Netflix 组件
-
2020.x (Ilford):版本号按年份命名
-
2021.x (Jubilee):全面拥抱 Java 17
技术选型建议
Spring Cloud 2021.x + Spring Boot 2.6+ 技术栈:
服务注册:Nacos / Consul
配置中心:Nacos / Apollo
服务调用:OpenFeign + LoadBalancer
熔断降级:Resilience4j / Sentinel
API网关:Spring Cloud Gateway
链路追踪:Micrometer + Zipkin
消息驱动:Spring Cloud Stream + Kafka/RabbitMQ
总结特点
Spring Cloud 核心特点:
-
一站式解决方案:提供微服务架构所需的所有组件
-
Spring 生态无缝集成:与 Spring Boot、Spring Security 等完美结合
-
组件丰富且可替换:支持多种技术选型(Netflix、Alibaba 等)
-
生产就绪:内置容错、监控、安全等生产级功能
-
云原生友好:天然支持容器化、服务网格
-
社区活跃:强大的社区支持和持续更新
-
企业级支持:Pivotal(VMware)官方维护,企业级可靠性
Spring Cloud 降低了微服务架构的实施门槛,使开发者能够专注于业务逻辑,而非基础设施的搭建。
更多推荐




所有评论(0)