前言:所谓"银弹",本意是用金属银做成的子弹;在古老的传说里它是杀死狼人的有效武器。在著作《人月神话》也有描述。微服务是当前软件界流行的名词,那么它能成为像银弹一样厉害的武器,解决软件开发过程中的难题吗?本文将围绕这个主题进行论述。一家之言,纯属个人感悟,仅此而已。

微服务是什么?

无论你使用Google或者Baidu,都无法找到一个准确的定义。事实上,在业界还是在学术界,也没有对微服务下个准确而权威的定义。微服务到底是什么?至今为此,我们仍然很迷惑,但是作为深陷其中的我们,不会因为它的神秘色彩,而放弃对它的探索,用一个流行的词来说,盘它!

微服务看上去像女神一样骄傲,神秘又高不可攀,可是我们可以通过一些基本面来了解它。首先看字面意思,微代表小,再加些形容词,价值小,小而精,小而细等等,但不要把它和小朋友的小联系起来。这里的"小"代表的是独立,自我完善,而且是浓缩的精华;再看"服务"二字,代表着你能获得的某种结果。连起来说,微服务就是低成本获取某种结果的东西。

举个例子来说,你入住酒店,需要凌晨4点有人叫你起床,早上4:20有人陪你晨跑,早上6:00有人陪你吃早餐,你可能还需要有人帮你叫车…不胜枚举。那么叫你起床,陪你跑步,帮你叫车,这些就可以叫做微服务;这些微服务组合起来,就构成了你作为一个进步青年早上的生活场景,它解决了你在早上这段时间所需要得到的辅助。只是在现实生活中这些服务都是由人提供的。

让我们把思维切换到软件的世界,在软件的世界里,微服务长什么样子呢?如果你现在要送一车货给销售商,那么你是否希望知道最近的仓库在哪里?最短的行车路线是什么?仓库是否有足够的储位等信息,甚至你还想知道最近的加油站在哪里?万一油不够了呢?同样的道理,查询仓库的位置,储位,获取最短的行车路线这些就是微服务,它们组合在一起,协助你漂亮的完成送货任务。不同的是,这些服务是由某个软件厂商提供给你使用的…

到此,微服务是什么?你明白了吗?

突然,一个入门不到一年的软件工程师对于以上的论述开始露出了鄙视的表情。但他是个很有礼貌的人,尽量压制自己的怒火之后,说到:对于你以上的论述我给60分吧,因为我没有发现如你所说的"微服务像女神一样骄傲,神秘而又高不可攀" ,她很普通呀,我随便写个送货系统,包括以上几个功能,对标你的服务,也是可以的啊?

我突然感到后背一股冷风,顿时让我清醒起来。确实!这是个非常好的质疑,暂且不论对错,我们继续,稍后来消除质疑。

微服务从哪里来?

再不上干货,那我离挨打只差0.1毫米了。那我们来说说微服务的诞生历史。为省篇幅,尽量简单说,如果要把每一段历史说清楚,那么请先泡壶茶,说它个三天三夜。

首先说单体应用(Monolithic App),它由一个或一组特定的功能合成的系统。为了更好的可维护性,通常我们会采用原始的分层架构模式,即用表示层,业务逻辑层,数据访问层进行分而治之。现在开始回想,这种架构模式下,当需求变化后,是否有牵一发动全身的切肤之痛,你是否体验过呢?

基于组件(Component-based)的架构模式,正是历经了牵一发动全身的切肤之痛后,软件开发者作为以睿智著称的代表们发誓,绝不能在同一条阴沟里掉两次。于是将层次拆分为模块,让模块独立为组件,在组件之间进行调用和通信。当需求变化后,只需要修改某一个模块,不会影响其它模块。干得漂亮!有没有?的确,这解决了需求变化带来的修改问题。但是需求总是变化的。新的需求,需要你的系统与其它的系统进行对接,或者和原有系统进行整合,别的系统需要你的系统暴露接口,就是通常说的服务。就像握手一样,当别人伸出手时,你却手插在裤兜里,这样很不礼貌,也完不成握手这件事情。

面向服务的体系架构( SOA ),为了系统与系统之间能够愉快的握手,需要各自暴露服务,于是SOA应运而生,典型的SOA产品就是企业服务总线。似乎到此历史说完了。系统之间功能打通了,数据共享了。还需要微服务吗?

当然,也不当然需要使用微服务。取决于系统面临的规模,如果无法预估系统的并发用户数量,突然涌入,或者高峰时段的用户规模数,事先无法确认需要准备多少数量的服务器等场景,那么你需要采用微服务架构。

