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,就自动创建DataSourcebean。 -
起步依赖(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 开发对微服务架构的整体掌控力。