核心组件概览

SpringCloud为微服务架构提供了一整套解决方案,核心组件覆盖服务治理的各个方面:

┌─────────────────────────────────────────┐
│          SpringCloud 生态体系            │
├─────────────────────────────────────────┤
│ 服务注册发现:Eureka / Consul / Nacos   │
│ 服务调用:    Feign / RestTemplate      │
│ 负载均衡:    Ribbon / LoadBalancer     │
│ 服务网关:    Gateway / Zuul            │
│ 熔断降级:    Hystrix / Sentinel        │
│ 配置中心:    Config / Nacos Config     │
│ 链路追踪:    Sleuth + Zipkin           │
│ 消息总线:    Bus                        │
└─────────────────────────────────────────┘

1. Eureka - 服务注册与发现

核心功能

  • 服务注册:微服务启动时向Eureka注册自己
  • 服务发现:客户端从Eureka获取服务实例列表
  • 健康检查:定期心跳检测服务健康状态

示例代码

// Eureka Server
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

// Eureka Client
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
    // 自动注册到Eureka
}

配置示例

# Eureka Server配置
eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false  # 不注册自己
    fetch-registry: false
    
# Eureka Client配置
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
  instance:
    lease-renewal-interval-in-seconds: 30  # 心跳间隔

2. Ribbon - 客户端负载均衡

核心特点

  • 基于客户端的负载均衡器
  • 与Eureka集成,自动获取服务列表
  • 支持多种负载均衡策略

负载均衡策略

// 自定义负载均衡策略
@Configuration
public class RibbonConfig {
    @Bean
    public IRule ribbonRule() {
        return new RandomRule();  // 随机策略
        // return new RoundRobinRule();  // 轮询
        // return new RetryRule();  // 重试
        // return new WeightedResponseTimeRule();  // 响应时间加权
    }
}

// 使用RestTemplate + Ribbon
@Bean
@LoadBalanced  // 开启负载均衡
public RestTemplate restTemplate() {
    return new RestTemplate();
}

// 调用时通过服务名调用
String result = restTemplate.getForObject(
    "http://user-service/api/users/1", 
    String.class
);

3. Feign - 声明式服务调用

核心优势

  • 声明式REST客户端
  • 集成Ribbon负载均衡
  • 集成Hystrix熔断降级
  • 支持SpringMVC注解

使用示例

// 定义Feign客户端
@FeignClient(
    name = "user-service",  // 服务名
    fallback = UserServiceFallback.class  // 降级处理
)
public interface UserServiceClient {
    @GetMapping("/api/users/{id}")
    User getUserById(@PathVariable("id") Long id);
    
    @PostMapping("/api/users")
    User createUser(@RequestBody User user);
}

// 降级处理
@Component
public class UserServiceFallback implements UserServiceClient {
    @Override
    public User getUserById(Long id) {
        return new User(id, "默认用户");  // 降级返回
    }
}

// 使用Feign客户端
@Service
public class OrderService {
    @Autowired
    private UserServiceClient userServiceClient;
    
    public Order createOrder(Long userId) {
        User user = userServiceClient.getUserById(userId);
        // 创建订单逻辑
    }
}

4. Hystrix - 熔断降级(已停更,推荐Sentinel)

核心功能

  • 熔断机制:快速失败,防止雪崩
  • 服务降级:提供备用方案
  • 资源隔离:线程池/信号量隔离
  • 实时监控:Dashboard监控面板

使用示例

@Service
public class UserService {
    @HystrixCommand(
        fallbackMethod = "getUserFallback",  // 降级方法
        commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000"),
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60")
        }
    )
    public User getUserById(Long id) {
        // 调用远程服务
        return restTemplate.getForObject("http://user-service/api/users/" + id, User.class);
    }
    
    // 降级方法
    public User getUserFallback(Long id) {
        return new User(id, "降级用户");
    }
}

5. Gateway - API网关(新一代,取代Zuul)

核心功能

  • 路由转发:统一入口,路由到具体服务
  • 负载均衡:集成LoadBalancer
  • 限流熔断:集成Sentinel/Hystrix
  • 认证鉴权:统一权限校验
  • 监控日志:统一日志记录

