核心组件概览
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核心组件包括:
- Eureka/Nacos - 服务注册发现
- Ribbon/LoadBalancer - 客户端负载均衡
- Feign - 声明式服务调用
- Hystrix/Sentinel - 熔断降级
- Gateway/Zuul - API网关
- Config/Nacos Config - 配置中心
- Sleuth + Zipkin - 链路追踪
目前Netflix套件大部分已停更,推荐使用Alibaba组件(Nacos、Sentinel)或其他开源方案。Gateway是新一代网关,性能优于Zuul。实际项目中需要根据团队技术栈、业务规模选择合适的组件组合。