Skip to content

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: master

15. 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=1

20. 服务雪崩

问题:什么是服务雪崩?如何防止?

答案

  • 服务雪崩:一个服务不可用导致整个系统不可用。
  • 防止方法
    • 使用熔断器
    • 使用限流
    • 使用降级
    • 使用超时
    • 使用重试

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网关统一入口。
  • 使用配置中心统一管理配置。
  • 使用分布式追踪跟踪调用链路。
  • 使用消息驱动实现异步通信。
  • 使用限流防止系统过载。
  • 使用降级保证系统的可用性。
  • 使用监控及时发现和解决问题。