程序员如何通俗易懂的给老婆解释什么是微服务?

程序员有了老婆之后就是累,上次好不容易给她解释了什么是Restful,这不,麻烦又来了…

一个周日的清晨,阳光洒在我的脸上,慢慢把我唤醒。我翻过身,感觉好像少了些什么东西,缓缓地睁开眼睛,“咦,老婆呢?”

突然,我发现床上多了张纸条:

看到这封信时,我已经在回娘家的路上,原因我相信你懂的。如果你不懂,请将信翻到背面。

我一脸懵逼,将纸翻了过来:

哼,你怎么可能不知道原因,你翻过来看就是想确认我发现的是不是你那个秘密而已,那我就告诉你吧。

在你的书桌上,有一本叫 《微服务设计》 的书,我虽然是女生,但也知道“服务”是个什么勾当,没想到你放着好好的程序员不做,居然做起了“服务”,你和旧时代的老鸨有什么区别?

书我翻了一下,想看看你的这种“微服务”是怎么个“微”法,哼,你们程序员挺精明的,看的书都加密过的?别以为我不知道那些是代码,是你们程序员的通用语言。鬼知道里面讲了什么东西。

不管怎样,既然你选择了这条路,也就别怪我不仁不义,再见。不,再也不见。 —— 对你很失望的静香

我渐渐地缓过神来,百感交集,思绪万千,冥想了一会,拿起手机,给她发了信息:

“下午四点,老地方,给你解释什么是微服务。”

沃尔兹百货超市

我提前十五分钟来到了咖啡厅。临近四点,我开始望着门口,59分49秒,一个熟悉的身影走了进来,戴着墨镜,披着纱巾,是她。

“服务员,一个芝士蛋糕,两杯拿铁,谢谢”,我对服务员说。

“说吧,你有什么要解释的?”

“嗯,首先,我向你保证,我在看的“微服务”,绝对不是你想的那种“服务””

“那是什么?”

“这个解释起来要花点时间,我们先吃点蛋糕,待会再慢慢和你解释”

过了一会,蛋糕吃的差不多了。“看到对面那家沃尔兹百货超市了么?”,我指着窗外面的沃尔兹超市,对老婆说。

我渐渐地缓过神来,百感交集,思绪万千,冥想了一会,拿起手机,给她发了信息:

“下午四点,老地方,给你解释什么是微服务。”

沃尔兹百货超市

我提前十五分钟来到了咖啡厅。临近四点,我开始望着门口,59分49秒,一个熟悉的身影走了进来,戴着墨镜,披着纱巾,是她。

“服务员,一个芝士蛋糕,两杯拿铁,谢谢”,我对服务员说。

“说吧,你有什么要解释的?”

“嗯,首先,我向你保证,我在看的“微服务”,绝对不是你想的那种“服务””

“那是什么?”

“这个解释起来要花点时间,我们先吃点蛋糕,待会再慢慢和你解释”

过了一会,蛋糕吃的差不多了。“看到对面那家沃尔兹百货超市了么?”,我指着窗外面的沃尔兹超市,对老婆说。

“嗯?”

“那里面什么都有,衣服、食品、文具、家私、电器,应有尽有,而且不管你去到哪一家连锁店,店里的格局都是一模一样的。也正因为如此,这才带来了问题。”

“有什么问题呢?我觉得这样挺好呀,顾客去了那里,想买什么都找得着。”

“首先,这些卖不同物品的 隔间之间会互相影响 。你看,一楼是珠宝店和电器店,假如珠宝店想进行装修,装修时的噪声和灰尘,势必会影响到电器店;还有,假如由于电器店一名员工的疏忽,引发了火灾,旁边的珠宝店是不是也会受到牵连?”

“你这乌鸦嘴…”

“哈哈,都说是假如啦。除了这点,还有一个问题,我考考你,我们这个城市里有几家沃尔兹超市?”

“我想想,好像就这一家?”

“没错,只在西区这里开了一家店。这时候市场总监发现,住在东区的多是上层阶级,他们对珠宝的需求量比较大,这时候要怎么办?”

“那就在东区也开一家沃尔兹百货超市罗。”

“嗯,只能是这样了,可是东区的居民对其他东西的需求并不多,而沃尔兹超市又想让每家分店卖的东西都是一样的,所以他们不得不在东区开一家分店,不仅卖珠宝,也卖食品、衣服还有其他东西”

“这挺浪费的呀, 为了满足人们对珠宝的需求,又开了一个百货超市 。”,老婆若有所思。

“的确,什么都有、什么都卖的百货超市实在是太 笨重 了,这才有了「微服务」”

“哦?终于要讲微服务了?哼哼。”

沃尔兹小店

