应聘者:我最近参与了一个电商平台的重构项目,主要使用了Spring Boot作为后端框架。我们采用了分层架构,将业务逻辑、数据访问和控制层分离。
应聘者:我负责的是订单中心模块,这里确实用到了Redis作为缓存,主要是为了提升热点商品的查询效率。
应聘者:我们采用了层级命名的方式,比如order:userId:orderId
,这样可以方便地根据用户ID和订单ID进行查询。
// 示例:Redis Key 设计
String key = "order:" + userId + ":" + orderId;
redisTemplate.opsForValue().set(key, orderDetail);
应聘者:对于缓存穿透,我们采用布隆过滤器来拦截无效请求;而对于缓存雪崩,我们在设置过期时间时加入了随机偏移量。
// 设置缓存并加入随机过期时间
int expireTime = 60 * 60 + new Random().nextInt(300); // 基础1小时 + 随机0-300秒
redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
应聘者:我们使用了Spring Cloud Alibaba作为微服务治理方案,其中Nacos作为注册中心和配置中心,Sentinel用于流量控制。
应聘者:Sentinel支持多种熔断策略,包括慢调用比例、异常比例和异常数。例如,当某个接口响应时间超过阈值时,会自动触发熔断,防止雪崩效应。
# Sentinel 熔断规则示例
sentinel:
flow:
rules:
- resource: /api/order/detail
count: 10
grade: 1
limitApp: default
strategy: 0
应聘者:首先我会检查服务之间的网络连通性,然后查看日志是否有异常堆栈。如果有链路追踪系统(如SkyWalking),可以通过Trace ID定位具体的调用链路。
应聘者:有遇到过一次促销活动期间的服务雪崩。当时我们紧急扩容了服务节点,并临时调整了Sentinel的限流规则,同时引入了缓存预热机制。
应聘者:我们使用了Vue3作为前端框架,结合Vite进行构建,UI库是Element Plus。在性能优化方面,我们采用了懒加载和CDN加速。
应聘者:Composition API允许我们以函数式的方式组织逻辑,而不是像Options API那样分散在data、methods等选项中。它更灵活,便于复用逻辑。
应聘者:我们使用了Nuxt.js进行服务端渲染(SSR),这样不仅提升了首屏加载速度,也对SEO友好。
应聘者:有的,我们使用了Kafka作为消息中间件,主要用于订单状态变更通知和日志收集。
应聘者:Kafka的Topic可以划分为多个Partition,每个Partition是一个有序的队列。生产者发送消息时可以根据Key哈希分配到不同的Partition,消费者组内的消费者会消费不同的Partition。
// Kafka 生产者示例
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
Producer producer = new KafkaProducer<>(props);
ProducerRecord record = new ProducerRecord<>("order-topic", "order-id-123", "Order Created");
producer.send(record);
应聘者:我们会记录失败的消息到数据库,并通过定时任务重新投递,或者使用死信队列进行后续处理。
应聘者:我们使用Jenkins作为持续集成工具,GitLab CI用于流水线管理,Docker用于容器化部署,Kubernetes进行编排。
应聘者:是的,Prometheus用于指标采集,Grafana用于可视化展示。我们通过Micrometer暴露应用指标,Prometheus定期抓取,最后在Grafana上展示。
# Prometheus 配置示例
scrape_configs:
- job_name: 'spring-boot'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['localhost:8080']
应聘者:我会先使用jstat查看GC情况,再用jmap生成heap dump文件,最后用MAT工具进行分析。
# 生成Heap Dump
jmap -dump:live,format=b,file=heap.bin
面试官:好的,今天的面试就到这里,你可以回去等我们的通知。感谢你的参与!
本次面试涵盖了Java全栈开发的核心知识点,包括Spring Boot、Vue3、Redis、Kafka、微服务治理、前端优化、CI/CD等技术栈。如果你是初学者,可以从以下几个方面入手学习:
建议多做一些实战项目,结合文档和源码进行深入学习。希望这次面试经历对你有所帮助!