1.1 java面试题:springboot 和springcloud

Spring Boot 和 Spring Cloud 是 Java 微服务领域的双子星,也是面试必考的核心框架。老练的 Java 工程师不能只回答"Boot 简化开发,Cloud 做微服务",而要能从设计理念、核心机制、生态关系、银行实际落地几个维度来阐述,并给出可落地的代码案例。下面我以你的银行核心开发背景为基础,把这两个框架讲透。


一、Spring Boot:微服务的"基石"

1. 一句话定位

Spring Boot 是构建独立、生产级 Spring 应用的快速启动脚手架,它的核心是"约定优于配置",通过自动配置和起步依赖让开发人员只需专注于业务逻辑。

2. 核心特性与原理

  • 自动配置(Auto-Configuration)

    @SpringBootApplication 中的 @EnableAutoConfiguration 会触发 SpringFactoriesLoader 扫描 classpath 下的 META-INF/spring.factories,加载所有 AutoConfiguration 类,通过条件注解(@ConditionalOnClass@ConditionalOnMissingBean 等)按需装配。比如 classpath 上有 HikariCP 且没有自定义 DataSource,就自动创建 DataSource bean。

  • 起步依赖(Starters)

    将一组相关依赖打包(如 spring-boot-starter-web 包含 Tomcat、SpringMVC、Jackson),避免版本冲突。银行项目中我们统一管理 spring-boot-starter-parent 的版本。

  • 内嵌容器

    直接打包为可执行 jar(内嵌 Tomcat / Jetty / Undertow),java -jar 即可运行,适合容器化部署。

  • 外部化配置

    通过 application.yml / 环境变量 / 配置中心(如 Nacos)动态管理配置,支持多环境 profile。

  • Actuator 监控

    暴露 /health/metrics/info 等端点,集成 Prometheus 做生产监控。

3. 银行场景实践

我们所有微服务都是 Spring Boot 应用。例如存款服务:

java 复制代码
@SpringBootApplication
@EnableDiscoveryClient  // 注册到 Nacos
@EnableFeignClients      // 启用 Feign 远程调用
public class DepositApplication {
    public static void main(String[] args) {
        SpringApplication.run(DepositApplication.class, args);
    }
}
yaml 复制代码
# application.yml
server:
  port: 8081
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/bank_deposit
    username: ${DB_USER}
    password: ${DB_PASS}
  cloud:
    nacos:
      discovery:
        server-addr: 10.0.0.1:8848
    sentinel:
      transport:
        dashboard: 10.0.0.2:8080

通过 Actuator 暴露健康检查,确保探活机制在容器平台(K8s)上正常工作。


二、Spring Cloud:微服务的"管家"

1. 一句话定位

Spring Cloud 是基于 Spring Boot 的分布式系统解决方案集,它提供了微服务架构中需要的服务发现、配置管理、负载均衡、远程调用、熔断降级、网关、消息驱动等一套组件,让开发者能快速搭建高可用的分布式系统。

2. 核心组件与原理(银行常用选型)

我们主要使用 Spring Cloud Alibaba 栈(符合国产化信创要求),组件如下:

功能 组件 作用
服务注册与发现 Nacos 替代 Eureka,同时做配置中心
负载均衡 Spring Cloud LoadBalancer 替代 Ribbon,客户端负载均衡
远程调用 OpenFeign 声明式 HTTP 客户端,集成 LoadBalancer
熔断降级 Sentinel 流量控制、熔断、系统自适应保护
网关 Spring Cloud Gateway 统一入口,路由、过滤、鉴权
配置中心 Nacos Config 动态刷新配置,无需重启
分布式事务 Seata 解决跨服务数据一致性
链路追踪 SkyWalking 跟踪调用链,定位性能瓶颈

3. 银行微服务架构示意图

复制代码
外部请求 → Spring Cloud Gateway(鉴权+限流+路由)
             ├─→ 客户服务(Customer Service)
             ├─→ 存款服务(Deposit Service)
             │    └─→ Feign → 贷款服务(Loan Service)
             └─→ 贷款服务(Loan Service)
                  └─→ Feign → 核心账户服务(Core Account Service)
