10 月,开发者不可错过的开源大数据大会-2021 WeDataSphere 社区大会深圳站 了解详情
写点什么

向 5 岁小朋友解释什么是微服务

2020 年 1 月 06 日

向5岁小朋友解释什么是微服务

作为一名开发者,你肯定经常听到像“我们采用了可伸缩的微服务架构”、“我们正在计划切换到微服务架构”之类的话,然后你寻思着:微服务到底是什么?不用担心,这篇文章将通过真实世界的比喻来解释什么是微服务架构。但请注意,这篇文章只讲跟微服务架构有关的东西,没有代码!


大冰激凌机——单体

我们暂且把微服务搁在一边,先来看看冰激凌机。冰激凌机由四个部件组成——冰淇淋勺、坚果粉碎器、巧克力漏斗和草莓糖漏斗。冰淇淋勺往杯子里添加香草或芒果冰激凌,坚果粉碎器将碎坚果撒在冰激凌上,巧克力或草莓漏斗把液体糖浆倒在冰激凌上。对于顾客来说,除了冰激凌勺之外,其他都是可选的。



大冰激凌机——单体应用程序


假设你是冰激凌店的老板,一开始你有一台小冰激凌机,这个冰激凌机配备了所有上述的四个部件。顾客很喜欢你家的冰激凌,你的生意越来越红火。那么接下来你会怎么做?你会买一台更大的冰激凌机,这样就可以在同样的时间内做出更多的冰激凌。按照这样的节奏发展下去,终有一天你会没办法再扩大规模,因为工厂生产不出更大的冰激凌机了。



没有再大的冰激凌机了——达到了伸缩的极限


在软件开发领域,这个就是所谓的单体架构。一个包含了所有组件的应用程序,代码都存放在一个代码基库里。随着需求的增长,你租用了越来越大的机器,但到了某个时刻肯定会达到极限,因为你租不到比目前更大的机器了。


购买更多的冰激凌机

你一定会想到通过购买更多的冰激凌机来解决这个问题。没错!你放弃了购买更大的冰激凌机的想法,而是购买更多小型的冰激凌机。


这就是所谓的“克隆”,你使用多个应用程序实例来处理用户请求。


因为上天的眷顾,也因为你自己的努力,顾客开始对你家的冰激凌爱不释手了。为了满足他们的需求,你最终不得不把所有的冰激凌机都升级到更强大的型号。



多个单体应用实例——克隆


修理坏掉的机器

在刚开店的时候,你只聘请了一名负责维修和升级机器的师傅,这没有问题。但在购买了多台机器之后,你觉得有必要聘请更多的师傅,因为你不希望有机器坏了影响生意。


现在,有顾客希望你家的店能够增加不同口味的冰激凌。你决定在冰激凌勺里增加巧克力冰激凌。但因为冰激凌机的四个部件相互依赖,维修师傅忙得团团转。等他们好不容易加好了新口味的冰激凌,草莓糖漏斗却坏了,因为部件之间相互依赖,动了其中一个就会影响到其他部件。



一次更新影响到了其他部件——黄色表示巧克力冰激凌勺


每台机器各司其职——微服务

因为伸缩性受到了限制,你决定搭建新的基础设施。你要求工厂把原先冰激凌机的每个部件独立成单独的机器——一个冰激凌勺机,一个坚果粉碎机,两个漏斗机(一个可以流出巧克力,一个可以流出草莓糖)。现在,你把维修师傅分成几组,每一组负责不同的机器。



把大冰激凌机拆分成独立的机器,把维修师傅分组——微服务


这就是所谓的微服务架构,大单体被拆分成多个独立的模块,每个模块都是一个应用程序,负责处理不同的任务。


单体与微服务

  • 伸缩性:你可能已经注意到了,在购买了最大型的冰激凌之后,你就没办法再扩大规模了。但有了单独的部件机器(微服务)之后,你可以购买更多的部件机器。

  • 可维护性:为了给冰激凌机增加新口味的冰激凌,却不小心弄坏了草莓糖漏斗,因为一个大单体系统的不同部分通常是相互依赖的。举个例子,一个应用程序的某个模块需要修改数据库结构,而这样做可能会影响到应用程序的其他功能。不过,在微服务架构里,不同的机器由不同的团队负责,每个团队管好自己管控的机器,避免了冲突。这种独立的开发模式也加快了发版的速度,因为在一个大型的组织里,团队内的沟通比团队间的沟通效率更高。

  • 成本:你可能会想,多买几台大冰激凌机不就能解决伸缩性问题吗?但也请试想一下,如果你只想增加冰激凌口味并保持其他部分不变,但你却不得不为此购买整套机器。但在微服务机构中,你可以只买冰激凌勺机。这样就节约了很多成本,因为你可以根据每个服务的请求量来增加或者减少单个服务的实例数量。

  • 就绪时间:大冰激凌机已经把所有的部件都集成好了,只要把它放在正确的地方启动它就可以了。但是,独立的部件机器在使用之前需要使用传送带把它们连接在一起。因此,微服务需要更多的时间和专业知识才能让它运行起来。

  • 测试和部署:大冰激凌机的测试和部署相对困难,因为所有的部件相互依赖,需要每个部件都集成好了才能测试和部署。但对于部件机器来说,因为每种机器都是独立的,所以测试和部署也相对容易。


该不该从一开始就采用微服务?

简单地说就是——不需要!大多数专家建议,如果你不需要微服务架构,就不要用它。你完全可以一直使用大冰激凌机,直到无法维护和伸缩。到了那个时候,你可以把大单体机器拆分成单独的微服务部件机器。


