北京清大科越Java后端开发工程师 二面

#JAVA##JAVA面JAVA经##JAVA内推#

1. Nacos服务注册的健康检查机制原理?

思路

分“客户端主动上报+服务端被动检测”两类,讲清核心心跳逻辑和检测规则,贴合实际使用场景。

回答示例

Nacos的健康检查主要分两种模式,核心是“心跳上报+超时剔除”:

  1. 客户端主动健康上报(默认):服务实例注册后,会以5秒为间隔向Nacos Server发送心跳包(包含实例状态);Server端维护一个心跳超时时间(默认15秒),如果15秒没收到心跳,就把实例标记为“不健康”;如果30秒还没收到,直接从服务列表剔除;
  2. 服务端被动检测(TCP/HTTP):如果配置了被动检测,Server会主动向实例发起TCP连接或HTTP请求,根据连接/请求结果判断健康状态;

两种模式结合,既保证了轻量(主动上报),又能兜底检测(被动检测),确保服务列表的准确性。

2. Feign调用超时怎么配置?

思路

分“Feign自身+底层客户端(Ribbon/OkHttp)”两层配置,给出具体配置项,口语化讲清作用。

回答示例

Feign调用超时要配两层,因为Feign底层默认用Ribbon做负载均衡,超时配置分两类:

  1. Feign全局配置
feign:
  client:
    config:
      default: # 全局配置
        connectTimeout: 5000 # 连接超时5秒
        readTimeout: 10000 # 读取超时10秒
  1. Ribbon细粒度配置(优先级更高)
ribbon:
  ConnectTimeout: 5000 # 连接超时
  ReadTimeout: 10000 # 读取超时
  MaxAutoRetries: 1 # 同一实例重试次数

如果用OkHttp替代Ribbon,就配OkHttp的超时参数,核心是把“连接+读取”超时都设好,避免单方面配置导致不生效。

3. Sentinel的QPS限流规则怎么动态调整?

思路

讲“控制台手动改+配置中心推送+代码动态更新”三种方式,突出生产常用的配置中心方案。

回答示例

Sentinel动态调整QPS限流规则主要有三种方式,生产上常用配置中心方案:

  1. 控制台手动调整:在Sentinel Dashboard找到对应资源,直接修改QPS阈值,改完实时生效(适合临时调整);
  2. 配置中心推送(Nacos/Apollo):把限流规则存在Nacos,Sentinel监听Nacos配置变更,规则改了自动同步到客户端,这是生产最常用的,支持批量调整、持久化;
  3. 代码动态更新:通过Sentinel的FlowRuleManager.loadRules()pushRules()方法,在代码里实时推送新规则,适合个性化调整;

核心是规则持久化+实时推送,避免服务重启后规则丢失。

4. Redis Cluster的槽位迁移过程?

思路

分“准备→迁移→切换→确认”四步,讲清核心逻辑,突出“无感知迁移”和“保证数据一致性”。

回答示例

Redis Cluster有16384个哈希槽,槽位迁移是为了均衡负载,核心过程分四步:

  1. 准备阶段:源节点和目标节点建立连接,确认迁移的槽位范围;
  2. 数据迁移:源节点把对应槽位的键值对逐个迁移到目标节点,迁移时会加短暂的读锁(不阻塞写);
  3. 槽位切换:迁移完成后,集群更新槽位映射表,把槽位归属指向目标节点;
  4. 确认阶段:所有节点同步新的槽位映射,客户端请求会路由到新节点;

整个过程是增量迁移,还会通过ASK重定向保证迁移中请求不丢失,对客户端基本无感知。

5. RabbitMQ死信队列触发条件有哪些?

思路

讲清三个核心触发条件,结合业务场景举例,易理解。

回答示例

RabbitMQ死信队列(DLX)触发有三个核心条件,满足任一就会把消息丢进死信队列:

  1. 消息被拒绝(reject/nack)且不重新入队:比如消费端处理失败,调用channel.basicReject(deliveryTag, false),false表示不重入队;
  2. 消息过期:队列设置了x-message-ttl(消息过期时间),或消息本身设了过期时间,超时未消费;
  3. 队列达到最大长度:队列设了x-max-length,消息数满了,新消息进来会把最老的消息挤入死信队列;

死信队列主要用来处理失败消息,方便后续重试或排查问题。

6. MyBatis一级缓存失效的常见场景?

思路

讲高频失效场景,结合SQL执行逻辑,不堆砌,突出“同会话+同SQL”的核心前提。

回答示例

MyBatis一级缓存是SqlSession级别的,只有同会话、同SQL、同参数才生效,常见失效场景有:

  1. 不同SqlSession:新开一个SqlSession查同一数据,不会走缓存;
  2. 同会话执行增删改:执行insert/update/delete后,一级缓存会被清空,避免脏数据;
  3. SQL参数不同:哪怕SQL一样,参数不一样(比如id=1和id=2),缓存不共用;
  4. 手动清空缓存:调用sqlSession.clearCache(),直接清空当前会话缓存;

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

本专栏在精不在多,内容分为八股文、大厂真实面经,面试通过后将offer和面试题私发给我,可退还专栏的收益部分费用。欢迎大家共建专栏

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务