Java 大厂面试实战:Spring Cloud + Kafka + Redis + AI RAG 的互联网医疗问答场景 Java 大厂面试实战Spring Cloud Kafka Redis AI RAG 的互联网医疗问答场景场景设定互联网大厂 Java 岗位面试业务方向是互联网医疗与智能客服系统。面试官风格严肃燕双非负责把简单问题答明白把复杂问题答得含糊但不失礼貌。第一轮基础设施与服务拆分面试官如果你负责一个互联网医疗问诊平台前端提交问诊单后后端怎么拆服务为什么不用单体硬扛燕双非我会先拆成用户服务、问诊单服务、医生排班服务、消息通知服务还有一个审计日志服务。单体也能做但问诊单、支付、消息这些模块的发布节奏不一样拆开以后可以独立扩缩容出问题也更容易隔离。面试官你提到了独立扩缩容那服务之间通信你怎么选HTTP、Feign、gRPC、还是消息队列燕双非同步查询类我会用 OpenFeign 包一层 HTTP 调用接口简单排查也直观对接排队、通知、异步生成报告这些我会走 Kafka。比如患者提交问诊单后主链路先返回受理结果后续的医生分诊、短信通知、风控校验都异步做。面试官那如果医生排班服务挂了整个链路怎么兜住燕双非可以加 Resilience4j 做熔断、限流和超时控制。排班服务不可用时先返回降级提示或者走缓存中的兜底班表避免把主链路拖死。面试官你这个思路是对的。继续往下说配置和依赖管理怎么保证多模块项目稳定燕双非我会用 Maven 统一管理父工程和依赖版本公共 BOM 固化 Spring Boot、Jackson、测试框架这些版本避免子模块自己乱升版本导致冲突。第二轮数据、缓存、权限与可观测性面试官问诊单落库以后医生会频繁查看待处理列表。你怎么设计数据库和缓存燕双非问诊单主表落 MySQL读多写多的列表页可以配 Redis 缓存热点医生的待办统计。数据库访问层我会优先用 MyBatis 或 JPA 取决于团队风格复杂查询偏 MyBatis领域对象清晰的话用 JPA。连接池选 HikariCP性能和稳定性都不错。面试官缓存和数据库一致性呢燕双非先写库再删缓存或者通过消息通知去异步失效缓存。像医生排班这种变更频率不高的数据可以设置较长 TTL问诊状态这种高频更新数据就不适合长时间强缓存。面试官患者隐私和医生权限怎么控制燕双非登录态可以用 JWTSpring Security 负责鉴权。医生、护士、管理员用不同角色和权限点控制敏感接口再叠加接口级审计。涉及跨系统集成时也可以考虑 OAuth2 或 Keycloak 统一身份认证。面试官如果线上说“接口慢了”你怎么定位燕双非我会先看 Micrometer 指标再结合 Prometheus 和 Grafana 看 QPS、P95、错误率如果是链路问题再查日志和 Trace必要时用 Zipkin 或 Jaeger 追踪一次完整调用。慢点可能来自 SQL、缓存穿透、下游超时也可能是线程池打满。面试官这个回答比刚才具体。那测试怎么补燕双非核心接口用 JUnit 5 配合 Mockito 做单测业务规则多的话再补 AssertJ 断言。比如“问诊单状态流转”这种测试应该覆盖正常流转、重复提交、并发抢单和异常回滚。第三轮AI 问诊、异步编排与架构演进面试官现在要给这个平台加一个 AI 问诊助手怎么做怎么避免胡说八道燕双非我会把它拆成检索和生成两部分。先从企业知识库、医生手册、药品说明里做文档加载和向量化放到向量数据库里再做语义检索最后把检索结果和用户问题一起交给大模型生成答案。这样比纯聊天更稳。面试官你说的是 RAG。那如果要让 AI 调内部服务比如查挂号、查订单、改预约怎么做燕双非可以接 MCP 或者工具执行框架把内部能力标准化成工具。模型先判断要不要调用工具再由后端安全地执行。这样比让模型自己编造接口更可靠也方便扩展。面试官那复杂工作流呢比如患者先问诊再分诊再开单再支付再推送通知。燕双非这个就适合用事件驱动加状态机。主链路通过 Kafka 解耦关键状态写数据库异步任务做通知和报表。如果流程特别复杂可以再拆成编排服务或者引入工作流引擎但我不会一上来就把系统做重。面试官最后一个问题Java 这边你如何看待版本升级燕双非我会优先看 Java 17。比起 8它在语法、性能和长期维护上更合适如果团队历史包袱重至少也要把 JVM 参数、GC、启动时间这些先治理好。语言升级不是为了炫技是为了把工程复杂度压下来。面试官行今天先到这。你回去等通知吧。题目详解1. 服务拆分为什么适合互联网医疗平台互联网医疗天然具有强业务隔离用户、问诊单、医生排班、支付、通知、审计都属于不同生命周期的能力。拆分后既能按业务独立扩容也能降低故障面。问诊高峰时排班和通知模块可能压力不同单体会把所有模块绑在一起局部问题容易放大成全局问题。2. OpenFeign 和 Kafka 怎么分工OpenFeign 适合同步查询和即时决策比如查医生信息、查排班、查订单。Kafka 适合异步削峰和事件传播比如提交问诊单后触发分诊、通知、审计、统计。简单判断标准是当前请求是否必须立刻拿到结果。必须立刻知道答案就走同步不必须就尽量异步。3. Resilience4j 的价值是什么在医疗场景里下游服务不可用不能把主流程一起拖垮。Resilience4j 能做超时、熔断、限流、隔离避免雪崩。比如排班服务短时故障时可以返回兜底班表或稍后重试提示先保证患者能完成提交。4. 为什么连接池常选 HikariCP它轻量、性能稳定、行为可预测适合高并发场景。互联网医疗常见的是读多写多混合流量连接池的健康程度会直接影响延迟。连接池不是越“功能多”越好关键是稳定和好调。5. 缓存一致性怎么做得更稳常见策略是先写库再删缓存避免脏读长时间存在。对于弱一致可接受的数据可以用消息异步失效缓存。对于强一致要求高的数据比如支付状态就不要过度依赖缓存必须以数据库为准。6. JWT 和 Spring Security 怎么配合JWT 负责携带身份声明Spring Security 负责认证、鉴权、上下文传递和权限决策。常见做法是登录后签发 JWT请求进入网关或应用时解析 token将用户身份放入安全上下文再按角色和权限控制接口访问。7. 为什么还要考虑 OAuth2 或 Keycloak当系统有多端、多机构、多租户接入时统一身份认证比自己手搓登录体系更稳。OAuth2 适合授权协议层Keycloak 适合快速落地统一身份、单点登录和权限管理。医疗平台如果要对接医院、第三方机构、移动端和运营后台这套东西会很有价值。8. Micrometer、Prometheus、Grafana 怎么串起来Micrometer 是指标采集门面Spring Boot 里接入方便Prometheus 负责抓取和存储时序指标Grafana 负责展示。你能看到 QPS、延迟分位数、错误率、JVM 内存、线程池状态这些数据比“感觉慢了”更能定位问题。9. Zipkin 或 Jaeger 解决什么问题它们解决分布式链路追踪。一次问诊提交可能经过网关、用户服务、问诊单服务、消息服务、通知服务慢在哪里不能只看单点日志。Trace 能把一次请求串成完整路径定位超时点、重试点和异常点。10. JUnit 5、Mockito、AssertJ 应该怎么搭配JUnit 5 负责测试框架组织Mockito 负责隔离依赖和模拟外部调用AssertJ 负责更可读的断言。比如测试问诊单状态机时把支付和通知服务 mock 掉只验证状态变更、事件发布和异常处理是否正确。11. RAG 为什么比直接问大模型更适合医疗知识场景医疗问答很怕幻觉。RAG 的核心是“先检索再生成”让模型基于可信文档回答。这样可以显著降低胡编乱造的概率。业务上还可以按来源打分、按时效过滤、按科室分域检索进一步提升可靠性。12. MCP 和工具调用框架的意义是什么它们的价值在于把模型能力和后端能力分层。模型负责理解意图工具负责真实执行。比如查挂号、改预约、查化验单这些都应该通过标准化工具调用完成而不是让模型“猜一个接口”。这样更安全也更利于审计和扩展。13. 复杂工作流为什么适合事件驱动医疗业务里很多步骤不是强同步的。患者提交后主链路只需要保证“提交成功”后续分诊、通知、统计、报表都可以事件驱动。事件驱动能降低耦合减少级联超时也便于补偿和重试。14. Java 17 在面试里怎么讲才靠谱不要只说“新版本更快”。要讲清楚语法更简洁、运行时和维护周期更合理、一些长期历史包袱可以逐步清理。面试官更关心你是否会结合团队现状做升级而不是只会追新。感谢阅读。希望这篇文章能帮助大家把 Java 面试知识和真实业务场景串起来既能看懂题也能在面试里讲清楚。祝大家都能把基础打牢把表达练顺顺利拿到满意的 offer。