§ 7.4 · Section

服务网格

Service Mesh · Sidecar · Istio · 微服务的流量治理层

上一节结尾埋了个钩子:一次"付款"点击,机房内巷里十几个服务挨家挨户串门,哪一棒掉了都难查。这一节就讲为"内巷"而生的整套治理体系——服务网格(Service Mesh)。按本站约定,这一节同样停在概念层:不碰 Istio 的配置文件,只回答三个问题——它为什么存在、它凭什么把治理从程序里"偷"了出来、它到底替工程师管了哪些事。一句话概括:服务网格干的事,是给一家几百个部门互相串门的巨型公司,配一套统一编制的秘书处——每个部门旁边坐一名秘书,所有电话一律先过秘书的手。

生活场景
🏙️ 一座产业园区,和它快要累死的老板们

想象一座巨型产业园区,里面几百家公司互相做生意:甲公司下单要找乙公司核库存、乙公司又要找丙公司对账。一开始,每家公司都自己处理对外事务:老板亲自接电话、亲自登记访客、亲自对暗号、亲自应付催款。

几百家公司,一千个老板,每人一套土办法。结果谁都可以想象:电话礼仪五花八门、暗号天天对错、新来的供应商不知道该按谁家的规矩办事,而园区管委会想让所有公司统一用电子发票,得挨家挨户劝一年。

后来园区换了活法:物业出面,给每家公司门口派驻一名统一培训的门童。所有对外电话、访客、单据,一律先经过门童:按统一的守则登记、对统一的暗号、高峰时统一排队、出事统一上报物业。公司老板从此只管做自己家的业务,对外的一切"规矩",全部外包给了一层看不见的编制——这就是服务网格的全部立意。

先把这一节的术语翻译成人话

照例,先上术语表。这张表里的词头一次看会觉得又多又玄,但它们全都对应园区故事里看得见摸得着的角色。读完正文再回来对一遍,会有"原来全是这意思"的快感。

术语换成大白话生活里对应的东西
微服务(Microservice)说白了就是"把一栋大宅院拆成几十栋小楼,各过各的"老宅分家:一大家子拆成独立小家庭
单体应用(Monolith)说白了就是"全家人住一个大宅院,喊一嗓子就通"祖屋大院:厨房客厅一体,抬头见人
服务网格(Service Mesh)说白了就是"园区物业配的整套门童体系"统一物业管理的产业园区
sidecar(边车)说白了就是"蹲在每个服务旁边、替它收发所有流量的专职秘书"领导的专职秘书 / 摩托边斗
Envoy说白了就是"园区统一采购、统一培训的那款门童"——干实事的信使连锁保安公司派驻的标准保安
数据面(Data Plane)说白了就是"真正在门口收发件、执行守则的全体门童"园区里站岗干活的门童们
控制面(Control Plane)说白了就是"给全体门童下发守则、汇总情况的物业总部"物业调度中心 / 保安公司总部
灰度发布(金丝雀发布)说白了就是"新版先放 5% 的客人试吃,没事再全量"新菜先上一小桌给熟客试
熔断(Circuit Breaking)说白了就是"楼下书店一直不接电话,就先别打了,过会儿再试"跳闸的保险丝:先断电,保住全屋
限流(Rate Limiting)说白了就是"排队进店,一次只放十个人"景区闸机:分批放行
mTLS(双向加密认证)说白了就是"内巷里两家串门,先对暗号再说话,话还是密语"对暗号接头,说的还是黑话
链路追踪(Tracing)说白了就是"给每个请求挂一张追踪单,走到哪家盖个章"快递单的物流轨迹
可观测性(Observability)说白了就是"园区装满监控和台账,哪有事一查便知"物业的监控室和巡更记录

一句话串起整节:微服务是分家,单体是大宅院;sidecar 是每家的门童,Envoy 是标准款门童;数据面是全体门童,控制面是物业总部;灰度、熔断、限流、mTLS、链路追踪,是门童守则里的五条铁律。下面从"为什么会有微服务"讲起。

