面试题答案
一键面试整体架构设计思路
- 服务调用链路追踪:使用Spring Cloud Sleuth为每个请求生成唯一的追踪ID,并将其传递到整个服务调用链中。这样可以方便在分布式系统中定位问题,了解请求在各个服务间的流转情况。
- 服务容错处理:利用Hystrix实现服务的熔断、降级和线程隔离。当某个服务出现故障或响应时间过长时,Hystrix可以快速熔断,防止故障扩散,并提供降级策略,保证系统的基本可用性。
- 事务一致性保障:采用分布式事务解决方案,如使用Seata来管理全局事务。Seata通过TC(事务协调者)、TM(事务管理器)和RM(资源管理器)的协同工作,保证多个服务间的事务一致性。
关键技术点
- Spring Cloud Sleuth
- 依赖引入:在各个微服务的
pom.xml
文件中引入spring-cloud-starter-sleuth
依赖。 - 自动配置:Spring Boot会自动配置Sleuth,为每个请求生成
TraceId
和SpanId
。通过日志框架(如Logback)配置,将这些ID打印到日志中,方便追踪。 - Zipkin集成:可以进一步集成Zipkin,它是一个分布式追踪系统。引入
spring-cloud-starter-zipkin
依赖,配置Zipkin服务器地址,Sleuth会将追踪数据发送到Zipkin,在Zipkin的UI界面上直观查看服务调用链路。
- 依赖引入:在各个微服务的
- Hystrix
- 依赖引入:在需要容错处理的微服务
pom.xml
中引入spring-cloud-starter-netflix-hystrix
依赖。 - 注解使用:在服务调用方法上使用
@HystrixCommand
注解,指定降级方法。例如:
- 依赖引入:在需要容错处理的微服务
@Service
public class SomeService {
@HystrixCommand(fallbackMethod = "fallbackMethod")
public String someMethod() {
// 正常服务调用逻辑
}
public String fallbackMethod() {
// 降级逻辑,返回兜底数据
}
}
- **线程隔离**:Hystrix默认使用线程池隔离策略,每个服务调用在独立的线程池中执行,防止某个服务的故障耗尽整个应用的资源。可以通过配置文件调整线程池大小等参数。
- **熔断策略**:Hystrix根据失败率、请求量等指标动态决定是否熔断。可以配置`circuitBreaker.requestVolumeThreshold`(请求量阈值)、`circuitBreaker.errorThresholdPercentage`(失败率阈值)等参数来调整熔断策略。
3. Seata
- 环境搭建:下载并启动Seata Server,作为事务协调者。
- 依赖引入:在各个参与分布式事务的微服务pom.xml
中引入seata-spring-boot-starter
依赖。
- 配置调整:在微服务的application.yml
文件中配置Seata相关参数,如事务组名称、Seata Server地址等。
- 注解使用:在发起全局事务的服务方法上使用@GlobalTransactional
注解,标记该方法为全局事务的入口。例如:
@Service
public class TransactionService {
@GlobalTransactional
public void globalTransactionMethod() {
// 调用其他微服务的事务方法
}
}
在每个参与事务的微服务方法上使用@Transactional
注解,保证本地事务的一致性。Seata会协调各个微服务的本地事务,实现全局事务的一致性。