先总结一下,到此我们是在说微服务的历史吗?可以明确的说,我没有说微服务的历史,我说的是架构演变的历史。我感觉离挨打只差0.01毫米了。回过头去看,SOA中也提到了服务,从业界或者学术界也没有对SOA中的服务下定义,从业界的实践来看,可以认为它是一种大颗粒的服务。这种大颗粒带来服务拆分的困难,比如前文提到的查询是否有足够的储位,而服务加载的却是整个仓库管理系统。为了避免这种大而全的服务,特意提出微服务的概念,除了强调小而精,还在于强调要告别依赖于动态链接库的时代,转向为依赖于服务的新风向。

随着微服务的提出,相应的也产生了新的名词,比如微服务架构,微服务框架等,持续集成,持续发布,持续运维,微服务治理,容器,微服务编排,等等词汇也被提到了新的高度;同时,在云计算如火如荼的当下,如何去使用云计算的海量计算资源,系统如何应对海量用户的突发访问而不宕机,是微服务架构诞生的起因。而微服务框架则是微服务架构模式下一种具体的服务提供方式。

到目前为止,可以回答那位工程师的质疑,我认为你说对了一半,单从提供功能来说,微服务能提供的,和传统方式没有区别。但是在应对海量计算资源,海量用户的场景下,微服务具有天然的优势。

那么回到本文的主题,微服务是银弹吗?值得注意的是,标题中提及的微服务并不是狭义的服务,而是涵盖前文提及的一系列相关的概念。

再说点干货

软件产品的本质是解决各种需求问题,使得产品能卖的出去,增加销售额。软件开发的本质是解决低成本制造产品的问题,降低损耗的费用。如何低成本制作产品,需要优秀的系统设计,优秀的系统设计需要高内聚,低耦合的思想。分享潘加宇老师总结的一个公式:

利润=需求-设计

简单来看要使得利润越高,那么需要需求越多,设计越少。但是很遗憾,需求越多,越需要优秀的设计,越需要高内聚低耦合的思想辅助。越优秀的设计越花时间和精力,这是内功的修炼。好比北京奥运的会徽,舞动的北京一样,多达几十个GB的样稿资料才最终设计而成。

微服务的设计对比舞动的北京也是有异曲同工之处。到此,微服务是否能成为银弹?不在于微服务本身,而在于以下三个必备条件:

首先,是人的维度,微服务需要优秀的人才,如优秀的产品经理,优秀的需求工程师,优秀的软件工程师,优秀的人机交互工程师,优秀的测试工程师,优秀的行业专家共同协作的结果。需要从传统的软件开发思维向敏捷软件开发思维转变。

第二,是团队的维度,当有优秀的人才聚集之后,相应的团队结构也是需要转变的。过往的团队组织形式是人以类聚,软件工程师们组成软件开发团队,测试工程师们组成测试团队。在新的形势下,需要更高效的沟通,更快速的迭代,更快速的纠错。那么团队的组织需要融合,不再由一种职能的人组成,而是将需求,设计,开发,测试,交付各种技能的人组织在一起合成一个团队。这好像特种部队的编制,一只特种部队,由爆破,狙击,医疗,火力支援,侦察,掩护,指挥等各种技能的人才组成的,才会具备强大的战斗力。

第三,是软件资产累积的维度,除了人的思维,团队组织的转变,还要一项特别重要资产,那就是公司多年发展积累下来的,各种成型的解决方案,软件代码中的各种公用库。传统软件依赖于各种动态链接库,现代软件需要依赖的是服务。换了一种形式,动态链接库的原始积累也是必不可少的选项。

因此,微服务能否成为银弹,需要从上面三个维度来评分,得分越低,越需要厉兵秣马,砥砺前行;得分高也不是一件骄傲的事情,微服务无止境。