“你看,假如我们把沃尔兹百货超市, 拆成很多个卖不同商品的小店 ,比如卖珠宝的沃尔福、卖家私的沃尔家、卖食品的沃尔良还有卖衣服的沃尔衣,这些提供不同服务的店,分布在城市的各个地方,这样他们之间就不会互相影响了。东区二巷的沃尔家搞装修,三巷的沃尔福不会受到影响;三巷的沃尔福发生火灾了,二巷的沃尔家也安然无恙。”

“Soga,原来是这种微服务”,老婆笑着说。

“不仅如此,现在,我们发现东区的居民对珠宝的需求量大,那我们就在东区 多开几家沃尔福,而在西区,中产阶级较多的地方,我们就多开几家沃尔良。”

“哇塞,这样看来,微服务让沃尔兹变得 轻巧 了许多! 哪个地方对某种服务的需求大,就在对应的地方多开几家卖那种服务的小店就好了 。”

沃尔兹网店

“看来微服务就是把一个百货店变成各个小店嘛,讲这个东西至于用那么厚一本书么?”,老婆是个好奇心很强的女生。

“哈,微服务当然不只是这些,我们现在只是把一个百货店拆成各个小店,但是对于 如何管理这些小店 ,我们还没做好准备”

“哦?这里面还有什么门道?”

“当然,别忘了,沃尔兹可是有网店的。以前还是百货超市的时候,要是有顾客从网上买了一件衣服,那直接从百货超市的仓库里取出这件衣服,给顾客寄过去就好了;现在呢,每一家卖衣服的沃尔衣都有自己的仓库,顾客下单后, 工作人员要怎么知道顾客所在区域有哪几家沃尔衣?要从哪家沃尔衣发货呢? ”

“哟西,还有这个问题。那 沃尔兹总店肯定知道他们在哪个地方开有什么分店吧 ?”

“没错,这时候网店工作人员会从总店那里查出,顾客收货地址所在区域有哪些家沃尔衣,接下来就是从这些沃尔衣店里,选一家,给顾客寄快递过去。”

“就选离顾客最近那一家就好啦。”

“哈,那万一东区有两家沃尔衣,一家靠近居民区,一家靠近商业区,而顾客通常写的收获地址都是写自己家呢?”

“这样… 那靠近居民区的沃尔衣就会收到很多订单,经常要不断的进货,而靠近商业区的那家,就没什么订单了,是吧?”,老婆睁大双眼看着我。

“对!这就是问题,所以网店工作人员会对在一个区域内的沃尔衣,进行 轮流发货 的操作,比如这一次是靠近居民区的这家发货,那下一次,就让靠近商业区的沃尔衣发货。”

“Soga!”

“用计算机术语来说,就是 LoadBalancing ,负载均衡”

“呵呵,少扯这些术语,我只知道New Balance”

“哈哈,怎么样,微服务不是你想象的那样吧,当然,在经济学领域,要考虑的因素还有很多,现实生活中的沃尔兹依然是一个大百货超市,自然是有它的道理的。微服务的应用主要是在更为纯粹的计算机领域,也就是你看到的那些代码”

“得了,看到那些头就大,走,带我去娘家拿行李”

“……”

对程序员的话

用了大白话,给老婆讲明白了微服务的来龙去脉,当然,我还是有些话想说的,还是怕老婆听完一脸懵逼,没给她说:

1、讲微服务,就不得不从 单体应用 (Monolithic )讲起。

所谓单体应用,就像一开始的沃尔兹百货超市一样,把所有业务的代码都放在一起。这对于小型项目来说自然是很合适的,可是项目一旦大了起来,业务一多,这个单体也就 膨胀 了,膨胀后的单体应用主要有以下两个缺点:

牵一发而动全身 。我改了一个业务的一行代码,需要重启整个单体应用,这显然不不合理的。就像珠宝店装修时影响了旁边的电器店,电器店着火时殃及珠宝店一样。

只能水平扩展,不能纵向扩展 。对于单体应用,如果发现某一业务的请求量非常大,那么是无法单独扩展该业务的,只能拷贝整个单体应用,再部署一套环境,来实现集群。

正因为单体应用有着这些缺陷,才有了微服务。微服务和单体应用的区别,可以用Martin Fowler的这张图来解释:

2、微服务虽然带来了架构上的优势,但同时也引入了 复杂性 。我们不得使用一些组件,来解决技术复杂性提高之后带来的问题:

服务注册中心 :一个服务可以有多个 实例 ,那么我们在向一个服务发出请求的时候,怎么知道这个服务有哪些实例呢?为了减少手工维护的麻烦,我们需要服务注册中心。每个服务实例在启动时,向注册中心注册自己的IP地址等信息。这样,服务在调用别的服务的接口时,就可以通过注册中心,查询到其他服务的实例,向实例发起请求。沃尔兹总店就是起到注册中心的作用。

