互联网大厂Java面试现场:谢飞机的“起飞”之旅(Spring Boot、微服务、Redis、JVM、线程池、分布式事务)
面试现场:谢飞机的“起飞”之旅
场景: 互联网大厂Java工程师面试现场,面试官严肃认真,谢飞机紧张但努力应对。
第一轮提问:基础技术栈与Spring Boot
面试官: 谢飞机,先说说Spring Boot的自动装配原理吧。
谢飞机: 啊?自动装配?嗯...这个我记得是基于Spring的条件注解实现的,比如@ConditionalOnClass之类的...
面试官: 对,Spring Boot通过spring.factories文件加载自动配置类,根据类路径上的依赖决定是否启用某些配置。
谢飞机: 对对对,我之前看过那个spring-boot-autoconfigure包里的内容。
面试官: 那Spring Boot中如何自定义一个Starter?
谢飞机: 自定义Starter?我记得需要两个部分,一个是autoconfigure模块,一个是starter模块,把autoconfigure打包进去...
面试官: 很好,你提到的结构是对的,那么Starter的命名规范呢?
谢飞机: 哦,我记得官方Starter一般以spring-boot-starter-xxx命名,自定义的话一般用xxx-spring-boot-starter。
面试官: 不错,看来你对Spring Boot基础掌握得还可以。
第二轮提问:微服务与分布式系统
面试官: 谢飞机,谈谈Spring Cloud中服务注册与发现的机制。
谢飞机: 嗯...Spring Cloud一般用Eureka或者Nacos来做注册中心,服务启动的时候会向注册中心注册自己的信息,其他服务可以从注册中心获取服务列表...
面试官: 很好,那服务调用失败时,你如何保证系统的容错能力?
谢飞机: 这个可以用Hystrix或者Resilience4j做熔断降级,当调用失败达到阈值时,触发降级逻辑,返回默认值或者提示信息。
面试官: 那负载均衡呢?Spring Cloud中有哪些常见的负载均衡策略?
谢飞机: 常见的有Ribbon和Spring Cloud LoadBalancer,Ribbon默认是轮询策略,也可以配置随机或者权重。
面试官: 不错,继续。
第三轮提问:缓存、JVM与分布式事务
面试官: 谢飞机,Redis在高并发场景下如何应对缓存穿透和缓存雪崩?
谢飞机: 缓存穿透的话可以用布隆过滤器,缓存雪崩的话可以设置不同的过期时间,或者加互斥锁。
面试官: 很好,那Redis的持久化机制呢?
谢飞机: Redis有两种持久化方式,RDB和AOF。RDB是快照形式,AOF是追加日志。
面试官: 那JVM的内存模型呢?GC有哪些算法?
谢飞机: JVM内存分为堆、栈、方法区、本地内存等,GC算法有标记-清除、复制、标记-整理...
面试官: 那分布式事务,你了解哪些方案?
谢飞机: 比如TCC、Saga模式、Seata框架,还有基于消息队列的最终一致性方案。
面试官: 好的,今天就到这里,回家等通知吧。
详细技术点解析
Spring Boot 自动装配原理
- Spring Boot 的自动装配核心是
@EnableAutoConfiguration注解,它会从spring-boot-autoconfigure模块中读取spring.factories文件,加载自动配置类。 - 自动配置类使用条件注解(如
@ConditionalOnClass、@ConditionalOnMissingBean)来判断是否需要生效。 - 开发者可以通过
@SpringBootApplication注解快速启用自动装配功能。
Spring Boot 自定义 Starter
- 一个自定义Starter通常包含两个模块:
xxx-spring-boot-autoconfigure:负责自动配置逻辑。xxx-spring-boot-starter:依赖autoconfigure模块,并对外暴露配置属性。
- 命名规范:官方Starter以
spring-boot-starter-xxx开头,自定义Starter以xxx-spring-boot-starter命名。
Spring Cloud 服务注册与发现
- Spring Cloud 提供了多种注册中心实现,如Eureka(Netflix)、Consul、Nacos等。
- 服务启动时会向注册中心注册自己的元数据(IP、端口、服务名等)。
- 服务消费者通过注册中心获取服务实例列表,并进行负载均衡调用。
微服务容错机制
- Hystrix / Resilience4j:提供熔断、降级、重试等功能。
- Ribbon / LoadBalancer:负责服务调用的负载均衡,支持轮询、随机、权重等策略。
- OpenFeign:封装了HTTP请求调用,结合Ribbon实现声明式服务调用。
Redis 缓存问题解决方案
- 缓存穿透:恶意查询不存在的数据,解决方案:布隆过滤器(Bloom Filter)。
- 缓存雪崩:大量缓存同时失效,解决方案:设置随机过期时间、加互斥锁。
- 缓存击穿:热点数据失效,解决方案:永不过期、逻辑过期时间、互斥锁。
Redis 持久化机制
- RDB(快照持久化):定期将内存数据保存为二进制快照文件,适合备份和恢复。
- AOF(追加日志持久化):记录所有写操作命令,以日志形式保存,适合数据安全性要求高的场景。
JVM 内存模型与GC算法
- JVM内存模型:堆(Heap)、栈(Stack)、方法区(Metaspace)、程序计数器、本地方法栈。
- GC算法:
- 标记-清除(Mark-Sweep):效率高但会产生内存碎片。
- 复制(Copying):用于新生代,GC效率高。
- 标记-整理(Mark-Compact):用于老年代,整理内存碎片。
分布式事务解决方案
- TCC(Try-Confirm-Cancel):业务层面实现,分为Try(资源预留)、Confirm(执行)、Cancel(回滚)。
- Saga模式:长事务编排,适用于业务流程较长的场景。
- Seata框架:支持AT(自动事务)、TCC、SAGA等多种模式。
- 消息队列 + 本地事务表:通过消息队列保证最终一致性。
总结
本文通过谢飞机的面试过程,讲解了Spring Boot、微服务、Redis、JVM、线程池、分布式事务等核心技术点,适合初学者学习和理解大厂面试常考内容。
449

被折叠的 条评论
为什么被折叠?



