Skip to content

面试专题

This content is not available in your language yet.

回答这套源码时,先说清 Spring 负责生命周期和平台契约,第三方客户端负责协议与核心算法。

先给答案:先说适配链,再说底层一致性

Section titled “先给答案:先说适配链,再说底层一致性”

这套组件的共同结构是“自动配置发现客户端 -> 属性和条件决定实例 -> 适配为 Spring 标准接口 -> 生命周期回调驱动运行”。Nacos、Sentinel 和 RocketMQ 的差异不在装配外壳,而在配置、发现、保护和消息各自的协议状态机。

高难追问通常落在语义边界:bootstrap 配置与运行期刷新是否一致,服务发现失败时缓存是否可接受,Sentinel 规则何时生效,消息发送成功与业务完成是否等价。Spring 负责接线,不会自动消除陈旧数据、重试和幂等问题。

30 秒版:Resolver 把 nacos: 解析成资源,Loader 调用 ConfigService 生成 ConfigData,从而复用 profile、optional 和属性优先级。

源码加分:NacosConfigDataLocationResolver:121-163、NacosConfigDataLoader:75-108。

Nacos 发现失败为什么还能返回实例

Section titled “Nacos 发现失败为什么还能返回实例”

成功查询会写入 ServiceCache,失败时如果开启 failure tolerance,NacosDiscoveryClient:60-72 返回缓存拓扑,牺牲短时新鲜度换可用性。

DiscoveryClient 和 ServiceRegistry 的区别

Section titled “DiscoveryClient 和 ServiceRegistry 的区别”

前者是消费侧查询实例,后者是提供侧注册和注销当前应用。源码分别为 NacosDiscoveryClient:36、NacosServiceRegistry:42。

它装配 Web 适配、规则数据源、转换器和 CircuitBreaker 工厂,不实现 Sentinel 核心统计算法。入口是 SentinelWebAutoConfiguration:50、SentinelDataSourceHandler:51、SentinelCircuitBreakerFactory:33。

RocketMQ Binder 为什么不是普通 Producer 封装

Section titled “RocketMQ Binder 为什么不是普通 Producer 封装”

Binder 还负责 destination provision、consumer endpoint、错误通道和 Stream 生命周期。RocketMQMessageChannelBinder:61-74 与 RocketMQProducerMessageHandler:166-202 分工明显。

OneWay、Sync、Async、Transaction 怎么选

Section titled “OneWay、Sync、Async、Transaction 怎么选”

OneWay 不等待结果;Sync 直接得到 SendResult;Async 通过 callback;Transaction 交给 RocketMQ 事务消息机制。分支见 RocketMQProducerMessageHandler:181-247。

为什么 Nacos Config Manager 有静态单例又注册成 Bean

Section titled “为什么 Nacos Config Manager 有静态单例又注册成 Bean”

静态 manager 服务于 Config Data bootstrap 阶段,Spring Bean 服务于上下文和刷新器注入。NacosConfigManager:52-89 保证两阶段取得同一个 ConfigService。

为什么 Sentinel 数据源使用 SmartInitializingSingleton

Section titled “为什么 Sentinel 数据源使用 SmartInitializingSingleton”

规则源可能依赖 converter 和其他 Bean,延迟到 afterSingletonsInstantiated:78 可避免启动顺序隐式依赖。

配置加载和动态刷新是同一条链吗

Section titled “配置加载和动态刷新是同一条链吗”

不是。初次加载由 Resolver/Loader 完成;变化监听由 NacosContextRefresher 完成,装配见 NacosConfigAutoConfiguration:70-75。

RocketMQ 入站失败如何避免静默丢消息

Section titled “RocketMQ 入站失败如何避免静默丢消息”

适配器支持恢复回调,出错可发送到 error channel,提示见 RocketMQInboundChannelAdapter:82-87。重试和死信仍取决于 consumer 与 Stream 配置。

现象 优先检查
Nacos 配置未生效 spring.config.import、dataId/group、profile、optional
服务发现为空 命名空间、group、failure tolerance 缓存
Sentinel 不拦截 Web 类型、条件注解、handler/filter Bean
RocketMQ 无消息 destination/topic、consumer group、Binder properties
消息失败无告警 failure channel、recoverer、callback Bean
  • Nacos 配置是强依赖启动,还是允许 optional 降级?
  • 注册中心故障时是否允许使用陈旧实例?最大多久?
  • RocketMQ 消费失败是重试、死信还是业务补偿?

面试锚点

  • Config Data 两阶段模型如何测试?
  • 发现缓存的可用性与一致性取舍是什么?
  • Binder 如何统一不同消息系统的生命周期?