Java+Spring Boot互联网内容社区-AIGC推荐系统面试真题与答案深度解析(含微服务Kafka、JWT安全、JVM调优代码)
·
Java+Spring Boot互联网内容社区-AIGC推荐系统面试真题与答案深度解析(含微服务Kafka、JWT安全、JVM调优代码)
一、场景与面试对话:严肃面试官 vs 搞笑水货程序员谢飞机
互联网内容社区+AIGC推荐系统(类似小红书、B站UGC社区)Java开发岗深度面试。
第一轮:单体架构与基础业务
1. 分层结构和组件
- Controller(Spring MVC暴露API)
- Service(业务逻辑)
- DAO/Repository(Spring Data JPA/MyBatis数据访问)
- 缓存:Redis
- 数据库:MySQL,ORM:JPA+Hibernate
- 构建工具:Maven
谢飞机(自信):Controller、Service、DAO三板斧;热点Redis缓一波。
2. 核心接口代码示例(Spring Boot)
@RestController
@RequestMapping("/posts")
public class PostController {
@PostMapping
public void createPost(@RequestBody Post post) {
// 调用service保存
}
@GetMapping("/{id}")
public Post getPost(@PathVariable Long id) {
// 查询帖子详情
return null;
}
}
3. 数据库表设计
CREATE TABLE post (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
author_id BIGINT NOT NULL,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
like_count INT NOT NULL DEFAULT 0,
comment_count INT NOT NULL DEFAULT 0,
status TINYINT NOT NULL DEFAULT 1,
created_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL,
INDEX idx_author_created_at (author_id, created_at DESC),
INDEX idx_status_created_at (status, created_at DESC)
) ENGINE=InnoDB;
4. Spring Cache + Redis 缓存代码
@Service
public class CachedPostService {
@Cacheable(cacheNames = "post", key = "#id")
public Post getPostById(Long id) {
// 查询数据库
}
@Transactional
@CachePut(cacheNames = "post", key = "#result.id")
public Post createPost(Post post) {
// 保存数据库并更新缓存
}
@Transactional
@CacheEvict(cacheNames = "post", key = "#id")
public void deletePost(Long id) {
// 删除数据库和缓存
}
}
第二轮:微服务拆分与消息系统
1. 微服务边界和通讯
- post-service:帖子CRUD
- recommend-service:推荐逻辑
- 通信方式:HTTP同步 或 Kafka异步
2. Kafka生产/消费代码
// 生产者
@Service
public class PostServiceWithKafka {
@Transactional
public Post createPost(Post post) {
// ...保存
kafkaTemplate.send("post-created", postMsgJson);
return post;
}
}
// 消费者
@Service
public class PostCreatedConsumer {
@KafkaListener(topics = "post-created", groupId = "recommend-service")
public void handlePostCreated(String message) {
// 推荐逻辑处理
}
}
3. MySQL+Elasticsearch+Kafka一致性方案
- 使用Outbox模式(本地事务+异步分发)
- 主链路只做MySQL写入,ES/Kafka用转发器补偿,保证最终一致性
第三轮:高并发优化与安全
1. QPS高读低写优化(JVM+缓存+数据库)
- JVM参数:
-Xms4g -Xmx4g -XX:+UseG1GC,监控GC日志、堆使用 - Redis热点缓存+本地Cache(Caffeine)
- MySQL分库分表/读写分离/高效索引
2. Spring Security+OAuth2+JWT
- 登录成功服务端生成JWT,返回给前端
- 后续接口通过Authorization: Bearer 头传递
- JwtAuthenticationFilter解析校验JWT,注入SecurityContext
代码:
public String createToken(Long userId, String username) {
Claims claims = Jwts.claims().setSubject(username);
claims.put("uid", userId);
return Jwts.builder()
.setClaims(claims)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 3600000))
.signWith(SignatureAlgorithm.HS256, secretKey)
.compact();
}
3. 监控与链路追踪排查慢请求(Prometheus+Grafana+Zipkin/Jaeger)
- Micrometer收应用指标(QPS、RT、GC)
- Grafana可视化,先看QPS/RT/错误率
- TraceId链路打点,定位哪一级服务耗时
四、标准答案与代码分析(R1Q1~R3Q9)
每题详细答案与主流代码见正文。可扩展为完整项目结构:Maven多模块、Dockerfile、K8s部署YAML等。
结语
互联网内容社区+AIGC推荐的后端面试,覆盖Spring Boot微服务架构、缓存、消息、OAuth2+JWT安全、监控链路追踪等主流技术,代码实践建议多看官方文档与源码,提升细节落地能力。
更多推荐



所有评论(0)