Appearance
Spring Cloud面试题
1. Spring Cloud的基本概念
问题:什么是Spring Cloud?
答案:
- Spring Cloud:基于Spring Boot的微服务框架,提供了一系列工具用于快速构建分布式系统。
- 特点:
- 服务注册与发现
- 配置管理
- 服务调用
- 负载均衡
- 熔断器
- API网关
- 分布式追踪
- 消息总线
2. Spring Cloud的核心组件
问题:Spring Cloud有哪些核心组件?
答案:
- Eureka:服务注册与发现
- Ribbon:客户端负载均衡
- Feign:声明式HTTP客户端
- Hystrix:熔断器
- Zuul:API网关
- Config:配置中心
- Sleuth:分布式追踪
- Stream:消息驱动
- Bus:消息总线
- Gateway:新一代API网关
3. 服务注册与发现
问题:什么是服务注册与发现?
答案:
- 服务注册:服务启动时将自己的信息注册到注册中心。
- 服务发现:服务消费者从注册中心获取服务提供者的信息。
- 作用:
- 实现服务的动态扩缩容
- 提高系统的可用性
- 简化服务间的调用
4. Eureka
问题:Eureka的架构是怎样的?
答案:
Eureka架构
├── Eureka Server(注册中心)
│ ├── 服务注册
│ ├── 服务发现
│ ├── 心跳检测
│ └── 故障转移
└── Eureka Client(服务客户端)
├── 服务提供者
└── 服务消费者5. Eureka的高可用
问题:如何实现Eureka的高可用?
答案:
- 多节点部署:部署多个Eureka Server节点。
- 相互注册:每个Eureka Server节点都向其他节点注册。
- 自我保护:Eureka Server在短时间内丢失大量心跳时进入自我保护模式。
示例:
yaml
# application.yml
server:
port: 8761
eureka:
instance:
hostname: eureka1
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http://eureka2:8762/eureka/,http://eureka3:8763/eureka/6. Ribbon
问题:Ribbon的作用是什么?
答案:
- Ribbon:客户端负载均衡器。
- 作用:
- 负载均衡
- 服务调用
- 故障转移
- 重试机制
7. Ribbon的负载均衡策略
问题:Ribbon有哪些负载均衡策略?
答案:
- RoundRobinRule:轮询策略
- RandomRule:随机策略
- RetryRule:重试策略
- WeightedResponseTimeRule:加权响应时间策略
- BestAvailableRule:最小并发策略
- AvailabilityFilteringRule:可用性过滤策略
- ZoneAvoidanceRule:区域感知策略
8. Feign
问题:Feign的作用是什么?
答案:
- Feign:声明式HTTP客户端。
- 作用:
- 简化服务调用
- 整合Ribbon实现负载均衡
- 整合Hystrix实现熔断
- 支持多种编码器和解码器
示例:
java
@FeignClient(name = "user-service", fallback = UserServiceFallback.class)
public interface UserService {
@GetMapping("/users/{id}")
User getUserById(@PathVariable("id") int id);
@PostMapping("/users")
User createUser(@RequestBody User user);
}
// 降级处理
@Component
public class UserServiceFallback implements UserService {
@Override
public User getUserById(int id) {
return new User();
}
@Override
public User createUser(User user) {
return new User();
}
}9. Hystrix
问题:Hystrix的作用是什么?
答案:
- Hystrix:熔断器,用于防止服务雪崩。
- 作用:
- 熔断
- 降级
- 隔离
- 限流
- 监控
10. Hystrix的熔断机制
问题:Hystrix的熔断机制是怎样的?
答案:
- 关闭状态:正常请求,失败率低于阈值。
- 打开状态:失败率高于阈值,熔断器打开,直接返回降级结果。
- 半开状态:一段时间后,熔断器进入半开状态,尝试发送请求,如果成功则关闭熔断器,否则继续打开。
11. Hystrix的隔离策略
问题:Hystrix有哪些隔离策略?
答案:
- 线程池隔离:为每个服务分配独立的线程池。
- 信号量隔离:使用信号量控制并发访问量。
示例:
java
@HystrixCommand(
fallbackMethod = "fallback",
commandProperties = {
@HystrixProperty(name = "execution.isolation.strategy", value = "THREAD"),
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "5000"),
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "20"),
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50"),
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "5000")
}
)
public String method() {
return "success";
}
public String fallback() {
return "fallback";
}12. Zuul
问题:Zuul的作用是什么?
答案:
- Zuul:API网关,用于统一入口。
- 作用:
- 路由转发
- 请求过滤
- 负载均衡
- 熔断
- 限流
13. Zuul的过滤器
问题:Zuul的过滤器有哪些类型?
答案:
- pre:在路由之前执行。
- routing:在路由时执行。
- post:在路由之后执行。
- error:在发生错误时执行。
示例:
java
@Component
public class PreFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
System.out.println("Request: " + request.getMethod() + " " + request.getRequestURL());
return null;
}
}14. Config
问题:Config的作用是什么?
答案:
- Config:配置中心,用于统一管理配置。
- 作用:
- 集中管理配置
- 支持多环境配置
- 支持配置的动态刷新
- 支持配置的版本管理
示例:
yaml
# application.yml
spring:
cloud:
config:
uri: http://localhost:8888
name: myapp
profile: dev
label: master15. Sleuth
问题:Sleuth的作用是什么?
答案:
- Sleuth:分布式追踪,用于跟踪请求在微服务间的调用链路。
- 作用:
- 生成追踪ID
- 记录调用链路
- 集成Zipkin、ELK等工具
16. Stream
问题:Stream的作用是什么?
答案:
- Stream:消息驱动,用于简化消息中间件的使用。
- 作用:
- 统一消息中间件的API
- 支持多种消息中间件
- 支持消息分组和分区
示例:
java
@EnableBinding(Source.class)
public class MessageSender {
@Autowired
private Source source;
public void sendMessage(String message) {
source.output().send(MessageBuilder.withPayload(message).build());
}
}
@EnableBinding(Sink.class)
public class MessageReceiver {
@StreamListener(Sink.INPUT)
public void receiveMessage(String message) {
System.out.println("Received: " + message);
}
}17. Bus
问题:Bus的作用是什么?
答案:
- Bus:消息总线,用于在微服务之间传播事件。
- 作用:
- 配置刷新
- 服务状态同步
- 事件广播
18. Gateway
问题:Gateway和Zuul有什么区别?
答案:
- Gateway:基于Spring WebFlux,使用Netty,性能更好。
- Zuul:基于Servlet,使用Tomcat,性能较差。
- Gateway:支持动态路由,功能更强大。
- Zuul:配置简单,易于使用。
19. Gateway的路由配置
问题:如何配置Gateway的路由?
答案:
yaml
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/users/**
filters:
- StripPrefix=1
- id: order-service
uri: lb://order-service
predicates:
- Path=/api/orders/**
filters:
- StripPrefix=120. 服务雪崩
问题:什么是服务雪崩?如何防止?
答案:
- 服务雪崩:一个服务不可用导致整个系统不可用。
- 防止方法:
- 使用熔断器
- 使用限流
- 使用降级
- 使用超时
- 使用重试
21. 服务降级
问题:什么是服务降级?如何实现?
答案:
- 服务降级:在服务不可用时,返回降级结果,保证系统的可用性。
- 实现方式:
- 使用Hystrix的fallback方法
- 使用Feign的fallback类
- 使用Sentinel的降级规则
22. 服务限流
问题:什么是服务限流?如何实现?
答案:
- 服务限流:限制服务的并发访问量,防止系统过载。
- 实现方式:
- 使用Guava RateLimiter
- 使用Sentinel
- 使用Redis + Lua脚本
- 使用Nginx限流
23. 分布式事务
问题:Spring Cloud如何实现分布式事务?
答案:
- 2PC(两阶段提交):强一致性,性能较差。
- TCC(Try-Confirm-Cancel):最终一致性,性能较好。
- SAGA:长事务解决方案,适合业务流程复杂的情况。
- 本地消息表:基于消息的最终一致性方案。
- 事务消息:使用RocketMQ等消息中间件的事务消息。
24. 服务网格
问题:什么是服务网格?Spring Cloud和服务网格有什么区别?
答案:
- 服务网格:基础设施层,用于处理服务间的通信。
- 区别:
- Spring Cloud是应用层框架,需要修改代码。
- 服务网格是基础设施层,不需要修改代码。
- 服务网格提供更强大的功能,如流量管理、安全、监控等。
25. Spring Cloud的最佳实践
问题:使用Spring Cloud的最佳实践有哪些?
答案:
- 使用服务注册与发现实现服务的动态扩缩容。
- 使用负载均衡提高系统的可用性。
- 使用熔断器防止服务雪崩。
- 使用API网关统一入口。
- 使用配置中心统一管理配置。
- 使用分布式追踪跟踪调用链路。
- 使用消息驱动实现异步通信。
- 使用限流防止系统过载。
- 使用降级保证系统的可用性。
- 使用监控及时发现和解决问题。