微服务是"银弹"吗?的更多相关文章

  1. ThoughtWorks微服务架构交流心得

      ThoughtWorks微服务架构交流心得: (1)<人月神话>中谈到软件开发没有银弹,根源在于软件所解决的领域问题本身固有的复杂性,微服务正是从领域问题角度上进行服务拆分,来降低软件 ...

  2. Chris Richardson微服务翻译:微服务介绍

    作者简介:Chris Richardson,世界著名的软件架构师,经典著作<POJOS IN ACTION>的作者,cloudfoundry.com 的创始人 微服务目前正受到大量的关注, ...

  3. .Net Core微服务系列--理论篇

    微服务的由来 微服务最早由Martin Fowler与James Lewis于2014年共同提出来的,但是微服务也不是一个全新的概念,它是由一系列在实践中获得成功并流行起来的概念中总结出来的一种模式, ...

  4. TOP100summit:【分享实录-华为】微服务场景下的性能提升最佳实践

    本篇文章内容来自2016年TOP100summit华为架构部资深架构师王启军的案例分享.编辑:Cynthia 王启军:华为架构部资深架构师.负责华为的云化.微服务架构推进落地,前后参与了华为手机祥云4 ...

  5. 简单聊聊SOA和微服务

    转自:https://juejin.im/post/592f87feb123db0064e5ef7c  (2017-06) 简单聊聊SOA和微服务 架构设计中的朴素主义 前两天和一个朋友聊天,他向我咨 ...

  6. 关于微服务、SOA、以及API的理解

    现在微服务.SOA.RESTful API设计等在各大公司很流行.微服务(micro services)这个概念不是新概念,很多公司已经在实践了,例如亚马逊.Google.FaceBook,Aliba ...

  7. 在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用

    本文为阿里云容器服务Spring Cloud应用开发系列文章的第一篇. 一.在阿里云容器服务上开发Spring Cloud微服务应用(本文) 二.部署Spring Cloud应用示例 三.服务发现 四 ...

  8. 微服务架构之思维三部曲:What、Why、How

    本文转自:http://www.servicemesh.cn/?/article/49 What:什么是微服务? 某百科对微服务架构的定义和阐述:微服务可以在“自己的程序”中运行,并通过“轻量级设备与 ...

  9. 微服务与SOA

    微服务跟SOA有什么区别呢,可以把微服务当做去除了ESB的SOA.ESB是SOA架构中的中心总线,拓扑结构应该是星形的,而微服务是去中心化的分布式软件架构. 一.巨石(monolith) web应用程 ...

随机推荐

  1. static 成员函数

    和静态数据成员一样,静态成员函数是所有对象共享的,不是单独属于某一个对象,由于静态成员函数没有传递this指针,故static member function 只能访问static成员,不能访问非st ...

  2. 为什么c++中返回成员变量的指针,会破坏了封装?

    上述代码中,get()函数返回的是类成员变量的name的地址,这是很危险的,name是私有的,意味这不想被客户访问,但是如果返回name的地址,那么外部函数就可以修改name,这就破坏了封装性. 为什 ...

  3. arduino IO口

    AVR单片机的每组I/O口都配备有三个8位寄存器,分别是:方向控制寄存器DDRx.数据寄存器PORTx.输入引脚寄存器PINx(x=A/B/C/D).I/O口的工作方式和表现特征由这三个I/O寄存器控 ...

  4. An existing resource has been found at location D:\Tomcat 7\apache-tomcat-7.0.55\webapps。。。

    这个错误是说你的资源丢失,就是说tomcat无法解析你的.class文件,需要自己重新配置一下. 解决方法: 右击项目名 ---> 点击properties --> 在搜索栏里 输入 WE ...

  5. 20145234黄斐《java程序设计》第六周

    教材学习内容总结 第十章:输入与输出 InputStream与OutputStream 流(Stream)是对「输入输出」的抽象,注意「输入输出」是相对程序而言的 InputStream与Output ...

  6. HDU2976 Dropping tests 2017-05-11 18:10 39人阅读 评论(0) 收藏

    Dropping tests Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12187   Accepted: 4257 D ...

  7. eclipse 安装

    做一个项目,需要搭建环境.使用sql server 2005,tomcat,eclipse.过程真复杂,碰到些小问题,不过都解决了,还算顺利. win7下sql server 2005安装:http: ...

  8. [FMX]将 Android 程序切换到后台及从后台切换到前台实现

    有时候,我们需要将自己的Android程序切换到后台运行,在必要时,将其切换到前台运行.下面提供了一种实现方式,首先需要引用三个单元:   1 uses Androidapi.JNI.App,Andr ...

  9. 五、搭建kube-dns

    1. 简介   kube-dns用来为kubernetes service分配子域名,在集群中可以通过名称访问service.通常kube-dns会为service赋予一个名为"servic ...

  10. flume 整合kafka

    背景:系统的数据量越来越大,日志不能再简单的文件的保存,如此日志将会越来越大,也不方便查找与分析,综合考虑下使用了flume来收集日志,收集日志后向kafka传递消息,下面给出具体的配置 # The ...