故事从一栋大宅院讲起:单体应用时代

要理解服务网格治的是什么病,得先看这个病是怎么得上的。早年的软件系统几乎都是单体应用:网站的页面、下单、库存、支付、短信,全部写进同一个程序,跑在同一台机器上,部署成一个整体。好比祖孙三代住一栋大宅院:找谁都是喊一嗓子的事——订单模块调库存模块,就是一次普通的函数调用,纳秒级到家门口,连"网络"二字都用不上。

大宅院的日子在小门小户阶段确实滋润:盖一次房、通一次水电,全家受益;没有院墙内外的通信问题,也没有对暗号的必要——都是自家人。今天一个个人博客、一个小公司官网,依然是这种活法,而且活得很好。先把这个判断立住:单体不是落后,它是"规模没到"时的正确答案。

可宅院一旦住进几百口人,麻烦来了。想在东厢加个新房,得全家停水停电配合施工(改一处代码、全站重新部署);厨房失火全家疏散(一个模块内存泄漏,整个进程一起死);最要命的是人多嘴杂改不动了:几百人共住一院,谁也不敢动承重墙,任何一个改动都可能砸到别人屋里——工程上叫"耦合",人话叫"牵一发动全身"。

分家:微服务的甜与苦

于是行业选择了分家:把大宅院拆成几十栋独立小楼——订单家住一栋、库存家住一栋、支付家住一栋,各自过日子、各自装修、各自请佣人(各自的容器和数据库,正好用上 § 7.3 的整套家伙)。小楼之间要协作怎么办?从"喊一嗓子"升级成"打电话"——楼与楼之间的沟通,从此全部变成网络调用

分家的甜头是实打实的:支付楼半夜装修,不影响订单楼睡觉(故障隔离);订单楼用户涨了,单独给这栋加盖三层(独立扩容);每栋楼可以用最顺手的方式装修(技术栈自由)。但是,上一节我们已经看过账单的一面:一次付款要在内巷里串十几个门。分家把"喊一嗓子"变成了"打几十个电话",而电话这件事,天生就是会出事的。

出什么事?老电话本上的问题全来了:占线(对方服务忙不过来)、空号(对方刚重启,地址变了)、没人接(对方卡死了)、接了但半天才吭声(对方变慢,拖累你也变慢)。更要命的是"传导":订单楼打不通库存楼,本来只是一件小事,可订单楼里几十个"业务员"全堵在这一通电话上干等,很快订单楼自己也瘫了——好比一家超市的收银台断网,队排到马路上,整条街都以为这店倒了。微服务世界里最经典的灾难不是"某个服务挂了",而是"一个服务变慢,拖死一片本来健康的服务"。

无网格时代的发布日:一段值得听的老故事

这段历史的真实版本,值得每一个用着顺手的现代人来听一听。网格普及之前,一家大型互联网公司的"发布日"是这样的:周三晚上十一点,流量最低谷,全公司进入战备状态——运维守着大屏,产品经理攥着手机,程序员把回滚脚本放在手边,客服提前打招呼"今晚可能有投诉"。新版本推出去,然后是煎熬的三十分钟:错误率没涨?速度没掉?客服群安静?每一项都要人肉盯。一旦哪个指标飘红,指挥室一声令下"回滚",全员再熬两小时把旧版请回来。一个礼拜一次的例行公事,愣是过成了月度大考。

而这一切的根源,说来心酸:不是没有防护措施,而是防护措施长在每个服务自己的代码里,参差不齐。A 团队的服务配了超时,B 团队的忘了配;C 团队重试三次,D 团队重试十次;灰度全靠运维手工把某台机器摘出负载均衡——好比一支没有指挥的交响乐团:每件乐器都很专业,可什么时候该强、什么时候该弱,全凭各自临场发挥,演出事故全靠运气。服务网格的诞生,本质上是给这支乐团请了一位指挥:节奏不再由几百件乐器各自决定,而是由同一份总谱统一调度。

