资讯动态

互联网大厂Java面试实战:Spring Boot、Redis、Kafka、微服务、JWT、Elasticsearch与Kubernetes全栈技术

发布时间:2026/8/9 15:23:00 来源:尧图企业网站定制
互联网大厂Java面试实战Spring Boot、Redis、Kafka、微服务、JWT、Elasticsearch与Kubernetes全栈技术面试官请进坐吧。先介绍一下你做过的最有代表性的项目。谢飞机老师好我叫谢飞机三年Java开发。我做了一个宠物内容社区“喵次元”用户可以发猫咪图片、短视频也能点赞评论关注。我主要负责后端技术栈用了Spring Boot、MyBatis、MySQL、Redis、Kafka搜索用的Elasticsearch部署在Docker上。面试官你们用了Spring Boot那你说说Spring Boot自动配置的原理谢飞机搓手呃……自动配置就是“约定大于配置”嘛。Spring Boot启动的时候会读一个叫spring.factories的文件里面有一堆带Configuration的类。比如引入了Redis就会自动配一个RedisTemplate。但是……具体怎么根据classpath判断的我当时没细看反正用起来挺香。面试官Kafka和RabbitMQ的区别是什么谢飞机Kafka是高吞吐RabbitMQ是低延迟我觉得Kafka像瀑布RabbitMQ像水库。嗯……Kafka有partition可以横向扩展RabbitMQ有exchange和routing key做路由很灵活。别的我一下子想不全。面试官在“喵次元”里用户上传一个视频怎么保证接口不卡死谢飞机我们用了异步转码。上传后马上返回“处理中”视频转码的消息丢到Kafka有个消费程序慢慢转。客户等转好了会收到WebSocket通知。这样接口很快不会卡死。面试官好第二轮。内容表数据量大了你怎么优化谢飞机先加索引再上Redis缓存。如果超过千万就分库分表。不过分库分表我只懂个大概用ShardingSphere配置过逻辑表真正的分布式事务没碰过。面试官缓存穿透、击穿、雪崩怎么解决谢飞机这个我熟穿透就缓存空值或布隆过滤器击穿就是热点key过期用互斥锁雪崩就是大量key同时过期给过期时间加随机数。这个问题我面试前刚背过。面试官背得挺熟练。那Redis有哪些数据结构在社区里怎么用谢飞机String、List、Hash、Set、ZSet我都用过。String存验证码Hash存帖子内容Set存粉丝列表ZSet存热门排行榜List存关注人的动态流。面试官怎么用Elasticsearch实现对文章和视频标题的搜索倒排索引知道吗谢飞机就是先建索引然后搜索。倒排索引……我听腾讯课的讲师讲过就是“单词-文档列表”的映射。但是和MySQL的索引区别我有点说不清。面试官第三轮。你们的服务怎么拆分的服务发现用的什么谢飞机按业务拆的用户、内容、评论、消息、审核。服务发现用了Nacos之前也用EurekaNacos还管配置。面试官服务A调用服务B如果B挂了A怎么避免雪崩谢飞机使用Resilience4j做熔断限流也加了Fallback方法。B挂了A就直接返回缓存或提示“稍后重试”不让线程一直等。面试官JWT和Session有什么区别谢飞机Session存在服务器JWT存在客户端。JWT是base64编码的三段最后是签名服务端验签就行。但是JWT不能强制下线所以我们用Redis黑名单解决。面试官线上如何监控Kafka消息积压了怎么办谢飞机我们有Prometheus和GrafanaJVM、CPU、QPS都监控。日志用的ELK。毫秒级的链路追踪用了Jaeger。积压的话……可以看Kafka的Lag指标我们设了阈值超过就报警。但具体命令有点忘了好像是“kafka-consumer-groups.sh”吧。面试官很好。最后一个你们CI/CD怎么设计的谢飞机眼睛一亮这个我会我们用GitLab CI代码合并到main自动触发。流水线包括maven打包、跑单测、docker build、推镜像、然后helm部署到K8s集群。K8s里用Deployment管理副本滚动升级可以自动回滚。面试官点点头好我这边基本清楚了。你回去等通知吧。谢飞机好的谢谢老师答案解析第一轮问题1请介绍一个最有代表性的项目它的整体架构和技术栈是什么这是一道典型的“项目自我介绍”题。面试官想看你的项目经验、技术深度和表达逻辑。回答时要按照“背景 → 架构 → 角色 → 亮点”来展开。以“宠物内容社区”为例背景一个UGC平台用户能发图文、视频可以点赞、评论、关注、搜索。架构前端App/H5 → Nginx → Spring Boot微服务集群用户服务、内容服务、评论服务、消息服务、审核服务 → MySQL主从/分片 Redis缓存 Kafka异步消息 Elasticsearch搜索 OSS文件存储 WebSocket消息推送。职责负责内容发布链路和消息服务设计了视频异步转码流程。亮点用Kafka削峰用Redis缓存热点榜单用Elasticsearch解决全文检索用JWT做无状态登录。给面试官讲项目时不要只报技术名词也要说清楚为什么选这个技术、解决了什么问题。问题2解释Spring Boot自动配置的原理。Spring Boot自动配置的核心是EnableAutoConfiguration注解。这个注解会通过Import(AutoConfigurationImportSelector.class)导入一批“自动配置类”。Spring Boot会在项目所有依赖的jar包中扫描META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件Spring Boot 2.7之前叫spring.factories拿到所有候选的自动配置类。每个自动配置类上都有条件注解例如ConditionalOnClass(RedisOperations.class)只有当classpath中有这个类时才配置Redis。ConditionalOnProperty(prefix spring.redis, name enabled, havingValue true)需要指定配置项。ConditionalOnMissingBean如果用户已经自己定义了Bean默认配置就不再生效。比如RedisAutoConfiguration它检测到项目中有Redis相关类时会创建一个RedisTemplate的Bean。如果用户自己写了RedisTemplate就自动跳过默认配置。简单说自动配置 配置类扫描 条件注解 默认Bean装配。排查问题可以使用--debug启动查看自动配置报告。问题3Kafka和RabbitMQ在消息队列设计上有哪些核心区别它们都是成熟的消息中间件但设计理念不同模型不同RabbitMQ基于AMQP协议有Exchange交换机、Queue队列、RoutingKey路由。Kafka是分布式流平台有Topic、Partition分区、Consumer Group消费组。消费方式不同RabbitMQ是push推模型消息到达队列后主动推给消费者Kafka是pull拉模型消费者自己从分区拉取消息可以控制速率和offset重放。消息确认不同RabbitMQ依赖ACK确认消费者处理完返回ACK否则重新投递Kafka通过提交offset表示已经消费可能重复消费需要业务幂等。能力侧重不同RabbitMQ功能强大支持延迟队列、死信队列、优先级队列适合复杂路由和低延迟任务Kafka吞吐量高天然持久化适合日志采集、埋点数据、用户行为流、削峰填谷。可靠性实现不同Kafka通过分区副本Replica和ISR机制保证高可用生产端设置acksall可以保证不丢消息RabbitMQ支持镜像队列或Quorum Queue。在UGC场景中如果只是“发视频后通知转码”这种异步任务RabbitMQ足够但如果是海量日志、用户行为流、大数据管道Kafka更合适。问题4在UGC音视频场景中如何设计一个上传后异步转码的流程核心思路是“同步接口只接收异步任务做重活”。流程如下客户端请求后端获取“预签名上传地址”然后直接上传到OSS对象存储。上传完成后客户端调用后端接口POST /videos传入文件URL、标题、大小等元数据。后端创建视频记录状态设为“待处理”同时向Kafka的video-transcodetopic发送一条消息包含视频ID和源文件URL。接口立刻返回用户前端看到“处理中”。后台转码服务订阅Kafka收到消息后调用FFmpeg进行转码同时抽帧生成封面。转码完成后更新数据库状态为“已发布”并通过WebSocket通知用户。如果转码失败把消息投递到死信队列方便人工补偿。用Kafka的好处是削峰填谷用户同时上传大量视频生产者写入很快消费者根据自己的能力慢慢消费不会瞬间压垮转码服务。即使转码服务宕机Kafka也能保存一段时间消息服务恢复后可以继续消费。第二轮问题5内容表数据量达到千万级如何优化数据库分库分表怎么做数据库优化顺序是索引 → SQL优化 → 缓存 → 读写分离 → 分库分表。索引优化对查询条件中常用的user_id created_at建联合索引。避免在索引列上做函数操作遵循最左前缀原则。缓存优化把热点内容存入Redis比如首页Feed流可以直接缓存文章摘要列表减少MySQL压力。读写分离把写请求打到主库读请求打到从库用ShardingSphere或MyCat实现主从数据源切换。分库分表有两种拆法垂直拆分把一个宽表拆成多个表比如把文章正文、图片URL等大字段拆到单独表主表只留核心字段。水平拆分按某个分片键如content_id或user_id通过哈希/取模分布到多个库表中。例如拆成4个库每个库8张表总共32张表。分库分表后要注意全局唯一ID用雪花算法生成不能在多个表之间重复。跨库join不允许要改成查两次或者冗余数据。分布式事务跨库写操作需要引入Seata等分布式事务框架。全局搜索分表后MySQL不适合搜索了引入Elasticsearch。社区项目通常按content_id分片同时用ES解决全文搜索用Redis解决热点缓存这样MySQL的压力就能降下来。问题6缓存穿透、击穿、雪崩分别是什么如何解决缓存穿透查询一个数据库也不存在的key请求绕过缓存直接打数据库恶意攻击时会导致数据库压力巨大。解决1缓存空值即使查询结果是null也写入缓存并设置较短过期时间。解决2使用布隆过滤器Bloom Filter在缓存前判断key是否存在不存在直接返回。解决3接口层对请求参数做合法性校验。缓存击穿一个热点key在过期的瞬间大量并发请求同时访问数据库。解决1互斥锁。只允许一个请求去查数据库其他请求等待重试。解决2热点key“永不过期”后台线程定时重建缓存。缓存雪崩大量key在同一时间集中过期或者Redis整体不可用导致大规模请求压垮数据库。解决1过期时间加随机值比如TTL 24小时 random(0, 5分钟)。解决2多级缓存本地使用CaffeineRedis作为第二级请求先查本地再查Redis。解决3Redis部署为Cluster高可用。解决4开启服务降级和限流保护下游数据库。这三个概念一定要记牢是Java面试高频问题。问题7Redis常见数据结构有哪些在社区里分别适用什么场景String最常用。存验证码、用户token、计数器、缓存对象。比如SET login:code:13800000000 1234 EX 300。Hash适合存对象。比如用户信息HSET user:10086 name cat age 2。也适合点赞状态field用户IDvalue1/0。List有序列表。可以做关注人的动态流发布动态时LPUSH user:timeline:10086 contentId。Set去重集合。适合关注列表、粉丝列表、共同关注。比如SADD follower:10086 user1然后SINTER求交集。ZSet有序集合。每个成员带一个score适合排行榜。热门文章榜ZINCRBY hot:article 100 articleId然后ZREVRANGE hot:article 0 9 WITHSCORES。HyperLogLog基数统计。统计今日UV。Bitmap位图。适合用户签到、在线状态一个bit就能存一个用户。Geo地理位置。可以算附近的人、附近的宠物店。在“喵次元”中String存验证码和TokenHash存用户资料Set存粉丝关系ZSet存热门排行榜List存时间线。问题8如何用Elasticsearch实现全文搜索倒排索引是什么关系型数据库MySQL的索引是正排索引比如文章表有字段post_id、title、content搜索LIKE %猫%会扫全表。ES用的是倒排索引结构是“单词 → 文档ID列表”。举个例子文档1“猫咪在吃饭”文档2“狗狗在睡觉”经过中文分词后得到词语猫咪、吃饭、狗狗、睡觉。倒排表就是猫咪 → [文档1]吃饭 → [文档1]狗狗 → [文档2]睡觉 → [文档2]搜索“猫咪”时直接查倒排表得到文档1非常快。在实际项目中我们会把MySQL中的文章数据同步到Elasticsearch。同步方式业务双写在写MySQL的同时把数据写入ES。Canal监听binlogMySQL数据变更后Canal读取binlog通过Kafka发送给ES同步服务。定时任务批量同步。在Spring Boot中集成ES可以用Spring Data Elasticsearch实体类上使用Document(indexName content)。Repository接口继承ElasticsearchRepository。方法上使用Query或直接声明findByTitleLike。搜索时调用ES返回文章ID列表然后再去Redis/MySQL查详情减少ES压力。第三轮问题9微服务如何拆分服务发现和注册用什么微服务拆分要围绕“业务边界”和“团队边界”。比如一个UGC社区可以拆成用户服务注册、登录、用户资料。内容服务发帖、发视频、文章查询。评论服务评论、回复、点赞。消息服务站内信、通知、WebSocket推送。审核服务图片/文本/视频的内容安全审核。拆分原则每个服务能独立部署、独立扩展、独立维护服务之间通过HTTP/RPC通信。服务注册与发现常用组件EurekaNetflix出品Spring Cloud早期方案已经进入维护状态。Nacos阿里出品主打注册中心和配置中心国内使用广泛。ConsulHashiCorp出品支持多数据中心。Zookeeper分布式协调系统也能做服务注册中心。以Nacos为例服务启动后把自己注册到Nacos消费者从Nacos拿到服务提供者列表再通过OpenFeign或Ribbon做负载均衡调用。Nacos还支持配置中心可以动态修改配置而不重启应用。问题10服务A调用服务B如果B挂了A怎么避免雪崩服务雪崩是指一个服务故障导致调用方线程堆积最终拖垮整个系统。防雪崩的手段有三层超时设置连接超时和读取超时。比如OpenFeign的connectTimeout3sreadTimeout5s不能让线程无限等待。熔断使用Resilience4j或Sentinel。例如A调用B10秒内有50%请求失败熔断器打开后续请求直接返回fallback方法不再访问B。限流使用Sentinel控制A的最大QPS超过直接拒绝保护A自己不被打垮。隔离给不同的外部依赖分配独立的线程池比如调用B和调用C分别使用不同线程池B卡死不会占满C的线程池。Resilience4j的核心概念熔断器状态关闭 → 打开 → 半开 → 关闭。降级CircuitBreaker(name 内容服务, fallbackMethod getContentFallback)。半开时允许少量请求试探如果成功熔断器关闭如果失败重新打开。问题11JWT认证和传统Session有什么区别如何用Spring Security实现登录Session原理用户登录后服务器生成Session并保存到内存或Redis把SessionID通过Cookie发给浏览器。后续请求带着Cookie服务器根据SessionID查Session。可以主动销毁Session实现强制下线因为状态在服务端。JWT原理JWT由三部分组成Header声明算法、Payload用户信息、过期时间、Signature签名。用户登录后服务器签名生成Token返回给客户端客户端保存。每次请求在Authorization: Bearer token中携带服务器验签后直接从Token中取用户信息。服务器不保存状态所以天然适合分布式和微服务。缺点是Token本身不能主动失效只能等过期时间。如果要强制下线需要用Redis维护黑名单把Token的jti存进去。Spring Security JWT登录流程引入spring-boot-starter-security和jjwt。配置SecurityFilterChain关闭CSRF设置SessionCreationPolicy.STATELESS。实现UserDetailsService从数据库加载用户信息。登录接口中使用AuthenticationManager校验用户名密码成功后用Jwts.builder()生成Token。实现一个OncePerRequestFilter从请求头解析Token验签后把UsernamePasswordAuthenticationToken放入SecurityContextHolder。在SecurityConfig中注册过滤器并用PreAuthorize(hasRole(USER))控制接口权限。问题12线上监控怎么做如何监控Kafka消息积压和链路追踪监控体系可以分为四层指标监控应用使用Micrometer库收集指标暴露给PrometheusGrafana做可视化。常见指标JVM内存、GC次数、线程数、QPS、RT、错误率。日志监控使用Logback输出日志Filebeat采集日志到Logstash再送到Elasticsearch最后用Kibana查询。就是ELK技术栈。链路追踪微服务调用链需要TraceId串联。使用Spring Cloud Sleuth Zipkin或Jaeger可以看到一次请求从网关到用户服务再到评论服务的完整耗时。告警Prometheus的Alertmanager根据规则发送邮件、钉钉、Webhook。Kafka消息积压监控使用Kafka自带命令kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group 消费组名 --describe。查看每个分区的LAG未消费消息数量。如果Lag持续增长说明消费者跟不上需要扩容消费者实例或者增加分区数。可以使用Burrow工具自动监控Lag并暴露成Prometheus指标在Grafana上设置“Lag 阈值”的告警。没有监控的系统是很危险的面试中如果能说出“Prometheus Grafana ELK JaegerKafka Lag”这套组合会加分不少。问题13CI/CD流程如何设计Docker和Kubernetes在其中的角色CI是持续集成CD是持续部署。一个完整的CI/CD流程可以考虑以下阶段提交代码开发push到main分支触发GitLab CI。静态检查执行mvn sonar:sonar扫描代码质量。单元测试执行mvn test使用JUnit 5、Mockito、AssertJ。构建打包执行mvn package -DskipTests生成可执行Jar包。构建镜像编写Dockerfile将Jar包打入镜像比如基于eclipse-temurin:17-jre-alpine。推送镜像将镜像推送到Harbor私有仓库。部署使用Helm或kubectl set image把新镜像更新到Kubernetes集群。Docker的作用将应用和依赖环境打包成镜像保证“本地能跑线上也能跑”。常见命令docker build、docker run、docker push。Kubernetes的作用编排容器。通过Deployment管理Pod副本数Pod挂了自动重启。Service提供负载均衡和稳定访问入口。Ingress暴露HTTP/HTTPS域名路由。支持滚动更新新Pod启动成功后再杀掉旧Pod可以快速回滚。数据库版本迁移可以在应用启动前使用Flyway或Liquibase执行SQL脚本这样发布新版本不需要手动去数据库执行脚本实现“数据库即代码”。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价