互联网大厂Java面试实战(涵盖Spring Boot, Kafka, Redis, Kubernetes等技术点)

📅 发布时间:2026/7/4 23:28:30 👁️ 浏览次数:
互联网大厂Java面试实战(涵盖Spring Boot, Kafka, Redis, Kubernetes等技术点)
文章标题互联网大厂Java面试实战涵盖Spring Boot, Kafka, Redis, Kubernetes等技术点文章内容场景简介电商下单与库存微服务订单下单、库存预扣、消息异步处理、最终一致性面试角色严肃的面试官面 与 搞笑的水货程序员谢飞机谢第一轮基础与代码实现面假设你负责订单微服务请简单设计一个下单的REST接口注意状态码与幂等性策略。谢嗯POST /orders接受订单DTO返回201 Created响应体带orderId。幂等性可以用客户端幂等ID服务端存储请求ID去重。面夸赞回答得很标准。接下来数据库连接池你一般用什么为什么如何在Spring Boot里配置谢我用HikariCP轻量、性能好。Spring Boot里application.properties配置spring.datasource.hikari.*就行。面好。那下单操作涉及减库存和写订单事务怎么处理如果用分布式事务你怎么看谢本地事务用Transactional两个表写到同库就行。分布式的话可以用最终一致性发消息或者用两阶段提交不过两阶段提交太重。面引导最后一个简单题Java里的GC和内存模型你能简单说说吗谢堆和栈然后GC会回收不再使用的对象常见有G1、CMS什么的。面夸赞并提示基础不错继续。第二轮微服务与中间件面现在系统改为异步下单订单服务写订单后发消息给库存服务预扣。你如何选择消息队列并设计消费幂等与重试谢我会用Kafka吞吐量高。消费端要做幂等比如用订单ID做幂等表重试可以靠消费偏移commit和重试队列。面好。库存高并发下如何用Redis防止超卖谢可以用Redis做库存预扣先decr若小于0就回滚。同时也可以先用Lua脚本保证原子性。面那数据库大表分页和索引优化你怎么做谢避免OFFSET大分页用seek分页或限制id范围。索引需要覆盖查询并避免全表扫描。面最后一道如何给Controller和Service写单元测试谢用JUnit5和MockitoMock掉Service层或者Repository断言返回结果和调用次数。面肯定很好。第三轮架构与运维面生产环境部署你会怎么做Kubernetes怎么部署微服务如何做滚动升级与资源控制谢把容器化写Deployment使用liveness和readiness探针设置resources limits/requests滚动升级可以设置strategy为RollingUpdate。面在服务调用上如何防止级联失败你如何实现熔断与限流谢用Resilience4j或Spring Cloud CircuitBreaker做限流可以用令牌桶或Hystrix/Resilience4j的配置。面如何做监控与链路追踪出现性能问题你怎么定位谢Prometheus采集指标Grafana展示链路用Jaeger或Zipkin日志发到ELK。定位可以通过trace和日志关联搜索。面CI/CD方面你的实践是什么怎么做灰度发布或蓝绿谢用GitLab CI或Jenkins构建镜像推到Registry用Kubernetes做蓝绿或金丝雀利用Ingress/Service做流量切换。面总结好今天就到这里你先回去等通知。以下为面试问题逐题详解便于初学者学习场景回顾本次面试围绕电商订单微服务展开涵盖从REST接口到数据库事务、消息异步、缓存防超卖、性能优化、到微服务部署、监控与CI/CD等全链路技术点。下面逐题给出详细答案与要点。第一轮详解下单REST接口设计与幂等性接口示例POST /orders Request: { userId, items: [{skuId, qty}], total, idempotencyKey } Response: 201 Created Location: /orders/{orderId}状态码成功创建返回201如果幂等请求重复返回200或201且不再重复创建参数错误返回400服务器错误500。幂等策略客户端携带幂等IDidempotencyKey服务端在接收请求后检查该key是否已处理若已处理直接返回之前结果。在数据库建立idempotency表或在订单表上记录requestId。对于异步消息也需记录消息ID来保证幂等消费。业务考量幂等表要设置TTL或定期清理避免无限增长。HikariCP与Spring Boot中的数据源配置为什么选HikariCP轻量、性能高、连接获取速度快、资源占用低是Spring Boot的默认连接池。spring.datasource.hikari.* 配置项示例 spring.datasource.urljdbc:mysql://host:3306/db spring.datasource.usernameroot spring.datasource.passwordpass spring.datasource.hikari.maximum-pool-size50 spring.datasource.hikari.minimum-idle10 spring.datasource.hikari.connection-timeout30000连接池调优要点连接池大小根据QPS、数据库连接时间、SQL执行时间估算不宜过大或过小。事务在下单中的作用与分布式一致性本地事务Transactional保证在单数据库内写订单和更新库存的原子性同库且同事务时。分布式事务策略避免2PC两段式提交因为性能和可用性问题。推荐使用最终一致性订单服务写入订单后发出事件Kafka/RabbitMQ库存服务异步处理并补偿或回滚失败时通过补偿逻辑处理。Saga模式编排型或补偿型Saga通过事件或Saga协调器保证跨服务业务的一致性。实践建议优先考虑异步消息补偿结合幂等机制保证可重入。JVM内存与GC基础JVM内存结构简述堆Heap存放对象、方法区类元信息、栈Stack方法调用与局部变量、本地方法栈、直接内存等。GC基础垃圾回收器负责回收无引用对象常见垃圾收集器包括G1、Parallel、CMS旧等。G1是较新的适用于大堆低停顿的收集器。调优要点通过监控GC pause、堆使用情况调整堆大小、GC策略、Young/Old代比列避免频繁Full GC。第二轮详解Kafka在异步下单中的设计要点选择理由分布式、吞吐量高、消息持久化、消费者组模式适合流量较大系统。设计订单服务发出OrderCreated事件到Kafka topic例如 order-events库存服务消费并进行预扣。分区Key使用orderId或skuId作为partition key保证相关消息落在同一分区以保证消费顺序按业务需要。幂等消费库存服务消费前检查是否已处理通过orderId或messageId写入幂等表若已处理则跳过。重试策略消费失败不要无限阻塞消费线程可使用死信队列DLQ或重试队列并加上延迟重试。使用至少一次at-least-once语义时需保证幂等性若需要严格一次exactly-once可以使用Kafka的事务/幂等生产者但复杂度高。Redis做库存预扣与防超卖原子操作使用Lua脚本执行检查库存并扣减的原子操作避免并发竞态。预扣策略先在Redis中decr库存并设置订单锁或占位信息然后异步落库若后续支付失败做回补设计超时回滚机制。使用分布式锁如Redisson在必要时保护关键逻辑但要注意性能开销。缓存与一致性缓存与数据库一致性问题可通过双写、延迟双删或使用消息队列最终一致性策略解决通常采用先更新DB再删除缓存或采用可靠事件最终一致性。大表分页与索引优化OFFSET LIMIT问题OFFSET随着页数增大查询性能下降应使用seek分页例如 WHERE id lastId LIMIT size或基于范围分片。索引设计为常用查询字段建立合适的B-Tree索引注意索引的字段顺序对复合索引影响查询计划。使用覆盖索引select只包含索引字段可以避免回表。避免在WHERE条件中对列做函数/表达式处理导致索引失效。慢查询分析使用EXPLAIN分析执行计划调整索引或改写SQL。单元测试实践JUnit5 MockitoController测试使用Spring Boot Test的WebMvcTest测试Controller层仅加载Web相关上下文Mock Service层。Service测试用ExtendWith(MockitoExtension.class)和Mock注解mock掉Repository定义when(...).thenReturn(...)verify方法调用。集成测试使用SpringBootTest加载完整上下文或使用Testcontainers启动依赖如MySQL。第三轮详解Kubernetes部署与滚动升级容器化将应用打包成Docker镜像遵守无状态服务设计外部化配置ConfigMap/Secret。Deployment使用Deployment管理Pod副本设置resources.requests/limitsProbe配置livenessProbe确定容器是否活着readinessProbe确定是否接受流量。升级策略RollingUpdate默认策略可配置maxUnavailable和maxSurge也可实现蓝绿/金丝雀发布通过Service/Ingress切流量。高可用注意多副本、多Zone部署、合理的资源与Pod亲和/反亲和策略。熔断、限流与服务容错熔断器Circuit Breaker用Resilience4j或Spring Cloud CircuitBreaker监控下游失败率当错误率或延迟达到阈值时开启熔断快速失败并执行降级逻辑。限流策略令牌桶Token Bucket或漏桶Leaky Bucket可在API网关层或服务内部实现结合滑动窗口统计实现短期突发流量控制。退避与重试实现重试时使用指数退避并限制最大重试次数避免雪崩效应。监控与链路追踪指标监控在应用中使用Micrometer埋点Prometheus抓取指标Grafana做可视化仪表盘。关键指标QPS、响应时间、错误率、服务实例CPU/内存、数据库连接使用等。日志与追踪结构化日志JSON便于ELK收集链路追踪使用OpenTelemetry/Jaeger/Zipkin将traceId注入日志以做关联分析。性能定位流程通过Prometheus发现热点服务 - 查看相关trace找到慢调用 - 结合日志与堆栈定位具体原因IO、数据库或代码热点。CI/CD与灰度发布CI流程代码提交触发构建Maven/Gradle运行单元测试、静态代码检查SonarQube构建Docker镜像并推到Registry。CD流程在GitLab CI/Jenkins触发部署到测试/灰度/生产通过Kubernetes API或Helm进行部署。灰度策略通过蓝绿、金丝雀或基于Header/Cookie的流量切换配合指标监控自动回滚。微服务安全JWT/OAuth2JWT用户登录后发放JWT包含必要的claims微服务间通过验证JWT签名并校验权限。要点短有效期、刷新机制、黑名单或token注销策略。OAuth2 / Keycloak对于企业级系统可以使用OAuth2授权服务器如Keycloak统一认证与授权管理。传输安全HTTPS/TLS服务间流量可用mTLS加强身份验证。总结与面试结束语本次面试以电商订单微服务为主线覆盖了从API设计、数据一致性、消息中间件、缓存、性能优化到部署监控与CI/CD的全栈要点。初学者建议实践小项目把这些技术串联起来逐步理解幂等、最终一致性与可观测性等工程化问题。面好今天就到这里你先回去等通知。谢苦笑好嘞。文章标签Java, Spring Boot, Kafka, Redis, Kubernetes, Microservices, MySQL, Docker, CI/CD, Monitoring文章简述本文通过电商订单微服务面试场景展开三轮问答覆盖Spring Boot、Kafka、Redis、MySQL、Kubernetes、CI/CD、监控与安全等技术并在文末给出逐题详解帮助初学者理解架构与实现要点。