配置示例

spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service  # lb表示负载均衡
          predicates:
            - Path=/api/users/**
          filters:
            - StripPrefix=1  # 去掉路径前缀
            - AddRequestHeader=X-Request-Source, Gateway
            
        - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/api/orders/**
          filters:
            - name: CircuitBreaker
              args:
                name: orderCircuitBreaker
                fallbackUri: forward:/fallback

自定义过滤器

@Component
public class AuthFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = exchange.getRequest().getHeaders().getFirst("Authorization");
        
        if (token == null || !validateToken(token)) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
        
        return chain.filter(exchange);
    }
    
    @Override
    public int getOrder() {
        return -100;  // 优先级
    }
}

6. Config - 配置中心

核心功能

  • 集中管理配置:所有服务配置统一管理
  • 环境隔离:dev/test/prod环境配置分离
  • 动态刷新:配置修改后无需重启服务
  • 版本管理:配置存储在Git,支持版本控制

Server端配置

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/xxx/config-repo
          search-paths: config
          username: xxx
          password: xxx
        default-label: main

Client端使用

# bootstrap.yml
spring:
  cloud:
    config:
      uri: http://localhost:8888  # Config Server地址
      name: user-service  # 配置文件名
      profile: dev  # 环境
      label: main  # 分支
// 动态刷新配置
@RestController
@RefreshScope  // 支持动态刷新
public class ConfigController {
    @Value("${custom.property}")
    private String customProperty;
    
    @GetMapping("/config")
    public String getConfig() {
        return customProperty;
    }
}

7. Sleuth + Zipkin - 链路追踪

核心功能

  • 全链路追踪:跟踪请求在各服务间的调用链路
  • 性能分析:分析每个环节的耗时
  • 问题定位:快速定位故障点

集成配置

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
spring:
  zipkin:
    base-url: http://localhost:9411  # Zipkin服务地址
  sleuth:
    sampler:
      probability: 1.0  # 采样率,1.0表示100%

日志输出

[user-service,abc123,def456,true] - 处理用户请求
# [服务名, TraceId, SpanId, 是否输出到Zipkin]

8. Nacos - 服务注册与配置中心(阿里开源)

核心优势

  • 一体化方案:同时支持服务注册和配置管理
  • 更好的性能:AP/CP模式可切换
  • 功能更强:支持命名空间、分组、权限控制
// 服务注册
@SpringBootApplication
@EnableDiscoveryClient
public class Application {
    // Nacos自动注册
}

// 配置管理
@RestController
@RefreshScope
@NacosPropertySource(dataId = "user-service", autoRefreshed = true)
public class ConfigController {
    @NacosValue(value = "${custom.property}", autoRefreshed = true)
    private String property;
}

组件选型建议

Netflix套件(传统方案)

  • 适用:已有项目,稳定运行
  • 问题:大部分已停更,Netflix不再维护

Alibaba套件(推荐方案)

  • Nacos 替代 Eureka + Config
  • Sentinel 替代 Hystrix
  • Dubbo 作为RPC调用方式

现代化方案

# 推荐组合
服务注册: Nacos / Consul
服务调用: Feign / Dubbo
负载均衡: LoadBalancer(取代Ribbon)
API网关: Gateway(取代Zuul)
熔断降级: Sentinel(取代Hystrix)
配置中心: Nacos Config / Apollo
链路追踪: SkyWalking / Jaeger

面试总结

SpringCloud核心组件包括:

  1. Eureka/Nacos - 服务注册发现
  2. Ribbon/LoadBalancer - 客户端负载均衡
  3. Feign - 声明式服务调用
  4. Hystrix/Sentinel - 熔断降级
  5. Gateway/Zuul - API网关
  6. Config/Nacos Config - 配置中心
  7. Sleuth + Zipkin - 链路追踪

目前Netflix套件大部分已停更,推荐使用Alibaba组件(Nacos、Sentinel)或其他开源方案。Gateway是新一代网关,性能优于Zuul。实际项目中需要根据团队技术栈、业务规模选择合适的组件组合。