第一代解法:把规矩塞进每家公司自己屋里

工程师的第一反应很朴素:既然打电话有风险,那就教每个业务员一套"打电话守则"——拨不通就等两秒重拨一次;连着三次不通就别再打了(熔断);对方说"稍等"超过三秒就挂断另想办法(超时)。这套守则被写成现成的代码库(SDK),嵌进每个服务的程序里,美其名曰"服务治理框架"。

这个方案能用,但园区故事里预演过的坑一个不少:第一,语言不通。园区里有中文公司、英文公司、日文公司,守则得给每种语言各翻译一份、各维护一套——Java 一套、Go 一套、Python 一套,物业(平台团队)疲于奔命。第二,守则升级靠求人。总部想统一改一条规矩,得挨家挨户劝:"您把屋里那份守则换新版呗?"——几百个团队几百个排期,推广一年半载是常态。第三,动静大。守则是嵌在业务程序里的,每改一条规矩,理论上所有公司都要"停业半天重新装修"(重新编译、重新部署)。

这段历史在现实里有位大名鼎鼎的主角:Netflix。这家公司把 DVD 租赁生意搬上互联网后,被微服务的"电话病"折磨得最狠,于是把自家的救命三件套开源成了行业标配——其中最有名的就是熔断器 Hystrix(希腊语"豪猪",浑身是刺的防御大师)。那几年,全世界的 Java 公司都在自己屋里供奉这套"自家药箱"。但药箱终究是各家自备的:Netflix 后来自己也停掉了它的维护,社区的目光整体转向了下一代方案——药不该每家自己煎,该由园区统一配药房。这个转向的终点,就是我们马上要讲的关键发明。

说白了,这一代方案的本质是:治理逻辑长在业务代码的肉里,规矩一变就得动肉。能不能让规矩跟肉分开、改规矩不动肉?这个念头,直接催生了本节的主角。

关键发明:把秘书从屋里搬到门口(sidecar)

转机来自一个非常朴素的想法:既然守则管的全是"对外通信"这件事,那干脆别把守则塞进屋里了——在每个服务旁边,专职安排一个人来管电话。这个人就是 sidecar(中文叫"边车",得名于挂在摩托车旁边的那个边斗:自己不掌握方向,专门载人载物,跟主车共进退)。

sidecar 是怎么工作的?每个服务容器旁边,多跑一个一模一样部署的小容器——一个专职的网络秘书。从此这个服务所有进出的流量,一律先过秘书的手:要打电话?交给秘书去拨,重试、熔断、限流全由秘书按守则处理;有电话进来?也由秘书先接,登记核对无误再转给老板。业务程序从此一句治理代码都不用写——它甚至不知道秘书的存在,只管对着秘书的窗口说"帮我找库存楼"。

注意这个布局的巧思:秘书跟服务同机同生共死(一个 Pod 里的两个容器,§ 7.3 的托盘),但职责上完全站在"电话线"这一侧。上一节 K8s 讲"箱子只装程序和家当",这一节补上了下半句:治理的家当,装在旁边那只专门的箱子里——应用的归应用,规矩的归规矩,各装各的箱。物业想统一升级守则,只需要换秘书,一家公司的屋里一个手指头都不用动。

几百个门童加一个总部:数据面与控制面

一个服务配一名秘书,几百个服务就是几百名秘书。这几百名秘书加它们连成的那张"所有流量都路过"的网,就叫服务网格——"网"指的是秘书们织成的那层看不见的治理网。行业把这套体系切成上下两层来讲:

好比连锁安保公司:总部定手册(控制面),各门店保安照手册执勤(数据面)。改规矩只改手册,一次下发全城生效;想了解全园区情况,不用挨家问,翻总部的台账就行。这个二分法请务必记牢——"定规矩的"和"干活的"分开,是整个云原生世界的通用骨架:K8s 如此(调度脑与执行节点),网格也如此。顺带认一个高频黑话:文章里常说 Istio 是"控制面"、Envoy 是"数据面",现在你知道这说的就是"总部"和"门童"。

