这篇文章的作者把微服务到ServiceMesh的演进融入了三国的故事,非常有意思。故事比较长,请慢慢看,精彩的部分在后面。据说,曹操官渡之战大获全胜,招揽了大量袁绍的兵马,有的搞Python,有的搞JS,有的搞Ruby,有的搞C++,还有的从事PHP等。一支号称百万大军的浩浩??荡荡的大军正在向东进攻。刘备率领爪哇大军,哦不,其实不到一万人,边抵抗边东逃。刘备:“曹操大军逼近,怎么办?”诸葛亮:“大人您放心,我们可以投奔东吴。”刘备:“他们会反曹收留我们吗?”诸葛亮:“梁有他的打算,我慢慢说。”诸葛亮:“东吴世代熟知水战,创始人孙坚一直使用Go语言,他的儿子孙策承父旨,想出了Docker。现在孙策的弟弟孙权当权。我们可以劝他联合起来抗曹操。””刘备:“说便宜了,你先带赵云去东吴游说,等会儿带着大军赶到。01东吴诸葛亮来到东吴,说明来意。诸葛亮:“曹操率百万大军攻打东吴,时势危急,我主刘备欲助东吴抗曹。”张昭道:“大人,不可听信此人。曹操分明是要讨伐刘备,与我何干?”诸葛亮:“这话不对,我主刘备灭了,东吴离灭还远吗?”张昭:“你说是来帮助我们抗击曹操的,其实你自己的力量微弱,你被曹操打得落花流水,还怎么帮我们?”诸葛亮:“我师傅从小苦练Java,还有关羽章飞赵云等良将,最近在研究微服务的艺术,可以配合东吴Docker使用,发挥最大效用。”张昭:“乱七八糟的,我就是想借用我们的兵力。”看到两人在朝堂上吵得不可开交,孙权一阵头疼:“你先退一步,让我三思。”孙权回到房间,立即下诏让周瑜回来。02周瑜周瑜回见孙权:“主公,我都听到了,我也主张抗曹。”孙权:“哦?你确定吗?”周瑜:“我一直在训练码头水军,战力已经达到了最大,但是我想见见诸葛亮。”说完,周瑜就跑到了诸葛亮的住处。诸葛亮已经打扮好了起身等候。周瑜:“先生。诸葛,我很感激你的好意,但你也知道,你的军队不足一万人,而我们的军队也不足五万人。曹操百万大军,你如何抵挡得住?”诸葛亮:“曹操百万大军,看似多,实则纸老虎。你想,曹军多半是招了别的势力,比较乱,比如Python、JS、PHP、Ruby、C++,这些人凑在一起就不能互相配合,战斗力会大打折扣.周瑜见诸葛亮切中要害,知道此人不简单,决定继续试探。周瑜:“你有什么好计策?””周瑜听了,觉得有些意思,就拿笔在手心写了一个字,诸葛亮也在手心写了一个字。写完之后,二人二人相遇,同时张开手掌,只见写的是同一个字,“船”!周瑜:“我以为你会写火。诸葛亮哈哈大笑:“我还以为你也会写火呢。”你有没有看到英雄们的想法总是相似的,无论他们多么想要彼此不同。微服务讲了服务降级,限流,最后部署到Docker,制定了详细的作战方案。制定好方案后,两人进行了最后的模拟演练。在演习过程中,两人竟然产生了一种默契的感觉。天亮途中,周瑜离开了诸葛亮的住处。路上,他若有所思:“诸葛亮真是个天才,可惜我和他各有各的事,此人不可久留。”话分两句,曹操很担心。03曹营曹操:“我虽有百万大军,但大都是北方来的,东吴这里不水土不服,尤其是打水战,不像陆上打仗,那么稳固,怎么会有大把兵一到水就头晕,这怎么好?”谋士荀彧率先开口:“大人说的很对,依我看,我们的兵力太分散了,搞Python、PHP、Ruby、JS、C++的,就像大海中的五个孤岛。”,他们不能一起战斗。”曹操:“爱卿所言,正是我所忧。我扩张太快了,内部还没有调整好。恐怕战斗力会打折扣。你们有什么好计策?”谋士程昱说:“大人,听说过万能重写吗?”曹操:“什么意思?”程昱:“我们可以选择一种语言,比如PHP,并转换其他语言实现的系统完全用这种语言重写。这样大家就可以使用同一种语言,可以紧密合作。曹操:“要多久才能完成?”程宇:“大概需要两年时间。””曹操:“这样不好。士兵们的速度非常快。等了两年,刘备和孙权不知道会发展成什么样子。”这时,曹营忠的声音传来:“我自有打算,不必重写制度。”①庞统曹操四处张望,见一人坐下,面色十分难看,但神情自信。曹操:“哦?说吧!”庞统上前说道:“大人,您听说过RPC。?曹操:“RPC?可以互相打电话。曹操:“这么说你不用重写系统了?来,说详细点。””庞统:“比如用Ruby写的系统,把它能提供的服务封装了一个HTTP接口,用PHP写的系统只需要发起一个HTTP请求,就可以调用Ruby系统提供的服务。曹操:“嗯,我知道了,这个改造要多久?”庞统:“因为不需要重写,业务代码也不需要大改,只需要用HTTP封装一些服务,一周内就可以完成。””曹操一听,大喜:“好,照你的计划去做,你就可以实施了。”庞统带领曹操将士改造系统,让原本分离的五种不同的语言系统相互依存,全部连接在一起,完美地实现了曹操需要的所有功能。庞统暗自庆幸:“连环数已经完成,现在应该赶紧逃离曹营了吧。庞统想乘木筏过河,身后有人拍了拍他的肩膀:“你献上这个方案,就不怕丢了性命吗?”,竟然是许舒,提到嗓子眼,心又是松了口气:“哎呀,袁志哥哥,你这么吓人可不好,差点把我心脏病发作了。这个许舒是间接向刘备推荐诸葛亮,但他的母亲却被曹操控制,只好留在曹营,发誓终生不为曹操做贡献的研究,这里的复杂性在于单机程序望尘莫及。庞统:“哦?我想听听具体情况。”徐舒:“首先你要考虑被叫挂机怎么办,你要做限流降级方案,还要考虑负载调用的平衡问题,以及服务的自动注册和发现,必须有一个注册中心。现在你只是带领士兵实现功能,根本不考虑系统的稳定性和容灾,不是吗?这是把曹操推入火坑?”庞彤彤哈哈大笑:“不愧是远志哥,不过老大们只要实现功能就好了,容灾稳定谁管?”徐庶:“看来曹操的日子已经屈指可数了,你可以走了,就当没看见我吧。”庞统上了竹筏,向东吴进发。04大战打响,月黑风高,长江波涛拍打两岸,发出巨响。江岸两岸,曹操与周瑜隔江对峙。就在今晚,曹操让孙刘发起总攻,而周瑜已经做好了战斗准备。不远处,诸葛亮登上七星台,与周瑜呼应,相互配合。”曹操下令:“全军出动。百万大军驾驶着一艘战舰向着周瑜驶去。周瑜只有十几艘小船。和那艘战舰比起来,他简直就是蝼蚁和大象。曹操的巨舰向周瑜发起猛攻。可那周瑜却不慌不忙,吩咐将士们硬着头皮顶着火力。另一方面,他暗中观察着曹操巨舰的火力分布。他正在寻找系统的弱点。突然,他发现曹操的战舰在东北45度角的火力有点慢,不像其他战舰。地方好凶,一发火的射速比其他地方慢了50ms。是的,就连这稍纵即逝的50ms也瞒不过天才州长周瑜,他一声令下:“专注。”因为周瑜的系统是基于微服务设计的,每个微服务都可以独立伸缩和扩展。并且系统是用Docker部署的。周瑜大军只需要关闭其他系统的Docker容器,然后开始攻击即可。码头工人容器。两条命令,整个过程不超过半分钟。05逆转后半分钟,周瑜大军完成集火行动。曹操战舰的45度东北方向火力模块突然遭遇巨大的火力流,瞬间死亡。这不要紧,关键是系统的其他模块都依赖这个45度东北火力模块。结果,许多模块无法正常工作。整艘战舰只有那么点还能输出,其他火力全是哑巴。东北四十五度地区是用Python写的,负责人是曹军大将张辽。张辽见模块挂了,连忙命令道:“重启!重启这个模块!”但是重启之后,这个模块还是抵挡不住周瑜全军的火力,又挂了。张辽:“不行,必须扩容,西北四十五度区域的夏侯惇没有火力,赶紧把十台机器部署在那里扩容。”西北45度区是用NodeJS写的,团长夏侯惇接到张辽张辽立即派出十台机器给张辽。但是要在这十台新机器上部署Python模块并不容易。张辽的人马都上了,都是手动部署,安装Python环境,设置环境变量,拷贝代码,设置配置文件。这套程序需要十分钟。通过。结果刚要启动的时候报错,Python依赖的一个系统库和之前NodeJS使用的一个系统库冲突了。这下张辽真的慌了:“重装,快重装系统!”嗯,整艘战舰上的人都在这里等着张辽重装系统,然后安装Python环境,设置环境变量,复制代码,设置配置文件。06曹操曹操觉得胜利在握,于是在战舰的操纵室里边喝酒边绣十字绣。差不多一个时辰了,十字绣绣了一半,还没有胜利的消息,他就问身边的人:“周瑜怎么还没被杀?”别慌,我们系统的一个小模块出了问题,应该没有问题的。”曹操:“我的系统有大大小小几十个模块,一个模块有什么问题?”他怎么知道自己的系统已经被庞统控制了?所有连接的,由于级联效应,一个模块挂掉,足以让整个系统80%不可用。07破草和张辽还在重装系统。周宇的火力已经通过45度东北火力模块命中了系统缓存层。被击穿,火力直达数据库,数据库瞬间死亡。张辽见势不妙,连忙爬到监控室找曹操,却发现曹操还在悠闲地喝着酒绣着十字绣。张辽叫道:“主公不要绣花,周瑜的火力已经到了,从后门逃走。”曹操起初还不相信,但眼看火光很快就烧到了监控室,只好率领将士们翻滚着爬出战舰,向着华融小道逃去。周瑜登上了曹操的战舰,却找不到曹操。将士们都做好了追击的准备,周瑜却淡定地说:“曹操先别追,你先去七星楼软禁诸葛亮。”来到七星台,只见戏台已经空无一人,诸葛亮早已离开东吴。赤壁之战,惊天逆转。微服务和Docker打败了曹军的重耦合战舰,曹操会就此放弃吗?08Replay曹操自从赤壁之战失利后,就一直低迷。情况。曹操有个习惯,每次战败都要面壁思索。打了这么一场大败仗,曹操考虑了一年。一年后的今天,曹操准备了PPT,想召集众将士一起回顾比赛。曹操:“一年一年,我没有发动战争,因为赤壁之战对我打击太大了。”士兵们沉默了。曹操:“郭奉孝若在,不让我过来!”郭奉孝本名郭嘉,曹操军中第零谋士。不幸的是,他身体不好,在赤壁之战前就去世了。众谋士闻言,皆是惭愧。曹操:“请问赤壁之战失败的根本原因是什么?”荀彧参赞先说道:“在我看来,这一切都怪庞统,他不考虑稳定性,搞了一系列的计划,要把我们的系统改得一塌糊涂。而且灾备情况导致一个模块挂了,整个系统挂断。”曹操:“庞统呢?”程昱:“庞统已经辞职了。”曹操对庞统恨得牙痒痒,技术渣,上来在系统里胡乱写点垃圾代码,系统烂了就走人。但回过头来看,我也同意让庞统先做改造,我也有不可推卸的责任。曹操:“还有别的原因吗?”张辽将军也说:“缩容和扩容我们的系统很麻烦,得手动重装系统,再安装环境。”曹操:“其他人不也是这样吗?”荀彧:“不是,听说周瑜用的是Docker,系统的收缩和扩展,半分钟就完成了。他被纵火吊死了。曹操一听还有这场仗,开始后悔自己不应该盲目自信,坐在监控室里喝酒,把绣到一半的十字绣扔进了垃圾桶:“以后再也不绣了。””曹操:“这一年我一直在反思,庞统提出要把系统改成分布式系统,用RPC互相调用,平衡,限流降级,服务发现等等导致这次大败.我也有个疑问,为什么孙刘的容灾做的这么好!这时,旁边的人大喜:“时机到了!”他站起来:“这主要是因为刘备用的是Java,有很多‘限流降级’,‘服务发现’系统可以直接用。比如大名鼎鼎的Hystrix。09司马懿站起来,这不是别人比起曹营的第一谋士,与郭嘉齐名的司马懿。在Java语言中,并与微服务密切相关。”司马懿边说边展示了一张图:曹操顿时明白了:“这些微服务所依赖的库其实是和服务本身深度绑定的,而我们有五种语言,每一种都实现一次。不仅需要两三年时间,而且是巨大的重复和浪费!”司马懿说:“这些能力确实是每个服务都需要的,但并不是每个语言都必须实现这些能力。”曹操和大臣们不解。司马懿开始展开谋略:“我们需要思想上的升级。想一想,这些微服务系统所需要的特性其实都是公开的。为什么不能在底层平台实现这些公共特性呢?什么?想一想,我们调用HTTP不需要了解TCP的细节,但是里面有流量控制,重传失败。荀彧恍然大悟:“软件业的一切问题,只要加一个中间层就可以解决!”曹操看了荀彧一眼,这总结的台词一般都是我写的。不过,曹操心计重重:“能不能修改网络协议栈,加一层来实现限流降级和服务发现这些功能?”它不直接连接到其他服务,而是将所有流量定向到一个小型代理,该代理实现了所需的功能。这个代理是通用的,所以我们可以用各种语言编写微服务。”注:这个代理叫Sidecar,也就是sidecar,摩托车旁边的座位10ServiceMesh司马懿:“我们的微服务可以用这个模式,这样形成一个网格,就是ServiceMesh。”司马懿:请看上图,浅蓝色部分代表我们目前各个语言的业务模块,灰色部分代表代理(Sidecar)。可以看到业务模块只和自己的代理通信,彼此之间真正通信的是一个代理。程宇:“哦,我知道了,这是一种方式。那么ServiceMesh要多久才能落地?”司马懿:“不用自己发明轮子,已经有一些现成的解决方案,比如Istio。”听大喜道:“好,我就按照你说的进行改造,不过这次改造完成后,我们会进行严格的灾难测试。”司马懿把代码回滚到庞统来之前,然后对系统进行了改造,把系统放在了K8S之上。实践中使用了Istio,整个系统改造用了不到半年的时间。11测试系统改造完成后,曹操安排张辽对系统进行灾难测试,主要是挂掉一些模块。而搭载ServiceMesh+K8S的系统完全有能力抵御这种级别的灾难。曹操看到试验结果,大喜过望,在铜雀台设宴招待众将。曹操:“来,叫甄姬给大家跳舞。”众将士都沉浸在甄姬美妙的舞蹈中,而曹操却已经在思索如何杀死孙刘了。参考文章:https://philcalcado.com/2017/08/03/pattern_service_mesh.html
