北京清大科越Java后端开发工程师 二面
#JAVA##JAVA面JAVA经##JAVA内推#
1. Nacos服务注册的健康检查机制原理?
思路
分“客户端主动上报+服务端被动检测”两类,讲清核心心跳逻辑和检测规则,贴合实际使用场景。
回答示例
Nacos的健康检查主要分两种模式,核心是“心跳上报+超时剔除”:
- 客户端主动健康上报(默认):服务实例注册后,会以5秒为间隔向Nacos Server发送心跳包(包含实例状态);Server端维护一个心跳超时时间(默认15秒),如果15秒没收到心跳,就把实例标记为“不健康”;如果30秒还没收到,直接从服务列表剔除;
- 服务端被动检测(TCP/HTTP):如果配置了被动检测,Server会主动向实例发起TCP连接或HTTP请求,根据连接/请求结果判断健康状态;
两种模式结合,既保证了轻量(主动上报),又能兜底检测(被动检测),确保服务列表的准确性。
2. Feign调用超时怎么配置?
思路
分“Feign自身+底层客户端(Ribbon/OkHttp)”两层配置,给出具体配置项,口语化讲清作用。
回答示例
Feign调用超时要配两层,因为Feign底层默认用Ribbon做负载均衡,超时配置分两类:
- Feign全局配置:
feign:
client:
config:
default: # 全局配置
connectTimeout: 5000 # 连接超时5秒
readTimeout: 10000 # 读取超时10秒
- Ribbon细粒度配置(优先级更高):
ribbon: ConnectTimeout: 5000 # 连接超时 ReadTimeout: 10000 # 读取超时 MaxAutoRetries: 1 # 同一实例重试次数
如果用OkHttp替代Ribbon,就配OkHttp的超时参数,核心是把“连接+读取”超时都设好,避免单方面配置导致不生效。
3. Sentinel的QPS限流规则怎么动态调整?
思路
讲“控制台手动改+配置中心推送+代码动态更新”三种方式,突出生产常用的配置中心方案。
回答示例
Sentinel动态调整QPS限流规则主要有三种方式,生产上常用配置中心方案:
- 控制台手动调整:在Sentinel Dashboard找到对应资源,直接修改QPS阈值,改完实时生效(适合临时调整);
- 配置中心推送(Nacos/Apollo):把限流规则存在Nacos,Sentinel监听Nacos配置变更,规则改了自动同步到客户端,这是生产最常用的,支持批量调整、持久化;
- 代码动态更新:通过Sentinel的
FlowRuleManager.loadRules()或pushRules()方法,在代码里实时推送新规则,适合个性化调整;
核心是规则持久化+实时推送,避免服务重启后规则丢失。
4. Redis Cluster的槽位迁移过程?
思路
分“准备→迁移→切换→确认”四步,讲清核心逻辑,突出“无感知迁移”和“保证数据一致性”。
回答示例
Redis Cluster有16384个哈希槽,槽位迁移是为了均衡负载,核心过程分四步:
- 准备阶段:源节点和目标节点建立连接,确认迁移的槽位范围;
- 数据迁移:源节点把对应槽位的键值对逐个迁移到目标节点,迁移时会加短暂的读锁(不阻塞写);
- 槽位切换:迁移完成后,集群更新槽位映射表,把槽位归属指向目标节点;
- 确认阶段:所有节点同步新的槽位映射,客户端请求会路由到新节点;
整个过程是增量迁移,还会通过ASK重定向保证迁移中请求不丢失,对客户端基本无感知。
5. RabbitMQ死信队列触发条件有哪些?
思路
讲清三个核心触发条件,结合业务场景举例,易理解。
回答示例
RabbitMQ死信队列(DLX)触发有三个核心条件,满足任一就会把消息丢进死信队列:
- 消息被拒绝(reject/nack)且不重新入队:比如消费端处理失败,调用
channel.basicReject(deliveryTag, false),false表示不重入队; - 消息过期:队列设置了
x-message-ttl(消息过期时间),或消息本身设了过期时间,超时未消费; - 队列达到最大长度:队列设了
x-max-length,消息数满了,新消息进来会把最老的消息挤入死信队列;
死信队列主要用来处理失败消息,方便后续重试或排查问题。
6. MyBatis一级缓存失效的常见场景?
思路
讲高频失效场景,结合SQL执行逻辑,不堆砌,突出“同会话+同SQL”的核心前提。
回答示例
MyBatis一级缓存是SqlSession级别的,只有同会话、同SQL、同参数才生效,常见失效场景有:
- 不同SqlSession:新开一个SqlSession查同一数据,不会走缓存;
- 同会话执行增删改:执行insert/update/delete后,一级缓存会被清空,避免脏数据;
- SQL参数不同:哪怕SQL一样,参数不一样(比如id=1和id=2),缓存不共用;
- 手动清空缓存:调用
sqlSession.clearCache(),直接清空当前会话缓存;
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏在精不在多,内容分为八股文、大厂真实面经,面试通过后将offer和面试题私发给我,可退还专栏的收益部分费用。欢迎大家共建专栏
查看6道真题和解析