法宝一:灰度发布,先给熟客试新菜

秘书体系建起来之后,能干的事一件件数。第一件是让"发新版"从赌命变成 Routine。过去的发布像新菜直接全店上桌:万一菜有问题,全店客人同时遭殃。有了网格,守则只需一句话:"新版先接 5% 的客流,其余 95% 还走老版。"——这就是灰度发布,行话也叫金丝雀发布(名字来自矿工带金丝雀下井探毒气:小鸟没事,人才敢下去)。

流程走下来是这样的:新版上线后先接一小撮真实客人;物业台账上盯着这 5% 的出错率和速度,指标健康就放大到 30%、再放 100%;一旦发现不对劲,守则一条命令收回——新版瞬间被摘出队伍,全部客人回落到老版,前后不过几秒钟。发布从"全或无"的一锤子买卖,变成了随时可进可退的散步。这背后依赖的还是 § 7.3 的底座:新版本本来就是一批新箱子,总机(Service)和门童(网格)联手让"换箱"对客人完全隐形。

法宝二:熔断与重试,保险丝和再投一次

第二件法宝管的是"内巷里某家店出事"。假设库存楼连续超时,健康状态恶化——按守则,门童们会集体收到通知:"库存楼这路电话暂时别打了。"于是订单楼的秘书不再徒劳地一遍遍拨号,而是立刻按预案走:查缓存、给个"稍后再试"、或转去备选路径。给故障线路"先断掉、缓一缓、过段时间再探探"的机制,就叫熔断——名字来自保险丝:电路出事时先跳闸断电,宁可暂时没电,也不让故障烧穿全屋。

熔断的对面是重试:偶尔一次占线,不必上纲上线,等半秒再拨一次多半就通了。听起来简单,实际上全网格统一执行才安全——好比园区里如果家家都自作主张"不通就重拨十次",一个突发抖动会被放大成十倍话务量,本来只是打喷嚏,最后演变成全园区重感冒。重试和熔断必须由同一层统一拿捏分寸:什么时候值得再试、什么时候必须断腕,几百个秘书执行同一份守则,才能既救得活单点、又不放大灾难。

法宝三:内巷里的暗号(mTLS)与排队闸机(限流)

第三件法宝是安全。想想内巷的现状:几百家互相串门,可"串门的人"到底是不是真邻居,从来没人查过——内网默认"进了大院的都是自己人"。可万一有只箱子被人做手脚攻陷了呢?它就可以冒充任何邻居在巷子里横行。网格的办法是把第 8 章要讲的 TLS 加密用到了内巷:门童之间打电话,先互相亮证件对暗号,确认"你确实是库存楼的门童",然后整段通话全程密语——外人就算在巷子里架了窃听器,听到的也全是乱码。这套"双向验明正身 + 全程加密"就叫 mTLS好比机场的安检口:先验你的证件(对方是谁),再查你的登机牌(有没有资格走这条航线),全程还有隔离通道防偷窥——两道手续,一道都不能省。

最妙的是实现方式:暗号和密语的全部复杂逻辑都在门童之间完成,公司的业务代码一行都不用改——老板们甚至不知道自己的电话已经是密语的了。这是"规矩归门童"红利最漂亮的一次兑现:安全这件最专业、最繁琐的事,被整层外包,业务浑然不觉。第 8 章讲加密原理时会再回到这里,到时候你会认出:这就是 HTTPS 那套握手,搬进了机房内巷。

第四件顺手的事是限流:某家服务今天只接得住每秒一千个请求?门童在门口摆闸机,超出的礼貌排队或劝退,绝不放进屋压垮主人。促销秒杀时的"排队等候"页面,背后就是这道闸机在尽职——好比景区索道:一次只上多少人不是刁难游客,而是索道真会断。

谁慢了:给每个请求挂追踪单

前面几件法宝管"救火",这件管"破案"。内巷里一次付款要在十几个服务间接力,一旦整条链慢下来,老板们的第一反应必然是互相甩锅:订单说"我是被库存拖的",库存说"我是被数据库拖的",数据库说"我这边一切正常"。没有统一台账,这种案子永远破不了。