所有服务注册到 Nacos,配置从 Nacos Config 拉取
Sentinel 控制台监控 QPS/线程数,设置降级规则
Seata 管理分布式事务
SkyWalking 监控调用链

4. 关键代码案例

服务间调用(OpenFeign)
java 复制代码
// 存款服务调用贷款服务进行联合查询
@FeignClient(name = "loan-service", fallbackFactory = LoanClientFallbackFactory.class)
public interface LoanClient {
    @GetMapping("/loan/info/{loanId}")
    LoanInfoDTO getLoanInfo(@PathVariable String loanId);
}

// 熔断降级工厂
@Component
public class LoanClientFallbackFactory implements FallbackFactory<LoanClient> {
    @Override
    public LoanClient create(Throwable cause) {
        return loanId -> {
            log.error("调用贷款服务失败: {}", cause.getMessage());
            return new LoanInfoDTO(); // 返回空对象或缓存的旧值
        };
    }
}
Sentinel 限流
java 复制代码
// 在控制台中为 deposit-service 的接口设置 QPS=100 的限流规则
// 代码中处理限流异常(BlockException),或者直接使用注解
@SentinelResource(value = "deposit", blockHandler = "handleBlock")
public String deposit(String account, BigDecimal amount) {
    // 核心存款逻辑
    return "success";
}

public String handleBlock(String account, BigDecimal amount, BlockException ex) {
    return "系统繁忙,请稍后重试";
}
Nacos 配置中心动态刷新
java 复制代码
@RestController
@RefreshScope   // 配置变更后自动刷新
public class RateController {
    @Value("${loan.rate}")
    private BigDecimal loanRate;

    @GetMapping("/rate")
    public BigDecimal getRate() {
        return loanRate;
    }
}

配置在 Nacos 中修改 loan-rate 后,无需重启服务即可生效。

Gateway 网关
yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: deposit-route
          uri: lb://deposit-service
          predicates:
            - Path=/deposit/**
          filters:
            - StripPrefix=1
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 10
                redis-rate-limiter.burstCapacity: 20

这样网关层就能做初步限流和路由转发。

5. 分布式事务处理(结合你之前的 TCC 经验)

在 Spring Cloud 环境中,我们使用 Seata 的 AT 模式或 TCC 模式。在发起服务上用 @GlobalTransactional 注解,Seata 自动传递 XID 给下游服务,结合 TCC 接口实现资源预留和确认/取消。

6. 链路追踪

集成 SkyWalking Agent,JVM 参数加 -javaagent:/path/skywalking-agent.jar,自动采集调用链,在 SkyWalking UI 中观察服务的拓扑图、每个 span 的耗时、慢查询等。


三、Spring Boot 与 Spring Cloud 的关系

  • Spring Cloud 是基于 Spring Boot 的,它利用 Boot 的自动配置和起步依赖来简化各个组件的集成。没有 Boot,Cloud 的整合会异常复杂。
  • Spring Boot 负责单个微服务的构建,Spring Cloud 负责把这些微服务串联成一个完整的分布式系统。
  • 在银行项目中,我们用 Boot 开发每个微服务,用 Cloud 治理微服务集群。

四、面试模板话术

"Spring Boot 我理解是微服务的构建基石,通过自动配置和起步依赖快速创建独立应用。我们所有银行服务都是 Boot 应用,利用 Actuator 做健康检查,配置文件分环境管理。

Spring Cloud 则是一套微服务治理方案,我们用了 Alibaba 全家桶:Nacos 做注册中心和配置中心,Feign 做服务调用,Sentinel 做熔断限流,Gateway 做网关,Seata 解决分布式事务,SkyWalking 做链路追踪。

在放款流程中,贷款服务通过 Feign 调用核心账户服务,Feign 集成了 LoadBalancer 实现负载均衡,Sentinel 对接口做 QPS 限流保护,Seata 的 TCC 模式保证资源预留和最终一致。配置在 Nacos 上动态刷新,链路追踪帮助定位慢接口。这就是我在银行核心系统中对这两个框架的落地实践。"

这样回答既有理论高度,又有具体的组件选型和生产代码案例,能充分展现你作为高级 Java 开发对微服务架构的整体掌控力。