Spring Cloud知识点总结
·
Spring Cloud 面试核心知识点详解
前言
Spring Cloud 作为微服务架构的事实标准,是 Java 技术栈面试中的重中之重。本文整理了 Spring Cloud 面试中最常见的核心知识点,从基础概念到高级特性,帮助你在面试中从容应对。
一、微服务基础概念
1.1 什么是微服务架构?
微服务架构是一种将单一应用程序划分为一组小服务的架构风格,每个服务运行在自己的进程中,服务之间通过轻量级通信机制(如 HTTP API)进行通信。
核心特点:
- 围绕业务能力组织服务
- 分散治理和数据管理
- 独立部署和扩展
- 技术异构性
1.2 为什么选择 Spring Cloud?
Spring Cloud 基于 Spring Boot,为开发者提供了快速构建分布式系统所需的工具集,包括配置管理、服务发现、断路器、智能路由、微代理、控制总线等。
二、服务注册与发现
2.1 Eureka 原理与架构
面试题:请简述 Eureka 的工作流程
Eureka 采用 C-S 架构,包含两个核心组件:
- Eureka Server:服务注册中心
- Eureka Client:服务提供者和消费者
// Eureka Server 配置示例
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
工作流程:
- 服务注册:服务启动时向 Eureka Server 发送 REST 请求,将自己的信息注册到 Server
- 心跳续约:Client 每 30 秒发送一次心跳,表明自己还活着
- 服务发现:消费者从 Server 获取服务列表并缓存到本地
- 服务下线:服务正常关闭时发送下线请求,Server 将其从注册表中移除
- 故障剔除:Server 在 90 秒内没有收到心跳,则将该服务从注册表中剔除
2.2 Nacos 与 Eureka 对比
| 特性 | Nacos | Eureka |
|---|---|---|
| 一致性协议 | AP+CP | AP |
| 健康检查 | 支持 TCP/HTTP/MYSQL | Client 心跳 |
| 配置管理 | 支持 | 不支持 |
| 负载均衡 | 支持权重/元数据 | Ribbon |
| 雪崩保护 | 支持 | 支持 |
三、服务调用
3.1 Ribbon 负载均衡
面试题:Ribbon 的负载均衡策略有哪些?
@Configuration
public class RibbonConfig {
@Bean
public IRule ribbonRule() {
// 随机策略
return new RandomRule();
// 轮询策略
// return new RoundRobinRule();
// 重试策略
// return new RetryRule();
}
}
常见策略:
- RoundRobinRule:轮询
- RandomRule:随机
- AvailabilityFilteringRule:先过滤掉故障实例,再选择并发较小的实例
- WeightedResponseTimeRule:根据响应时间分配权重
- RetryRule:重试机制
- BestAvailableRule:选择并发请求最小的实例
-
3.2 OpenFeign 声明式调用
面试题:Feign 和 OpenFeign 的区别?
Feign 是 Netflix 开发的声明式 HTTP 客户端,OpenFeign 是 Spring Cloud 对其的增强版本,支持 Spring MVC 注解。
@FeignClient(name = "user-service", fallback = UserFallback.class)
public interface UserFeignClient {
@GetMapping("/user/{id}")
User getUserById(@PathVariable("id") Long id);
@PostMapping("/user")
User createUser(@RequestBody User user);
}
核心特性:
- 集成 Ribbon 实现负载均衡
- 集成 Hystrix 实现熔断降级
- 支持请求压缩和日志打印
- 可自定义编码器/解码器
四、服务容错保护
4.1 Hystrix 熔断器
面试题:Hystrix 的工作原理是什么?
// 服务熔断示例
@HystrixCommand(fallbackMethod = "fallbackMethod",
commandProperties = {
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "5000"),
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60")
})
public String requestService() {
// 业务逻辑
return restTemplate.getForObject("http://service/user", String.class);
}
熔断器状态机:
- CLOSED:关闭状态,允许请求通过,统计失败次数
- OPEN:打开状态,直接返回错误,不调用服务
- HALF_OPEN:半开状态,尝试放行部分请求,判断服务是否恢复
工作流程:
- 每次请求调用 HystrixCommand 的 run() 方法
- 判断熔断器是否打开,如果是则直接执行 fallback
- 判断线程池/信号量是否已满,如果是则执行 fallback
- 执行 run() 方法,如果超时或异常则执行 fallback
- 统计失败率,达到阈值则打开熔断器
4.2 Sentinel 新一代容错组件
面试题:Sentinel 相比 Hystrix 有哪些优势?
- 丰富的流控规则:QPS 限流、线程数限流、关联限流、链路限流
- 实时监控:提供控制台实时监控数据
- 系统自适应保护:根据系统负载自动调整流量
- 熔断降级:支持平均响应时间、异常比例、异常数等多种降级策略
@RestController
public class TestController {
@GetMapping("/test")
@SentinelResource(value = "test",
blockHandler = "handleBlock",
fallback = "handleFallback")
public String test() {
// 业务逻辑
return "success";
}
public String handleBlock(BlockException ex) {
return "被限流了";
}
public String handleFallback(Throwable t) {
return "业务异常";
}
}
五、API 网关
5.1 Gateway 核心概念
面试题:Spring Cloud Gateway 的工作原理是什么?
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/user/**
filters:
- AddRequestHeader=X-Request-Foo, Bar
- name: Hystrix
args:
name: fallbackcmd
fallbackUri: forward:/fallback
核心组件:
- Route:路由的基本构建块,包含 ID、目标 URI、断言集合和过滤器集合
- Predicate:断言,匹配 HTTP 请求的所有属性
- Filter:过滤器,可以在请求被路由前后修改请求和响应
执行流程:
- Gateway Handler 接收到请求
- 通过 Predicate 判断请求匹配哪个 Route
- 通过过滤器链处理请求(pre 和 post)
- 转发请求到具体的微服务
- 返回响应
5.2 网关对比:Zuul vs Gateway
| 特性 | Spring Cloud Gateway | Zuul 1.x |
|---|---|---|
| 实现方式 | WebFlux + Netty | Servlet + Tomcat |
| 性能 | 高(异步非阻塞) | 低(同步阻塞) |
| 长连接 | 支持 WebSocket | 不支持 |
| 限流 | 内置 | 需集成 |
| 社区活跃度 | 高 | 低 |
六、配置中心
6.1 Spring Cloud Config
面试题:配置中心的实现原理?
@RefreshScope
@RestController
public class ConfigController {
@Value("${config.info:default}")
private String configInfo;
@GetMapping("/config")
public String getConfig() {
return configInfo;
}
}
工作流程:
- 配置服务端从 Git 仓库拉取配置
- 配置客户端启动时从服务端获取配置
- 配置变更时,通过 Spring Cloud Bus 广播刷新事件
- 客户端收到事件后,通过 @RefreshScope 动态刷新配置
七、服务追踪
7.1 Sleuth + Zipkin
面试题:分布式链路追踪的实现原理是什么?
// 添加依赖后自动集成
@Bean
public AlwaysSampler defaultSampler() {
return new AlwaysSampler();
}
// 日志输出示例
2024-01-15 10:15:30.123 INFO [user-service,5f3a7b2c,8e4d2f1a,true]
核心概念:
- Trace ID:整个请求链路的唯一标识
- Span ID:单个服务的唯一标识
- Parent ID:父服务的 Span ID
- Annotations:记录事件时间
八、面试常见场景题
8.1 微服务架构中如何处理分布式事务?
常见解决方案:
- 两阶段提交(2PC):强一致性,性能较差
- TCC(Try-Confirm-Cancel):性能好,业务侵入性强
- 可靠消息最终一致性:使用 RocketMQ 等消息中间件
- 最大努力通知:定期同步,适用于对实时性要求不高的场景
8.2 如何保证微服务的安全性?
安全策略:
- OAuth2 + JWT:统一的认证授权中心
- API 网关层鉴权:在网关层验证 Token
- 服务间通信加密:HTTPS 或双向 SSL
- 接口防刷限流:Sentinel 限流
- 黑白名单机制:IP 限制
8.3 微服务部署策略有哪些?
- 蓝绿部署:两套环境切换,零停机
- 灰度发布:部分用户先体验新版本
- 滚动更新:逐个实例更新
- A/B 测试:不同版本同时运行,对比效果
九、源码分析要点
9.1 服务发现源码流程
// Eureka Client 启动流程
1. DiscoveryClient.init() 初始化
2. DiscoveryClient.fetchRegistry() 获取注册表
3. DiscoveryClient.register() 注册服务
4. DiscoveryClient.renew() 发送心跳
5. DiscoveryClient.cancel() 服务下线
9.2 Ribbon 负载均衡源码
// LoadBalancerClient.execute()
6. 获取服务列表
7. 通过 IRule 选择实例
8. 重构请求 URL
9. 发起实际请求
10. 处理重试机制
十、总结
Spring Cloud 微服务架构的核心技术栈:
- 服务治理:Eureka/Nacos
- 远程调用:Feign + Ribbon
- 容错保护:Sentinel/Hystrix
- API 网关:Gateway
- 配置中心:Config/Nacos
- 链路追踪:Sleuth + Zipkin
- 消息总线:Bus
- 安全认证:Security + OAuth2
面试建议:
- 理解原理比死记硬背更重要
- 结合实际项目经验,说明遇到的问题和解决方案
- 关注最新技术动态,如 Service Mesh、K8s 等
- 对比不同组件的优缺点,展现思考深度
希望本文能帮助你在 Spring Cloud 面试中取得好成绩!如果觉得有帮助,欢迎收藏和分享。
更多推荐




所有评论(0)