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安全、监控链路追踪等主流技术,代码实践建议多看官方文档与源码,提升细节落地能力。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