Java大厂面试真题揭秘:从Spring到Kubernetes的全栈技术实战
面试场景:某互联网大厂Java后端岗,面试官严肃,程序员王大瓜(水货)登场
第一轮:基础与框架认知
面试官:王大瓜,先自我介绍一下吧。
王大瓜:我叫王大瓜,Java开发三年,会写CRUD,能跑项目,简历上写的都是‘精通’……
面试官:嗯,那我们来聊聊Spring Boot。你用过Spring Boot吗?它相比传统Spring MVC有什么优势?
王大瓜:有啊!以前得手动配Tomcat、XML、依赖,现在一键启动,省事多了,还自带监控和日志。
面试官:不错,答得挺到位。那你能说说Spring Boot自动配置的原理吗?
王大瓜:这个……好像是通过@EnableAutoConfiguration注解,然后扫描spring.factories文件里的类,自动加载Bean?
面试官:很好,思路对了!再深入一点,如果我想禁用某个自动配置,比如RedisAutoConfiguration,怎么做?
王大瓜:加个@ConditionalOnMissingBean?或者在application.yml里加spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration?
面试官:非常棒!这说明你不是只会用,还懂原理。继续。
第二轮:微服务与云原生实战
面试官:现在我们进入微服务场景。假设你要做一个电商系统的商品服务,需要支持高并发、分布式部署。你会怎么设计?
王大瓜:用Spring Cloud Alibaba,注册中心选Nacos,配置中心也用Nacos,服务间调用用Feign,还有熔断用Sentinel。
面试官:不错,有架构意识。那如果服务A调用服务B,B超时了,Feign怎么处理?
王大瓜:可以配置超时时间,比如feign.client.config.default.connectTimeout=5000,还可以用Hystrix或Resilience4j做熔断。
面试官:很好。那如果服务B是异步处理,比如发短信通知,你会用什么技术?
王大瓜:消息队列啊!RabbitMQ或者Kafka都可以,生产者发消息,消费者消费。
面试官:对!那如果要保证消息不丢失,你会怎么做?
王大瓜:开启事务,消息确认机制,ACK机制,还有持久化……大概就是这些。
面试官:回答得很全面,看来你真用过Kafka。最后一个问题:如果你的服务部署在Kubernetes上,怎么实现服务发现?
王大瓜:K8s本身有Service,Pod之间通过ClusterIP通信,DNS解析,还能用Ingress暴露外部访问。
面试官:非常清晰!你对云原生的理解已经超出普通开发者了。
第三轮:安全与性能优化
面试官:好,现在我们聊点高级的。假设用户登录系统,你想用JWT来做认证,怎么设计?
王大瓜:登录时生成JWT,包含用户ID和角色,设置过期时间,前端存到localStorage,每次请求带上Authorization头。
面试官:很好。那如果用户登出,JWT怎么失效?
王大瓜:……这个……好像不能立刻失效,只能等过期?
面试官:没错,这是JWT的一个痛点。那你有没有考虑过用Redis存储黑名单?
王大瓜:哦!对!可以用Redis缓存已注销的token,每次校验都查一下,不行就拒绝。
面试官:思路打开了!那我们再看一个性能问题。你的接口响应慢,如何排查?
王大瓜:先看日志,看看有没有慢SQL,再用Arthas或JProfiler分析CPU和内存,看看是不是线程阻塞。
面试官:非常好。那如果数据库连接池太慢,你会怎么优化?
王大瓜:换HikariCP,配置最大连接数、空闲连接、超时时间,还能用连接池监控。
面试官:完全正确。今天表现非常出色,虽然有些小瑕疵,但整体逻辑清晰,技术理解扎实。
面试官:王大瓜,你回去等通知吧,我们会在3个工作日内给你答复。
技术答案详解(小白也能看懂)
1. Spring Boot自动配置原理
- 核心机制:
@EnableAutoConfiguration+spring.factories - 启动时,Spring Boot会扫描
META-INF/spring.factories文件,加载其中定义的org.springframework.boot.autoconfigure.AutoConfiguration类 - 这些类中用
@ConditionalOnClass、@ConditionalOnMissingBean等条件注解判断是否满足配置条件 - 满足则自动创建对应Bean,比如RedisAutoConfiguration会自动配置RedisTemplate
✅ 实际应用:你可以在application.yml中关闭特定自动配置:
spring:
autoconfigure:
exclude:
- org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
2. Feign超时与熔断
- Feign默认超时时间短,需显式配置:
feign:
client:
config:
default:
connectTimeout: 5000
readTimeout: 10000
- 熔断可用Resilience4j:添加依赖
resilience4j-spring-boot2,配置熔断规则
resilience4j.circuitbreaker:
configs:
default:
failureRateThreshold: 50
waitDurationInOpenState: 10s
slidingWindowType: COUNT_BASED
slidingWindowSize: 10
3. Kafka消息可靠性保障
- 生产者:启用
acks=all,确保所有副本都收到 - 重试机制:设置
retries=MAX_VALUE,配合retry.backoff.ms - 消费者:手动提交
enable.auto.commit=false,ack.mode=MANUAL_IMMEDIATE - 使用
Exactly-Once语义需结合事务和幂等性
4. JWT登出失效方案
- 问题:JWT一旦签发无法主动撤销
- 解决方案:Token黑名单机制
- 登出时将JWT加入Redis,key为token,value为过期时间
- 每次请求前检查Redis是否存在该token,存在则拒绝
- 可用
Set<String>结构,避免重复
5. K8s服务发现
- Kubernetes内部服务发现基于
Service对象 - Pod通过
service-name.namespace.svc.cluster.local域名访问 - Service类型:ClusterIP(内部)、NodePort(节点端口)、LoadBalancer(负载均衡器)
- Ingress用于对外暴露HTTP/HTTPS服务,支持路径路由、SSL终止
6. 数据库连接池优化(HikariCP)
- 关键参数:
maximumPoolSize:最大连接数,建议根据DB连接数上限设置minimumIdle:最小空闲连接数connectionInitSql:初始化SQL,如SET NAMES utf8mb4validationQuery:验证SQL,如SELECT 1idleTimeout:空闲超时时间maxLifetime:连接最大生命周期(建议小于DB超时时间)
7. 性能排查工具推荐
- Arthas(阿里开源):在线诊断,可查看方法调用链、线程堆栈、内存使用
- JProfiler:图形化性能分析,支持CPU、内存、GC分析
- Prometheus + Grafana:监控指标采集与可视化
- SkyWalking / Zipkin:分布式链路追踪
✅ 小白学习建议:从Spring Boot起步,逐步掌握微服务、消息队列、缓存、安全、监控等核心模块,动手实践比死记硬背更重要!
📌 总结:本篇面试模拟真实还原了大厂Java岗位的技术考察深度,覆盖从基础到云原生的完整技术栈,适合准备面试的开发者系统性学习。
1172

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