微服务并不都是“微型”的

你可能会想,到了冰激凌机都变成单独的部件机器之后,这些部件机器应该都很小。但事实上并非如此!微服务本身也可以很大,或者单个服务可以有多个同时运行的实例来处理用户请求。例如,你可能会有 20 台冰激凌勺机,因为大部分顾客可能只需要冰激凌,不需要浇头。


同样的,微服务也可以作为独立的应用程序,它们不一定是“微型”的,而且需要大量的维护和伸缩成本。


结论

一些正在采用微服务架构的大型软件公司最早都是从一个大单体开始的。他们在达到了伸缩性和可维护性极限之后才将单体拆分成单独的组件或服务。


毫无疑问,在采用微服务架构时,你可以使用不同的技术来开发不同的服务,具备了更好的伸缩性和可维护性,但这是以复杂性为代价的。因此,刚开始可以采用设计良好的单体,而不是一上来就直接奔着微服务去,避免让自己置身于微服务的复杂性泥潭之中。


原文链接

Beginner’s Guide to Microservices: Explaining it to a 5 Year Old


2020 年 1 月 06 日 14:005056
用户头像
小智 前 InfoQ 主编

发布了 404 篇内容, 共 330.3 次阅读, 收获喜欢 1810 次。

关注

评论 3 条评论

发布
用户头像
可维护性就不成立,每个服务都是可以独立运行的,你单体的一挂就是整服务挂不能运转,多个服务不会造成你冰淇淋店不能营业,哥哥你这个标题确实有点过了,有些业务比较复杂的项目拆多服务也是有必要会比较清晰,团队之间的配合工作协调等也是有必要的。但是具体怎么拆分还是根据实际情况
2020 年 01 月 08 日 08:54
回复
用户头像
你这些傻逼码农,人家把你当五岁小孩子的智商来忽悠,你还感觉写得不错,最TMD烦这种标题,从如何给你女朋友解释什么是XXX,到如何给一只大猩猩解释什么是XXX,看到这种标题就想吐,真以为自己叼得上天,看透一切的,我看你是闲得蛋疼,技术永远没有捷径,想不懂脑子,想不深度参与就想知道什么是XXX...
2020 年 01 月 07 日 10:04
回复
用户头像
清晰易懂,配图很赞
2020 年 01 月 06 日 17:53
回复
没有更多了
发现更多内容

34岁安卓开发大叔感慨,帮你突破瓶颈

欢喜学安卓

android 程序员 面试 移动开发

TcaplusDB华东客户Hands-on活动|10分钟玩转腾讯游戏核心数据库

数据人er

数据库 nosql tencentdb TcaplusDB

chia奇亚算力挖矿分发APP系统开发

薇電13242772558

区块链

Redis套路,一网打尽

Coder的技术之路

redis 缓存 面试

详解Apache Dubbo的SPI实现机制

vivo互联网技术

dubbo 服务器 spi

项目管理100问 | 为什么你的项目进度总是在延期?

万事ONES

项目管理 项目排期 ONES 项目开发

并发王者课-铂金4:令行禁止-为何说信号量是线程间的同步利器

技术八点半

Java 多线程 并发

从工单到需求管理,企业如何快速响应客户反馈?

万事ONES

项目管理 需求管理 需求 ONES

一篇文章告诉你 GIS 存储如何选?

焱融科技

技术 分布式 云原生 高性能 容器存储

做项目管理,如何对复杂的项目工作进行分解

万事ONES

需求管理 ONES 项目管理工具

曝光一个网站,我周末就耗在上面了。

why技术

Java Arthas

Mysql是如何选择主键的

架构精进之路

MySQL 6月日更 主键

年份白酒推荐 商务聚会我选唐庄五星酒

Geek_50a546

云算力挖矿系统APP模式开发方案

百度一款前端图片合成工具库MI开源啦!

百度开发者中心

百度 开源 图片

[译] R8 优化: 字符串操作

Antway

6月日更

我试了试用 SQL查 Linux日志,好用到飞起

程序员内点事

Java Linux 日志

智能边缘时代 英特尔携手极视角赋能开发者 助推AIoT发展

新闻科技资讯

并发王者课-铂金3:一劳永逸-如何理解锁的多次可重入问题

技术八点半

Java 多线程 并发

英特尔谢晓清:开源是软件发展趋势

新闻科技资讯

联邦学习这件小事(二)

趣链科技

区块链 隐私保护 加密技术 联邦计算

34岁Android开发大叔感慨,已拿offer附真题解析

欢喜学安卓

android 程序员 面试 移动开发

Go语言实现的23种设计模式之结构型模式

华为云开发者社区

Go 设计模式 组合模式 结构型模式 适配器模式

敏捷 vs 瀑布

星际行者

敏捷开发

react源码解析16.concurrent模式

全栈潇晨

react.js

618大促又来了?3天2次大事故,不堪回首的加班经历……

数列科技

压力测试 全链路压测 大促 系统高可用 生产环境全链路压测

JAVA面向对象(八)--封装

加百利

Java 后端 6月日更

掌握鸿蒙轻内核静态内存的使用,从源码分析开始

华为云开发者社区

鸿蒙 操作系统 内存 静态内存 鸿蒙轻内核

8种图数据库对 NULL 属性值支持情况

华为云开发者社区

图数据库 null 逻辑 语义网 图模型

索信达控股:解析索信达模型管理利器

索信达控股

模型 风险管理 智能 人工智能大数据 数据管理平台

ZGC 新特性

meacial

Java ZGC JVM 软件开发

向5岁小朋友解释什么是微服务-InfoQ