网格的解法是给每个进门请求发一张追踪单:请求每转手一家,门童就在单子上盖一个章——几点进的门、几点出的门、转手给了谁。一次付款跑完,单子上十几枚时间章连成完整轨迹,谁家停留最久一目了然。这就是链路追踪,它跟门童们自动上报的流量统计合在一起,构成行业黑话里的可观测性——不用等出了事挨家敲门问话,翻开物业台账,整个园区的健康状态一屏看尽。而这些数据同样一张都不用业务代码自己埋点:章是门童盖的,账是门童记的,老板只管查。

看一场两分钟的"破案",感受台账的威力。某天下午三点,客服收到反馈:"付款要转圈七八秒。"在没有台账的年代,这个案子要成立专案组:订单团队查自己、库存团队查自己、数据库管理员查自己,人人自证清白,三天后靠"逐渐排除"才水落石出。而有了台账,值班工程师打开追踪面板,按"付款链路、耗时排序"一拉——头名的追踪单上明明白白:请求在"风控服务"这一站停留了六秒半,前后各站的章都快得正常。再看风控那一格的备注:它调用的外部征信接口当天变慢。案子破了,用时两分钟,元凶根本不在内巷,在园区外。这就是可观测性真正的含义:不是"出事之后能查",而是"把一片混沌的内巷,变成一屏看得懂的画面"——查监控破案的交警,和靠挨家走访的老刑警,破案效率差着一个时代。

分清两位管家:总机管找得到,门童管管得好

学到这,一个高频混淆必须当场拆掉:上一节的 K8s Service 和这一节的服务网格,是不是功能重叠的竞争者?不是,它俩是管家班子里的两任分工:

对比项K8s Service(总机)服务网格(门童体系)
回答的问题"怎么找到对方"——名字到地址"怎么管好来往"——重试、熔断、加密、灰度
工作的位置站在服务门外的虚拟总机蹲在每个服务身边的贴身秘书
懂不懂内容只认地址和端口,拨了就转看得懂每通电话的状态与成败
谁装的就归谁K8s 自带,开箱即有后装的整套物业体系

说白了,总机解决的是"人换工号换、名片不换"(§ 7.3 的地址危机),门童解决的是"电话打过去之后的一切善后"。真实系统里两者同时在场、逐层接力:前端找"订单"先问总机,电话接通后,重试和密语才是门童的事。一层管寻址,一层管治理——又是那句话:每一层稳定的东西,替下面易变的东西挡住一摊事。

你其实天天见它:手机里的四个网格现场

概念讲完,说件好玩的事:这套听着遥远的体系,你的手机每天都要路过好几次。不信?对照下面四个现场:

从今天起你可以换个眼光刷手机:凡是"有人有我没有""排队中""稍后再试""部分用户"这四个短语出现的地方,背后几乎都站着同一套流量治理思想。技术名词换了无数个马甲,套路口诀永远那几条——这正是科普的意义:看穿马甲,直抵套路。

网格不是万灵药:它的账单

把话说全:这套物业体系不是免费的。第一笔账是延迟——每通电话多过一道门童的手,单次开销虽小(毫秒级),内巷里几十次接力加起来就不是零。第二笔账是复杂度——几百名门童本身也是要人养的:升级、排障、守则管理,平台团队凭空多出一摊专业活。第三笔账是门槛——网格的配置体系出了名的陡,业界自嘲"没有三个专职工程师别碰 Istio"。好比请物业:小区两栋楼,物业费比水电费还贵,纯属自找;园区几百家公司,请物业才是救命。

所以行内的共识很冷静:服务网格是"规模到了才对"的答案——服务数不过一二十个、团队不过一两个时,K8s 自带的总机加几条简单规矩完全够用;服务上了三位数、跨好几个团队、发布一天几十次,网格才开始回本。顺带一提,社区也一直在给这套体系"减重":新一代的方案(如 Istio 的无感模式)试着把门童从每家门口收编成"每条巷口一个",进一步摊薄那笔延迟账——方向始终没变:让治理更便宜,让业务更省心。

