MST
星途 面试题库

面试题:微服务架构Spring Cloud服务治理的跨域问题及分布式事务处理

在Spring Cloud构建的微服务架构中,不同服务可能部署在不同的域下,从而面临跨域问题。请描述如何在服务治理层面优雅地解决跨域问题。同时,当涉及多个微服务之间的数据一致性操作时,谈谈你对分布式事务处理的理解以及在Spring Cloud中实现分布式事务的常用方案,并分析它们各自的优缺点。
43.9万 热度难度
后端开发微服务架构

知识考点

AI 面试

面试题答案

一键面试

解决Spring Cloud微服务架构跨域问题

  1. 在网关层处理跨域
    • 原理:Spring Cloud Gateway作为微服务架构中的网关,是请求进入微服务的入口。可以通过配置网关的CORS(Cross - Origin Resource Sharing)过滤器来解决跨域问题。
    • 配置示例
    spring:
      cloud:
        gateway:
          globalcors:
            cors - configurations:
              '[/**]':
                allowedOrigins: "*"
                allowedMethods: GET,POST,PUT,DELETE,OPTIONS
                allowedHeaders: "*"
    
    • 优点:集中处理跨域问题,所有进入微服务的请求都经过网关,统一配置管理方便,且对下游微服务透明,不需要在每个微服务中单独配置跨域。
    • 缺点:如果网关配置出现问题,可能影响所有微服务的跨域处理。
  2. 在微服务内部处理跨域
    • 原理:在Spring Boot应用(微服务)中,可以通过配置WebMvcConfigureraddCorsMappings方法来处理跨域。
    • 配置示例
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.CorsRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    @Configuration
    public class CorsConfig implements WebMvcConfigurer {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                   .allowedOrigins("*")
                   .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                   .allowedHeaders("*");
        }
    }
    
    • 优点:每个微服务可以根据自身需求定制跨域配置,灵活性较高。
    • 缺点:需要在每个微服务中配置,维护成本相对较高。

分布式事务处理理解及Spring Cloud常用方案

  1. 分布式事务处理理解
    • 定义:分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。它需要保证在多个分布式环境下的数据一致性。
    • 难点:网络延迟、节点故障等问题会导致分布式事务处理复杂,传统的本地事务ACID特性在分布式环境下难以完全满足,CAP理论指出在分布式系统中,一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)无法同时满足,通常需要在三者之间进行权衡。
  2. Spring Cloud中实现分布式事务的常用方案
    • XA协议
      • 原理:XA是一种分布式事务协议,由事务管理器(TM)和资源管理器(RM)组成。TM负责协调多个RM的事务,RM负责管理本地资源。在事务开始时,TM向所有RM发起准备(Prepare)操作,RM执行本地事务并返回准备结果。如果所有RM都准备成功,TM发起提交(Commit)操作,否则发起回滚(Rollback)操作。
      • 优点:严格遵循ACID原则,保证强一致性。
      • 缺点:性能开销大,所有资源在整个事务过程中都被锁定,可能导致长时间的资源等待,而且实现复杂,需要数据库等资源管理器的支持。
    • TCC(Try - Confirm - Cancel)模式
      • 原理:业务逻辑分三个阶段,Try阶段对业务资源进行初步操作,预留资源;Confirm阶段对Try阶段的操作进行确认提交;Cancel阶段对Try阶段的操作进行回滚。这三个阶段都由业务代码实现,不依赖数据库的事务机制。
      • 优点:性能较好,不需要长时间锁定资源,适用于高并发场景。
      • 缺点:业务侵入性强,每个业务操作都需要实现三个阶段的代码,开发成本高,而且实现难度较大,需要处理幂等性等问题。
    • 可靠消息最终一致性方案
      • 原理:通过消息中间件来协调事务。当一个事务发生时,先将消息发送到消息队列,其他微服务从消息队列消费消息并处理相关业务。如果消息处理失败,可以进行重试等操作,最终保证数据一致性。
      • 优点:解耦性好,微服务之间通过消息进行通信,降低了耦合度,而且对业务侵入性相对较小,实现相对简单。
      • 缺点:一致性是最终一致性,不是强一致性,可能存在短暂的数据不一致情况,并且依赖消息中间件的可靠性,如果消息丢失等问题可能导致一致性问题。
    • Saga模式
      • 原理:将长事务分解为多个本地短事务,每个本地事务有对应的补偿事务。当某个本地事务失败时,按照相反顺序调用之前成功的本地事务的补偿事务来进行回滚。
      • 优点:对业务的侵入性相对较小,不需要像TCC那样每个操作都实现三个阶段,而且适合长事务场景。
      • 缺点:事务回滚时,如果某个补偿事务失败,可能需要人工干预,并且实现复杂,需要管理各个本地事务和补偿事务的顺序。