面试官:请解释Spring Boot中自动配置的工作原理并演示如何自定义一个@ConfigurationProperties组件?
xbhog:自动配置通过EnableAutoConfiguration
注解触发,结合当前环境判断(如是否检测到MyBatis依赖)和条件注解(@ConditionalOnClass)来决定是否启用配置类。若需自定义配置,可通过创建带@ConfigurationProperties("my.properties.prefix")
的POJO类,并在配置类中标记@EnableConfigurationProperties
实现。例如配置数据库连接池:
my.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
面试官:优秀!现在请你描述Kafka Producer实现消息分区的策略逻辑和常见自定义分区场景
xbhog:默认分区器采用RangePartitioner
(Kafka 0.11+)按轮询或key哈希分配,业务场景中若需要按用户ID分区可实现Partitioner
接口,重写partition()方法。例如电商订单系统按用户维度做分区:
public int partition(String topic, Object key, byte[] keyBytes) {
return ((Long)key).intValue() % numPartitions;
}
面试官:这个方案能有效提高消费端并行能力。最后问:在高并发场景下如何优化Hibernate的一级缓存性能?
面试官:假设需要设计一个支持Excel导入导出的分布式微服务模块,请说明需要的技术栈选型和关键问题
xbhog:技术选型需要Spring Boot (作为基础) + Spring MVC (文件传输) + MyBatis + JPA (数据处理) + Apache POI (Excel操作) + Redis (幂等处理),关键点包括:1. 使用@Async异步处理上传 2. 基于POI SXSSF模式处理百万级导出 3. 通过Redis分布式锁控制同时导入数量
面试官:考虑得比较全面。如何确保微服务间调用时的接口幂等性实现?请给出具体实现代码样例
xbhog:在调用方生成全局唯一ID存储到Redis,服务端检查ID是否已存在。例如基础拦截器实现:
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String id = exchange.getRequest().getHeaders().getFirst("X-Idempotent-Key");
if (redisTemplate.hasKey(id)) {
return exchange.getResponse().setStatusCode(HttpStatus.OK);
}
return chain.filter(exchange.mutate()
.request(mutableRequest ->
mutableRequest.headers().add("X-Handled-Idempotent", "true"))
.build());
}
面试官微笑着补充:这个实现能有效防止重复提交,但需要考虑Token的失效时间设置。继续第三个问题...
面试官:详细说明你设计过的最复杂的分布式链路追踪方案,涉及技术组件和实现原理
xbhog:在金融交易系统中采用Brave + Zipkin方案,通过动态插入Span上下文(TraceId、ParentId)实现跨微服务追踪。配合Spring Cloud Sleuth的@NewSpan
注解在关键入口方法注入span,并结合ELK存储链路ID实现日志关联分析...
面试官收尾:非常专业的回答!你今天的表现给我们留下了深刻印象,我们会尽快通过邮件发送offer通知。(此时面试官的表情管理专家本能使他嘴角微微上扬)
Spring Boot自定义配置
@Component
+ @ConfigurationProperties
组合创建可配置的BeanKafka自定义分区器
Partitioner
接口的partition方法POI SXSSF模式
Redis Idempotent方案
SETNX EX NX
组合实现带过期时间的唯一Key分布式链路追踪