Java面试全攻略:Spring生态与微服务架构实战
Java面试全攻略:Spring生态与微服务架构实战
面试现场:技术终面室
面试官:谢飞机同学,请坐。今天我们将围绕Spring生态和微服务架构进行技术评估。 谢飞机:(紧张地搓手)面试官好!我对Spring全家桶特别熟悉,Boot、Cloud、Security...名字我都能背!
第一轮:Spring核心技术
面试官:请详细描述Spring Boot的自动配置原理,以及如何实现一个自定义starter? 谢飞机:(眼睛一亮)自动配置就是@EnableAutoConfiguration注解!它会扫描META-INF/spring.factories里的配置类!自定义starter需要创建autoconfigure模块,写@Configuration类,再在spring.factories里注册! 面试官:(点头)不错。Spring Bean的生命周期有哪些阶段?如何实现Bean的延迟初始化? 谢飞机:创建实例→设置属性→初始化回调→使用→销毁回调!延迟初始化用@Lazy注解!对,就是这样! 面试官:Spring事务的传播机制有哪些?什么情况下事务会失效? 谢飞机:(挠头)传播机制有REQUIRED、REQUIRES_NEW...大概七种!事务失效...非public方法?对,还有自调用! 面试官:Spring Security和Shiro的核心区别是什么?如何实现基于RBAC的权限控制? 谢飞机:Security功能更全,Shiro更轻量!RBAC就是角色基础访问控制,在Security里用@PreAuthorize注解!
第二轮:微服务架构设计
面试官:微服务之间的通信方式有哪些?REST和gRPC各有什么优缺点? 谢飞机:(自信地)有同步和异步!REST用HTTP/JSON,简单但性能一般;gRPC用HTTP/2和Protobuf,性能好但学习曲线陡! 面试官:Spring Cloud和Dubbo的技术选型对比?如何解决微服务的服务发现问题? 谢飞机:Spring Cloud全家桶齐全,Dubbo性能好!服务发现用Eureka或Nacos,注册中心存服务地址! 面试官:如何设计一个高可用的微服务架构?熔断和限流有哪些实现方案? 谢飞机:(语速加快)集群部署!多可用区!熔断用Resilience4j或Sentinel!限流用令牌桶或漏桶算法! 面试官:Kafka的高可用机制是什么?如何保证消息不丢失? 谢飞机:分区副本机制!ISR同步副本!消息不丢失要设置acks=all,retries=MAX,还有消费者手动提交offset!
第三轮:性能优化与架构实战
面试官:Redis的持久化机制有哪些?如何优化Redis的内存使用? 谢飞机:RDB和AOF!RDB快但可能丢数据,AOF安全但慢!内存优化用合理的数据结构,设置过期时间,还有内存淘汰策略! 面试官:数据库索引失效的场景有哪些?如何优化慢查询? 谢飞机:(掰手指)like以%开头、用函数、类型转换、OR条件...优化慢查询加索引,SQL改写,分库分表! 面试官:分布式事务的解决方案有哪些?Seata的AT模式原理是什么? 谢飞机:(眼神飘忽)2PC、TCC、Saga...Seata AT模式是基于undo log的补偿机制!对,就是记录前镜像和后镜像! 面试官:如何在Spring Boot项目中集成AI能力?Spring AI有哪些核心功能? 谢飞机:(紧张地)用Spring AI!它封装了OpenAI、Azure等API!有Prompt模板、向量存储、函数调用这些功能! 面试官:(合上电脑)今天的面试就到这里,感谢你的参与,请回家等通知。 谢飞机:(如释重负)好的好的!我这就回去等,手机24小时开机!
技术点深度解析
一、Spring核心技术
-
Spring Boot自动配置原理
- 核心注解:@SpringBootApplication = @Configuration + @ComponentScan + @EnableAutoConfiguration
- 自动配置流程:
- @EnableAutoConfiguration注解导入AutoConfigurationImportSelector
- 扫描classpath下META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件
- 根据@Conditional条件注解决定是否生效对应配置类
- 自定义starter步骤:
- 创建autoconfigure模块,编写自动配置类
- 在resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports中注册配置类
- 创建starter模块,引入autoconfigure模块
- 打包发布
-
Spring事务传播机制 | 传播行为 | 说明 | |---------|------| | REQUIRED | 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务 | | SUPPORTS | 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行 | | MANDATORY | 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常 | | REQUIRES_NEW | 创建一个新的事务,如果当前存在事务,则把当前事务挂起 | | NOT_SUPPORTED | 以非事务方式运行,如果当前存在事务,则把当前事务挂起 | | NEVER | 以非事务方式运行,如果当前存在事务,则抛出异常 | | NESTED | 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于REQUIRED |
二、微服务架构设计
-
服务通信方式对比 | 特性 | REST API | gRPC | |------|----------|------| | 传输协议 | HTTP/1.1 | HTTP/2 | | 数据格式 | JSON | Protocol Buffers | | 性能 | 一般 | 高(二进制传输,多路复用) | | 易用性 | 高(人类可读) | 中(需定义.proto文件) | | 生态 | 丰富 | 正在发展 | | 适用场景 | 外部API,简单服务通信 | 内部微服务,高性能需求场景 |
-
Kafka高可用机制
- 分区副本机制:每个主题分区有多个副本,一个Leader和多个Follower
- ISR机制:只有在ISR(In-Sync Replicas)列表中的副本才能成为Leader
- 故障转移:当Leader副本故障时,从ISR中选举新的Leader
- 数据可靠性保证:
- producer端:acks=all(等待所有ISR副本确认)
- broker端:min.insync.replicas设置最小同步副本数
- consumer端:enable.auto.commit=false手动提交offset
三、性能优化实战
-
Redis内存优化策略
- 合理选择数据结构:
- 小整数用int编码
- 短字符串用embstr编码
- 哈希表控制在ziplist编码范围
- 设置过期时间:使用EXPIRE/PEXPIRE命令
- 内存淘汰策略:maxmemory-policy选择合适策略(如volatile-lru)
- 内存碎片优化:开启activedefrag
- 数据压缩:使用Redis Modules如RedisZstd
- 合理选择数据结构:
-
分布式事务解决方案
- 2PC(两阶段提交):
- 准备阶段:协调者询问所有参与者是否准备就绪
- 提交阶段:所有参与者就绪则提交,否则回滚
- 缺点:同步阻塞,协调者单点故障
- TCC(Try-Confirm-Cancel):
- Try:资源检查和预留
- Confirm:确认执行业务操作
- Cancel:取消执行业务操作
- 优点:性能好,无锁;缺点:侵入业务代码
- Saga模式:
- 长事务拆分为多个本地事务
- 每个事务失败时调用补偿操作
- 实现方式:编排式和协同式
- Seata AT模式:
- 基于undo/redo日志的补偿机制
- 自动生成补偿SQL
- 低侵入性,性能较好
- 2PC(两阶段提交):
面试锦囊:大厂面试注重技术深度与广度的平衡,建议重点掌握Spring核心原理、微服务设计模式及性能优化实战经验。准备2-3个完整项目案例,能够清晰阐述技术选型理由和遇到的挑战,这将大幅提升面试通过率。