常见误区:三条最容易想岔的地方

Analogy · 一座配了物业的产业园区:把本节所有概念装进一个画面

如果你只记住这一节的一个画面,请记住这座园区:几百家公司在这里做生意,园区外的人从来看不见任何一家公司的老板。

① 曾经,一千个老板各管各的对外事务。电话礼仪五花八门、暗号天天对错、总部想统一规矩要挨家劝一年——这就是每个服务自带治理代码的旧时代。

② 后来,物业给每家公司派驻一名统一培训的门童(sidecar)。所有电话、访客、单据先过门童的手:老板们一句规矩都不用记,屋里一行治理代码都不用写。

③ 门童是标准款(Envoy),守则是总部发的(控制面 Istio)。改守则只改总部手册,一次下发、全园区生效——换守则不动公司一块砖。

④ 守则五条铁律:新菜先给熟客试(灰度)、保险丝该跳就跳(熔断)、占线重拨听统一的(重试)、进门先对暗号说密语(mTLS)、高峰排队进店(限流)。

⑤ 每个请求进门先领追踪单,转一家盖一章(链路追踪)。出了事不用挨家甩锅,台账翻到哪一页,哪一家的停留最久一目了然。

⑥ 而园区大门口的总机(K8s Service)照旧上班。总机管"找到哪家公司",门童管"电话接通之后的一切"——一栋楼两位管家,寻址归总机,善后归物业。

这座园区记住了,本节所有名词就都各就各位了:分家是微服务、门童是 sidecar、标准款是 Envoy、总部是 Istio、五条守则加一本台账,就是服务网格的全部家当。

一句话送给你:服务网格的三个心法

这一节的零件同样不少,值得带走的是三句话。第一,治理是门童的事,不是老板的事——重试、熔断、加密、追踪,凡属"电话的善后",都该沉到 sidecar 这一层统一办理,业务代码里多写一行都是未来的债。第二,定规矩的和干活的必须分开——控制面发手册、数据面照章执勤,改守则不动一砖一瓦;这个骨架 K8s 在用、网格在用,你以后在任何云原生系统里都会再遇见它。第三,规模不到,别请物业——两栋楼的小区养不起物业,三位数服务的园区离不开物业;好比打车软件的调度算法,对单个乘客毫无意义,对一城车队才是命脉。工具永远跟着规模走——这句话从第 5 章的路由器说到第 7 章的网格,从来没失效过。

Recap · 收束

一句话总结:服务网格是给几百个互相串门的微服务配的一整套物业体系——每个服务身边蹲一名门童,所有流量先过门童的手,治理从此从业务代码里彻底搬家

机制上记住五件事
· 病根在电话:微服务把"喊一嗓子"变成"打几十个电话",占线、空号、拖延会在内巷里传导成片。
· 解法是 sidecar:治理逻辑搬进服务身边的专职容器——应用零改动,规矩随便换。
· 骨架是两层:控制面(总部)发守则,数据面(门童)干实事——定规矩和干活分开,是云原生的通用骨架。
· 看家五法宝:灰度先放 5%、熔断先跳闸、重试听统一的、mTLS 内巷对暗号、限流门口摆闸机——外加人手一张追踪单。
· 总机与门童不抢活:K8s Service 管"找得到",网格管"管得好",两层接力,各挡一摊。

下一步:从 CDN 到 VPC 到容器再到网格,我们一路在"机房这边"越挖越深。可第 7 章的标题里还有半个词没兑现——边缘。如果把"机房"这个概念本身也拆掉,让代码不再住在集中的机房、而是散布到离每个用户十毫秒的千百个角落,会是什么景象?这就是 § 7.5 的主角:Serverless 与边缘计算

☰ 主页
Xue Hai Wu Ya · Network · § 7.4 · 服务网格