ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

微服务面试八股:拆分、通信、高可用与可观测性一次讲透

微服务面试八股:拆分、通信、高可用与可观测性一次讲透 秋招模拟面试做了二十多场十个实习生里八个会说自己“熟悉微服务”但真让他们把项目里的服务拆分、注册发现、熔断降级讲清楚能撑过三分钟的不超过两个。这不是背题的问题是压根没把微服务当作一套有因果关系的系统来理解。微服务篇最迷人的地方恰恰在于它把“为什么要这么设计”写在了每一个组件背后——只要你看懂了这层因果面试里说的就不再是名词而是判断力。这篇我就按八股切入把微服务里最容易翻车、也最能让别人记住你的点拆开讲透帮你在看的过程中把自己项目里对应的地方打通。1. 实习面试里的微服务题考的不是定义而是取舍1.1 为什么微服务题能直接拉开同批实习生的水平微服务在实习面试里出现频率很高几乎所有写在简历上的项目都能扯上“微服务”三个字。但面试官听到的常见版本都是同一个微服务就是将一个单体拆成多个小服务每个服务独立部署服务之间通过接口通信。这个说法没有错只是没有任何记忆点。我做过不少模拟面和简历辅导最直观的差距是有人只能背出微服务带来哪些好处有人能同时说出它带来哪些坏处以及为了拿到这些好处要在哪些地方额外付出成本。后者才是拉开差距的地方。微服务本质上是一组架构权衡。它用分布式换取模块独立性用网络调用换取部署灵活性用复杂度增加换取团队自治。也就是说你选择微服务的那一刻就已经签了一份“接受复杂度”的合同网络可能不可靠、数据一致性不再有本地事务兜底、排查问题要从一个进程变成多条链路、发布节奏也从一次变成N次。实习生不需要做过超大规模的系统但要能把这些trade-off讲清楚。面试官问“为什么要用微服务”想听到的绝不是“因为每个服务可以独立开发部署”而是一句有判断力的话比如“因为当前团队规模、功能边界、发布频率到了某个临界点单体架构的协作成本开始超过微服务带来的拆分收益”。1.2 组件和框架只说明你做过取舍才说明你思考过另一个常见的翻车点是把微服务和Spring Cloud划等号。面试官一提到微服务马上开始报组件名字网关、Nacos、Feign、Sentinel。组件很重要它们是微服务在Java生态里的落地载体但组件只是工具。真正值钱的理解是明白这些组件每个都在解决哪一类分布式问题服务发现问题、流量入口问题、进程间通信问题、故障隔离问题、配置协调问题。光背组件名称而不理解问题一旦被追问“你这个服务挂了你怎么办”就会立刻卡住。所以这篇的准备思路也按这个逻辑来先从一张架构图把微服务全家桶的职责定下来再拆开讲拆分、通信、事务、高可用、可观测性最后给一个实习生能直接上手的实操路径。整个内容适合正在准备实习面试的同学也适合项目里已经用了Spring Cloud但一直没想过为什么的人——你会发现很多让你“背不下来”的八股其实都是可以从问题反推出来的。2. 一张架构图读懂微服务全家桶注册中心、网关、配置中心各自在扛什么很多同学看微服务技术体系最大的障碍是网上微服务架构图一张比一张漂亮但拿到自己手里不知道从哪看起。其实任何一张主流的微服务架构图核心都不会逃开三个角色注册中心、网关、配置中心。把这三个角色的位置和职责讲清楚整张图就立体了。2.1 注册中心服务发现与心跳机制所有微服务启动后第一件事不是立刻对外提供服务而是先去注册中心报到。报到信息包括IP、端口、服务名和元数据此后每隔一段时间服务要向注册中心发一次心跳证明自己还活着。注册中心连续几次收不到心跳就把这个实例从服务列表里剔除。这套机制可以理解成大学里的点名服务实例是学生注册中心是教务处。学生定期报到长期不出现就会被记为退课。这里实习生最容易忽略的是为什么不同注册中心的剔除策略不同。以Nacos为例临时实例采用客户端心跳模式不健康实例会被直接摘除持久化实例则采用服务端主动健康检查。Eureka则偏向客户端续约。面试考到CAP时注册中心是非常合适的例子Nacos、Eureka更偏向AP可用性优先ZooKeeper偏向CP一致性。为什么服务发现场景大多选AP因为服务发现里短暂读到一份过期的服务列表远比整个系统拒绝服务要好。一个服务挂了最多请求打到失败的节点由熔断重试兜住所有服务都发现不了整个调用链直接瘫痪。理解了这一点再看面试里“客户端缓存”的问题就很自然服务消费方不会每次调用都同步请求注册中心而是本地缓存一份服务列表配合定时拉取和事件推送更新。本地缓存是注册中心故障时服务还能继续工作的最后保障。能讲到这一层的实习生已经比只背“注册中心用于服务注册和发现”的人高出一截了。2.2 网关路由、鉴权与请求入口网关是外部进入微服务集群的唯一边界。它做的事情就像公司前台所有访客先到前台登记确认你来干什么、有没有权限再由前台告诉你去哪个楼层哪个工位。技术上讲就是路由转发、鉴权认证、限流熔断、请求日志等横切逻辑的统一收口。为什么不把这些逻辑写进每个服务因为一旦写进业务服务每个服务都要重复实现一堆与业务无关的代码策略调整时所有服务都要跟着发版。收口到网关后边界清晰改造只动一个点。Spring Cloud Gateway是基于WebFlux的响应式网关两层核心概念要记清路由和过滤器。路由由ID、目标URI、断言组成断言决定“什么请求走这条路由”过滤器分为全局过滤器和网关过滤器在请求前后执行横切逻辑。面试被问“请求到网关之后发生了什么”按“断言匹配路由 → 过滤器链处理请求 → 转发到下游服务 → 响应再经过过滤器链返回”这个顺序讲下来就够了。2.3 配置中心配置热更新与版本管理服务多了以后最痛苦的事情之一就是配置管理。每个服务的数据库连接、超时时间、线程池大小散落在各个进程里改一个参数要重新发布。配置中心把配置从服务进程里抽出来集中管理并支持运行时动态刷新。动态刷新的原理并不复杂客户端长轮询或监听配置中心配置变更后把变化推给客户端客户端触发上下文刷新重新绑定配置的Bean。但实际使用有个容易踩的坑配置没有“生效”。比如在Nacos里改了配置客户端日志显示拉取成功业务代码读到的还是旧值。原因通常是对注解使用不当——Spring的Value在Bean初始化时就已经把值注入到内存里配置中心刷新只能触发RefreshScope标注的Bean重新创建。类上如果不加RefreshScope改配置等于白改。这种低门槛坑先在自己的项目里踩过一遍面试时被深挖也不慌。2.4 请求在架构图中的完整路径把三个角色拼起来一条完整链路是这样的客户端请求先打到网关网关根据路由规则决定转发到哪个服务服务B在处理过程中需要调用服务C就从注册中心拿到C的实例列表发起远程调用所有服务的配置统一从配置中心读取调用过程中产生的问题由监控和链路追踪系统记录。能让这张图在脑子里跑起来后面所有环节都有了坐标再往下拆分和通信就有地方挂了。3. 拆分微服务业务边界、依赖方向与粒度面试官真正想听的三件事微服务面试里十个人有五个会被问“你的服务是怎么拆的”。这个问题非常刁钻没有标准答案却最能暴露一个人有没有真的做过架构思考。3.1 按业务域拆分而不是按技术层拆分第一原则是按业务能力划分边界也就是把一件事情从开始到结束的完整闭环划到一个服务里。以电商系统为例可以按用户、商品、订单、库存、支付、营销等业务域拆而不是按controller、service、dao拆成一个“前端服务”一个“后端服务”。很多实习生在个人项目里用微服务最典型的错误就是把原来的controller层、service层、mapper层各打包成一个服务结果服务之间一层层竖着调用名义上是微服务本质还是单体。这里值得记一个领域驱动设计里的词限界上下文。它意味着每个业务概念都有明确的应用边界边界内的模型完整自洽边界外的交互通过接口完成。面试时说出“我用限界上下文划分服务边界”是明显的加分项因为说明你不只是把类搬了个家而是在思考模型归属。现在业内常说的“能力中心”核心思想也是这个每个中心内部管理自己的数据和流程对外暴露业务能力。3.2 拆分信号什么情况下才应该拆很多实习生的误区是“用微服务就是高级能拆就拆”。真正专业的做法是先判断要不要拆。常见的拆分信号有三个。第一是团队协作成本成百上千人在同一个代码仓库提交代码合并冲突、发布互相踩踏。第二是发布频率不一致订单接口每天发版用户中心的改动一个月才一次强行绑在一起谁都被拖累。第三是资源伸缩需求不同搜索服务吃CPU图片服务吃磁盘放一起只能按高规格统一扩容成本浪费明显。反过来如果团队只有两三个人业务量也不大单体就是最优解。面试里敢说“我们当前业务量下不拆因为单体成本更低”比无脑拆成十个服务更招人喜欢。这背后体现的是技术判断不是技术热情。个人项目也一样拆出两三个服务把要点演示清楚就够了硬拆成十来个服务反而会被追问“你这些服务之间的数据一致性怎么保证”这个问题对个人项目来说往往答不上来。3.3 数据归属与依赖方向不能忽视的硬约束服务之间可以共享接口但不能共享数据库表。一旦两个服务读写同一张表就形成了库表级耦合表结构一变更两边都要跟着改还说不清数据到底归谁管。面试官很喜欢问“订单服务和库存服务都要改库存表怎么办”正确的思考方向是库存数据归属库存服务管理订单服务只能通过库存接口去扣减再通过消息或接口回调拿到结果。依赖方向也是一个约束。服务间依赖不能成环A依赖B、B依赖C、C又依赖A一改动就变成蜘蛛网。领域驱动里常提依赖倒置落到微服务层面就是核心业务服务不要反向依赖边缘服务让依赖图保持清晰的方向。面试时能说出“我们会检查服务调用方向不允许循环依赖”的人思考成熟度是看得见的。3.4 拆分的粒度怎么定粒度怎么定判断标准不是服务数量而是“每个服务能不能独立维护、独立部署、独立演化”。服务粒度越细独立性和弹性越强但跨服务调用、数据一致性、运维复杂度也就越高。现在主流的做法是先粗后细第一轮先按大的业务域拆每个域内部保留一定模块性等某个域内部的模块出现独立扩展、独立发布的需求时再把它拆出去。也就是说把拆分当作演进动作而不是一次性设计动作。这句话能讲出来面试官基本就点头了。4. 服务间通信的选型HTTP、RPC和Feign超时重试为啥最容易翻车微服务拆完之后最关键的问题就是服务之间怎么通信。这个点面试考察最密集也最容易暴露“只知其然”。4.1 REST与RPC两种风格的选择站在高一点的角度看服务间通信无非两大流派一是基于HTTP的REST风格轻量、跨语言、容易调试Spring Cloud默认使用的就是这种二是基于TCP的RPC框架比如Dubbo、gRPC强类型、性能好、适合对延迟敏感的大规模内部调用。被问“REST和RPC怎么选”时重点不是死记区别而是说出取舍外部开放接口、生态多样、需要跨语言的场景选REST内部高频调用、对性能苛刻、调用方和被调用方都由自己控制选RPC。不少团队在微服务内部混合使用两种方式对外REST对内RPC这种回答能体现实战经验。4.2 Feign在调用链里的位置Java生态里最常用的远程调用方式是OpenFeign。本质上Feign是一个声明式的HTTP客户端定义一个接口在上面用注解声明URL和参数Feign在运行时生成代理类把方法调用转成真实的HTTP请求。它和负载均衡配合紧密Feign内置了负载均衡能力从注册中心拿到服务实例列表后按策略选择一个实例发起请求。项目里能说出“我在消费方依赖了Feign通过服务名调用而不是写死IP”是基本线。进阶一点要理解Feign的超时配置。很多新手用默认超时结果服务端一个慢查询拖三四秒Feign就报超时调大超时又容易造成线程堆积。要回答好这个问题需要给链路上每一跳做预算网关→服务A→服务B每一跳能容忍的延迟、连接池大小、线程数都必须提前定好而不是靠猜。面试官很认可的答案是“我设置读超时1500ms、连接超时1000ms因为下游P99延迟在800ms左右”这种有数据支撑的回答比背配置项有用得多。4.3 超时和重试会放大故障的蝴蝶效应通信最容易翻车的就是超时与重试。经典场景如下服务A调用服务BB因为数据库慢响应延迟从500ms涨到5s。A设置超时3s大量请求报错A还开启了重试每次失败重试两次并发瞬间翻三倍打向B。B本来就慢现在更慢下游C也被拖下水。这个场景在面试题里有个经典名字重试风暴。能说出两个原则就够了第一超时时间必须短于链路总预算第二重试只适合幂等且瞬时失败的调用不能用重试来解决下游持续不可用的问题。还要考虑幂等。凡是可能重试的接口都必须做到幂等也就是同样的请求执行多次和一次结果一样。接口幂等的实现方式通常是唯一业务号加幂等表请求来了先查幂等表存在就直接返回上次结果不存在则插入并执行。能再补一个“支付回调、订单创建这类接口必须做幂等处理”的场景面试官会持续追问能把“为什么必须幂等”和“怎么实现幂等”讲通是非常大的加分项。4.4 异步与消息队列把强同步变成弱耦合除了同步调用微服务之间还有一种重要通信方式是异步消息。拿订单和库存举例用户下单后订单服务不必同步等库存扣减完毕再返回而是发一个“订单创建”事件到消息队列库存服务订阅事件自己完成扣减。好处是解耦订单服务不需要知道库存服务的细节库存服务也不拖累下单主链路代价是链路变成最终一致需要额外处理幂等、消息重复、消息丢失。能讲清楚同步和异步各自适用的场景说明你对通信模式的理解不止一层。5. 分布式事务与一致性TCC、Saga和最终一致性怎么讲才不翻车这是很多实习生的重灾区。单体时代一次请求本地事务就能搞定;拆了微服务后一次订单操作可能要更新订单库、扣库存、加积分跨多个服务的数据库本地事务失效。面试官问分布式事务其实是想看你能不能说出几种方案以及每种方案的代价。5.1 为什么本地事务在分布式环境下失效本地事务通过数据库的ACID特性保证一致性前提是“所有操作在同一个库、同一个事务管理器里”。微服务拆分后数据和事务被分散到多个独立的库一个事务从跨表变成跨进程A库提交了B库提交时失败两边数据就处于不一致状态。分布式事务要解决的就是这类跨库跨服务的原子性问题。讲到这里你已经比多数只会背名词的人强了。5.2 2PC与XA协调者模型和它的局限两阶段提交是经典的协调者方案第一阶段准备所有参与者执行本地事务但先不提交向协调者上报“可以提交”第二阶段协调者根据所有参与者情况决定提交或回滚。它的局限非常明显准备阶段所有资源被锁定协调者单点故障会导致整个事务卡住参与者阻塞等待时间越长数据库连接和行锁占用越多系统吞吐急剧下降。所以高并发互联网场景下它不是主流选项。提到2PC时能主动说出这几个代价面试官能听出你真的思考过。5.3 TCC方案补偿替代回滚TCC是对业务侵入性更强、但不依赖数据库锁的方案分为Try、Confirm、Cancel三步。Try阶段冻结资源比如扣款服务先冻结用户100元、库存服务先预留2件商品Confirm阶段所有Try都成功后真正扣款、扣库存Cancel阶段任一流程失败时释放冻结的资源。TCC最大的好处是不用锁数据库行事务时间窗口更短代价是每个业务都要实现三段逻辑开发量翻倍还要保证Confirm和Cancel的幂等。面试中能提到Seata这类开源框架的AT模式以及它如何通过生成反向SQL来做自动补偿属于锦上添花。5.4 Saga与最终一致性能容忍短暂不一致的场景很多实际业务不需要跨服务强一致只要最终一致就够了。Saga就是这种思路把一个长事务拆成一系列本地事务每步都提交通过编排或事件驱动的方式依次推进如果某一步失败就执行前面步骤对应的补偿操作。它和TCC最大的区别是Saga没有预留冻结资源阶段补偿相当于反操作而不是释放冻结资源。实现层面被问最多的是“怎么保证消息不丢失”和“怎么保证消息不重复”。一般结合本地消息表或事务消息来做在业务库里同一个事务写业务数据和消息记录保证要么都成功要么都失败再由定时任务扫描未发送消息投递到消息队列消费端通过唯一消息ID做幂等。这套“本地消息表定时任务消费幂等”的组合在产业界非常成熟也是面试加分回答。回答时要强调最终一致性不是“不要一致性”而是“用对账和补偿机制让数据在一段时间内收敛到一致”。5.5 面试里更好的答法被问“你们这个场景需要分布式事务吗”最好先做判断是不是真的跨了多个服务的数据库能不能通过调整边界避免跨服务事务能不能用最终一致代替强一致如果都可以就不要用分布式事务框架因为它带来的复杂度和性能代价远超一般场景的承受能力。只有业务强一致场景才考虑TCC或2PC。这句话说完面试官对你架构判断力的评价会比背方案名称高得多。6. 高可用三板斧熔断、限流、降级别再把三个词当成一个词实习面试高频题里熔断、限流、降级经常一起被问也经常一起被答错。这三者都是保护系统的手段但保护对象、触发条件和落地方式完全不一样。6.1 三个手段的本质区别先给一个对照方便记忆手段保护对象触发条件典型姿势熔断下游服务防止上游调用拖垮自己下游连续错误率达到阈值断开调用快速失败过段时间半开试探限流上游流量防止突发请求击穿链路请求速率超过设定阈值令牌桶、滑动窗口、漏桶降级非核心功能优先保住核心链路系统压力过大或依赖不可用走缓存、返回默认值、关闭非核心功能熔断直接借鉴电路里的保险丝思想当系统不健康时不要再放请求进去而是打开开关快速失败给下游喘息的机会。一个实现了熔断的调用要维护三个状态关闭、打开、半开。关闭状态正常放行错误比例超过阈值就打开打开状态直接拒绝一段时间后进入半开放少量探测请求成功则关闭熔断失败则重新打开。回答熔断能提到状态机转换远比“服务挂了就断掉”专业。限流要把算法分清楚。计数器固定窗口有边界突刺问题窗口边缘可能瞬放两倍流量滑动窗口把窗口切成更小的时间片解决突刺但不彻底漏桶把请求排成队列以固定速率处理适合保护下游令牌桶按固定速率发令牌同时允许一定量突发适合保护整体吞吐。被问“你们项目的限流怎么做的”能答“网关层用令牌桶限流业务侧再做一次精细化限流双层限流”就很有层次感。降级容易被误解为“功能坏了不做”实际上降级是主动的、有设计的取舍。比如推荐服务挂了降级成返回热门默认列表而不是报错首页价格展示接口慢降级成显示缓存里的历史价格评论服务不可用降级成暂时不展示评论区而不是白屏。回答“降级和熔断有什么区别”时核心讲一句“熔断是被动触发后快速失败降级是主动牺牲非核心来保全核心链路”就很清楚。6.2 常见的认知错误很多人把熔断和限流说成同一件事这在追问时容易崩盘。它们有本质区别熔断是下游失败的响应限流是上游过载的预防熔断是从调用方对被调用方的保护限流是从入口到系统的保护。可以在同一个项目里两个都用但每个做的事情不同自己必须分清楚。还有些实习生一提高可用就是“用了Sentinel”“用了Hystrix”只报组件名。更好的讲法是先说我遇到了什么问题典型症状是什么再选哪个组件解决它的原理怎么工作。比如“秒杀活动瞬时流量达到平时十倍网关层出现超时我用Sentinel设置每秒1000 TPS的令牌桶限流超过直接返回系统繁忙”。面试官想听的是问题→方案→原理这条链。6.3 高可用和微服务的整合思路实际操作里这三板斧几乎每个微服务都会配一套入口网关对全局流量限流核心服务之间配置熔断和降级策略非核心依赖比如短信、推送在压力期主动降级。就算面试中不谈具体组件也要让面试官知道你心里有这张“治理全景图”。记住一句话微服务架构的可用性不是单个服务不出故障而是故障出现时不扩散、能收敛、可恢复。7. 可观测性是你偷偷翻盘的地方日志、链路追踪与监控前面几个话题大多数实习生都能聊几句可观测性才是真正分出注意力的地方。因为面试里主动提到日志和链路追踪的人非常少谁能聊清楚谁就能拿到加分项。7.1 三个支柱一起用才能回答“下单慢”的问题可观测性有三个支柱Metrics指标、Logging日志、Tracing链路追踪。微服务拆开后一个问题可能跨多个服务传统单机日志基本失效。举一个常见的面试场景用户反馈“下单很慢”你怎么排查有可观测性的人会回答先看网关层的监控大盘找到下单接口的P99延迟再点进链路追踪按TraceId把一条跨订单、库存、支付服务的完整调用链展开定位到底是哪个服务耗时最长再翻对应服务的日志找到是SQL慢查询还是外部调用超时。这个回答把三个支柱全用上了而且是真实排查顺序。7.2 链路追踪的原理其实不复杂链路追踪的实现原理不复杂每次请求进入系统时生成一个全局唯一的TraceId在网关或服务入口通过拦截器把这个TraceId放进日志上下文调用下游时通过HTTP头透传。下游同样把TraceId透传到更下游并把一条链路里每个节点耗时记录下来形成树状结构。Java里最常用的落地是MDC加过滤器或拦截器把TraceId注入logback的pattern。面试里能说出“我用MDC把TraceId埋进日志配合Zipkin或SkyWalking查看全链路状态”已经超出多数实习生的认知范围。7.3 监控别只盯平均值P99才是真实感受监控指标上最值得记住的四个黄金指标是延迟、流量、错误、饱和度。对应到实际就是接口的P50、P95、P99延迟、QPS、错误率、线程池和连接池使用率。答“为什么看P99而不是平均值”是十分加分的点平均数会被极少数慢请求拉高掩盖真实体验P99代表最差1%用户的感知如果P99和P50差距过大说明存在长尾延迟。现在团队普遍用Prometheus采集指标、Grafana展示、PromQL配置告警。实习生哪怕只在自己电脑上搭了一套也能说出很多实操细节。还有一个常被忽略的细节健康检查。监控告警必须和健康检查配套否则监控只会在故障爆发后报警而不是提前暴露。微服务环境下每个服务要暴露独立的健康检查接口区分存活检查和就绪检查。这个细节在容器编排场景里非常关键能说出来也能体现你的系统性。可观测性放到面试后段讲还有个策略上的好处面试官会觉得你不仅有编码能力还具备排查线上问题的工程素养这是参与生产系统的必要潜质也是“拉开差距”最直接的地方。8. 实习阶段最值得动手的事从IDEA搭建一个微服务骨架开始聊了这么多理论和概念最后还是得落地。对于还在学校或刚进入职场的实习生我不建议一开始就啃Spring Cloud全家桶全部组件而是用IDEA从零搭一个最小的微服务骨架让架构图里的东西在自己的机器上真正跑起来。8.1 最小骨架怎么搭在IDEA里新建一个Maven父工程只放pom.xml负责统一依赖版本管理然后在父工程下创建几个子模块一个网关服务、两个业务服务比如订单服务和用户服务、一个公共模块放通用DTO和工具类再引入Nacos把服务发现跑起来。流程大致是父POM里加入Spring Cloud版本管理每个子模块引入对应starter启动类加上EnableDiscoveryClient启动Nacos启动两个业务服务观察Nacos控制台的服务列表里出现实例。这个过程完成后架构图上的注册中心就“活”了。我见过不少实习生卡在第一步父POM的依赖版本没对齐Spring Cloud和Spring Boot版本不兼容启动就报错。这里给一个经验用Spring Initializr生成项目时先把Spring Boot版本定下来再根据版本兼容矩阵选Spring Cloud版本。否则会陷在从网上复制配置的坑里最后连启动类都跑不起来。把最小链路跑通之后再逐步加网关路由配置、Feign调用、配置中心。每次只加一个组件出了问题也容易定位。8.2 怎么读一个成熟开源项目自己搭骨架的好处是知道每个组件解决什么问题但只看自己搭的骨架容易停留在demo水平。这时候可以找一个开源的微服务项目去读。比如若依微服务PLUS也就是RuoYi-Cloud对应的升级版是很多公司内部脚手架的原型代码结构、模块命名、权限处理都比较规范。读这类项目的正确姿势不是先把全部代码跑起来而是先看模块划分哪些是基础服务、哪些是系统服务、网关怎么路由、认证中心怎么做单点登录。再挑一条完整业务链路去看请求进来走哪个网关路由经过哪些服务Feign在哪里被调用数据库怎么归属。这样读一个月比闷头写十天Demo管用得多。8.3 给个人项目找一个真实落地点如果还想再进一步可以把一个真实的小功能挂到自己的微服务骨架上。比如接入公众平台的测试号服务API做一个关注、回复、模板消息的小功能把它作为个人项目的一部分。为什么要用这样的功能因为足够简单能快速打通“服务接收外部回调→处理业务→调用下游服务→返回结果”的完整链路还能涉及签名校验、配置管理等真实问题。个人项目的微服务不需要追求大而全但要能自洽你拆了订单服务和库存服务就得能回答为什么拆、跨服务的数据一致性怎么处理如果回答不了宁可先不拆。我给实习生的建议一直是微服务这部分面试准备真正值钱的是把“为什么”想明白而不是把组件和名词背熟。架构图上的每个组件都对应一个分布式环境下的痛点面试官想确认的就是你看到痛点并且能解决不是听你报菜名。能在自己的机器上把一个最小骨架跑通再按这篇文章的思路把每个组件的职责和取舍想清楚秋招面到微服务相关的问题大概率能比同批实习生多说出一句“这里为什么这么做”。这一句话就是差距。
返回列表