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@SpringBootApplicationpublicclassEurekaServerApplication{publicstaticvoidmain(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 的负载均衡策略有哪些?
@ConfigurationpublicclassRibbonConfig{@BeanpublicIRuleribbonRule(){// 随机策略returnnewRandomRule();// 轮询策略// 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)publicinterfaceUserFeignClient{@GetMapping("/user/{id}")UsergetUserById(@PathVariable("id")Longid);@PostMapping("/user")UsercreateUser(@RequestBodyUseruser);}核心特性:
- 集成 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")})publicStringrequestService(){// 业务逻辑returnrestTemplate.getForObject("http://service/user",String.class);}熔断器状态机:
- CLOSED:关闭状态,允许请求通过,统计失败次数
- OPEN:打开状态,直接返回错误,不调用服务
- HALF_OPEN:半开状态,尝试放行部分请求,判断服务是否恢复
工作流程:
- 每次请求调用 HystrixCommand 的 run() 方法
- 判断熔断器是否打开,如果是则直接执行 fallback
- 判断线程池/信号量是否已满,如果是则执行 fallback
- 执行 run() 方法,如果超时或异常则执行 fallback
- 统计失败率,达到阈值则打开熔断器
4.2 Sentinel 新一代容错组件
面试题:Sentinel 相比 Hystrix 有哪些优势?
- 丰富的流控规则:QPS 限流、线程数限流、关联限流、链路限流
- 实时监控:提供控制台实时监控数据
- 系统自适应保护:根据系统负载自动调整流量
- 熔断降级:支持平均响应时间、异常比例、异常数等多种降级策略
@RestControllerpublicclassTestController{@GetMapping("/test")@SentinelResource(value="test",blockHandler="handleBlock",fallback="handleFallback")publicStringtest(){// 业务逻辑return"success";}publicStringhandleBlock(BlockExceptionex){return"被限流了";}publicStringhandleFallback(Throwablet){return"业务异常";}}五、API 网关
5.1 Gateway 核心概念
面试题:Spring Cloud Gateway 的工作原理是什么?
spring:cloud:gateway:routes:-id:user-serviceuri:lb://user-servicepredicates:-Path=/user/**filters:-AddRequestHeader=X-Request-Foo,Bar-name:Hystrixargs:name:fallbackcmdfallbackUri: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@RestControllerpublicclassConfigController{@Value("${config.info:default}")privateStringconfigInfo;@GetMapping("/config")publicStringgetConfig(){returnconfigInfo;}}工作流程:
- 配置服务端从 Git 仓库拉取配置
- 配置客户端启动时从服务端获取配置
- 配置变更时,通过 Spring Cloud Bus 广播刷新事件
- 客户端收到事件后,通过 @RefreshScope 动态刷新配置
七、服务追踪
7.1 Sleuth + Zipkin
面试题:分布式链路追踪的实现原理是什么?
// 添加依赖后自动集成@BeanpublicAlwaysSamplerdefaultSampler(){returnnewAlwaysSampler();}// 日志输出示例2024-01-1510:15:30.123INFO[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.重构请求URL9.发起实际请求10.处理重试机制十、总结
Spring Cloud 微服务架构的核心技术栈:
- 服务治理:Eureka/Nacos
- 远程调用:Feign + Ribbon
- 容错保护:Sentinel/Hystrix
- API 网关:Gateway
- 配置中心:Config/Nacos
- 链路追踪:Sleuth + Zipkin
- 消息总线:Bus
- 安全认证:Security + OAuth2
面试建议:
- 理解原理比死记硬背更重要
- 结合实际项目经验,说明遇到的问题和解决方案
- 关注最新技术动态,如 Service Mesh、K8s 等
- 对比不同组件的优缺点,展现思考深度
希望本文能帮助你在 Spring Cloud 面试中取得好成绩!如果觉得有帮助,欢迎收藏和分享。