负载均衡 :由于一个服务可以有多个实例,所以不管是来自外部客户端的请求,还是微服务系统内部服务之间发起的请求,都需要引入负载均衡的机制,来发挥多实例集群的作用。有的书也称这两种负载均衡为 服务器端负载均衡 和 客户端负载均衡 ,各自具有代表性意义的实现分别是Nginx和Ribbon。

API Gateway :一个外部请求过来之后,我们需要知道这个请求是发给哪个服务的,也就是我们需要一个 请求路由 的功能,比如/cm/*的请求,要发给客户管理服务,/om/*的请求,要发给订单管理服务。另外,不是所有请求都可以被我们系统处理的,我们需要判断这个请求是否携带一些必要的鉴权信息,并对其进行鉴权,也就是 请求过滤 的功能。而API Gateway,就是起到了这两个功能,它就像 整个微服务系统的门面 ,所有请求,都要先经过它的处理,才会转发到对应的服务。

……

微服务系统的衍生组件还有很多,比如对各个服务进行的配置管理的分布式配置中心、各个服务之间进行消息通讯的消息总线和消息驱动机制(上图中的Message Queue)等,这里就不一一列举了。这篇文章只是想用一种比较有趣的方式,让大家对微服务有一个初步的了解。就像学设计模式,如果直接去看四人帮的《设计模式——可复用面向对象软件的基础》,也许很多人学到一半就学不下去了,而如果先去看《Head First设计模式》,再去看前面那本书,也许就会发现轻松很多。

大家如果想对微服务有进一步的理解,我这边推荐一个交流学习群:685167672  里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多:

对微服务的来源有更深入的了解,知道微服务这种设计模式,和Unix以及 康威定律 的关系;

看到微服务是如何影响软件开发的 组织结构 的,其实也就是康威定律;

看到Martin Fowler总结的设计微服务系统的几个原则;

架构这种东西,和设计模式非常相像,两者都是针对某一类问题的解决方案。和设计模式一样,每种架构都有其优点,当然也会有缺点。只有弄清楚为什么要用这种架构,不用会怎样,用了又会怎样,知其然知其所以然,才能对架构进行灵活运用,在实际项目中发挥架构的优势。

原文链接:https://blog.csdn.net/hang1995/article/details/80844483

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ThoughtWorks

TW洞见 | 运用系统思考,走上改善之路

今日洞见 文章作者来自ThoughtWorks:李剑。图片来自ThoughtWorks。 本文版权归【ThoughtWorks中国】(微信ID:思特沃克Thou...

3205
来自专栏腾讯数据中心

数据中心“能源”成本管理五招

要管好数据中心,必然需要理清纷繁复杂的成本问题。在数据中心的总开支中,“能源”(主要指电费、水费和柴油费用)为总支出的“中流砥柱”,其中又以电费为最主要开支。“...

3528
来自专栏星流全栈

2017,忘掉「全栈」,迎向「一栈」!

1377
来自专栏Netkiller

多维度架构

什么事多维度架构,看完下面故事你就明白了 我的的惨痛就医经历: 咳嗽,去看呼吸内科,先拍x光,医生开药头孢+止咳水什么的,诊断结果是支气管炎。我看了很久持续了几...

3457
来自专栏机器人网

牛人拆解特斯拉Model S电池,它到底强在哪里?

国外牛人直接给我们展示电池组。电池组安放前后轴之间的底盘位置,其重量可达900公斤。因此造成底盘重心较低,非常利于车辆的高速稳定性。电池组几乎占据车辆底盘的全部...

3107
来自专栏木东居士的专栏

Hadoop之父Doug Cutting在清华的讲座记录

1654
来自专栏企鹅号快讯

未来已来,跟上云时代的步伐吧!

我们今天实际上所面对的一切都是未来将发生的一切,我用了一个词叫未来已来。比如说我们今天讲非常多的云计算,实际生活中你可能看不到它,但是它已经在今天发生,其实是未...

3304
来自专栏腾讯移动品质中心TMQ的专栏

腾讯电量仪——智能硬件测试工具尝试之路

随着移动互联网的快速发展,智能手机对电量的消耗也变得越来越大,续航短板一直是用户吐槽的焦点,不管是iOS还是android,每天为手机充电成为一个惯例,甚至一天...

1998
来自专栏织云平台团队的专栏

凤凰涅槃,浴火重生

本文以一个故事的形式讲述了一个IT项目从即将“流产“、IT运维部门面临被拆分的囧境到逐步的通过一系列举措取得项目成功并实现业务价值的过程, 浅显易懂,结合自己曾...

1642
来自专栏Java技术

新的一年来自一个程序员的反思!

程序员大军鱼龙混杂,水平的高低无法简单的从一个功能完成情况来评定,同样一个需求,功能都可以完成,但是不同程序员完成质量会不一样,完成质量的好坏需要从多方面评定,...

552

扫码关注云+社区