用户您好!请先登录!

白话微服务架构

白话微服务架构

微服务是什么?

微服务是一种细粒度(Fine-Grain)的SOA

或许在座的高朋了解过其概念。个人认为,与其说微服务是一种技术,不如将其定义为一种架构,而架构则是"技"的实现与"术"的策略相辅相成。
"术"的策略需要分析使用场景,进行合理地划分业务边界,实现"业以类聚",然而"技"的实现则通过特定的技术在实现业务逻辑之时,更多的考虑实现过程中的效率性、测试的便利性、维护的可持续性,达到"技以群分"的目的。

由此而论,我个人偏好将其定义为:”微服务是一种细粒度的SOA”。

这样定义的好处在于,没必要去重复地”抹黑””单体应用”(Monolithic,也有人翻译成”巨石应用”),缘于SOA技术的衍化过程中早已提及。那么,细粒度更多的体现在”取其精华,去其糟粕”。

SOA又是什么?

**SOA = Service-Oriented Architecture**
 
SOA 中文定义是面向服务架构,它并非是今日的重点,请原谅我不能花大篇幅来加以阐述。我用"点到为止"的方式描述SOA具备哪些特征,以及相关的技术。

SOA有什么?

特征
  • 面向服务( Service-Oriented )
  • 松耦合(Loose-Coupling)
  • 模块化(Modular)
  • 分布式计算(Distributed Computing)
  • 平台无关性(Independent Platform)
  • 集中管理(Center Government)
技术
  • Web Services

Web Services 技术演进的目的在于解决分布式计算中,统一异构系统的服务调用的通讯协议。前期的Web Services有XML-PRC、WSDL、SOAP等技术,不但解决了Windows平台COM+以及Java 平台RMI无法跨平台的问题,而且使用了可读性强的本文协议替代了复杂的二进制协议,如CORBA技术。现代的WebServices 技术主要代表有REST等。

  • Message Queue

Message Queue 技术设计的目的主要有两个方面:

从架构上来说,消息队列服务帮助系统之间依赖关系解耦;

从技术上来看,消息队列为系统提供异步处理的能力,解决了并发同步调用导致资源消耗过集中和过快等问题,将上下游系统的数据结构提供了统一的传输介质。

  • ESB

ESB 则是 SOA 集大成实现。

SOA不是什么?

SOA ≠ Monolithic

SOA 不但不是Monolithic,而且是要解决Monolithic,Monolithic 个人偏好翻译成"单体应用",也被翻译成"巨石应用"。

Monolithic是什么?

朋友可能觉得奇怪,故宫与"单体应用"有什么关系?故宫是帝王居住和办公的场所,她象征着"最高权利"和"中央集权"。华夏民族,自秦朝的"三公九卿制",还是隋朝的"三省六部制",以及明清的"内阁制度",无一例外地致力于巩固"中央集权"。

近两千年来,虽然王朝不断更迭,这个制度一直被沿用,并且没有出现大的诟病。可是,1793年,英国勋爵马戛尔尼出使中国,代表英皇为乾隆皇帝祝寿,也负有促成中英通商的使命。虽然当时的中国笼罩在"乾隆盛世"的光环下,不过在马戛尔尼看来中国无论从科技还是社会制度上,均处于相对落后的阶段。
《左传》有言:"民之多幸,国之不幸",当时的大多数国民视英国为"蛮夷",不与商贸往来。五十年后,中英鸦片战争爆发,1840年,中华帝国第一个不平等条约《南京条约》被迫签订,它不但打击中华名族,而且"打醒"了大和民族。明治维新后的日本,屡屡挑战中国的东亚地位,直到中日甲午战争失利。1895年《马关条约》签订,割台湾,赔巨款。但仍有康有为等不愿放弃,联名千人"公车上书",认为"中央集权"并不是问题所在。"中央集权"职责臃肿,行政不力,中央政策想要对地方面面俱到是不可能的,无法做到"因地制宜"。

我想说的是,单体应用不正像一个"中央集权"的政府吗?而微服务应用则更像"多权分立"的"自治"政府,各个"自治"政府之间在"联邦"的架构下"分工"和"协作"。

微服务与SOA差异对比:

这是我看过关于微服务架构最好的一篇文章,没有之一

 

Why?为什么要微服务?

  • 效率的需要

应用进行微服务化后,规模和体积变得更加轻量级,在编译、打包、分发、部署等环节节约了时间,开发上效率提升。

  • 质量的需要

微服务应用面向持续集成友好,自动化编译、单元和集成测试用例执行和回归,提高应用整体质量。

  • 稳定的需要

当应用大而全时,往往牵一发而动全身,其中一个服务出现问题,整体受到牵动效应。整体稳定性得不到保证,因此,经过微服务化后,应用由原来的服务内部组装到服务自由组合,一旦关联服务存在问题,整体应用可以选择性地降级或熔断等措施,待问题服务恢复,一切照常执行。

  • 运维的需要

微服务应用具备自动化编译、打包、分发、部署和运维的能力。传统的应用不但需要开发、还需要测试和运维人员,微服务应用实现后,将理想化的全栈(Full-Stack)工程师变为可能。

  • 成长的需要

微服务能够更好,更快地适配新技术,比如目前流行的Apache Kafka。而工程人员需要接触新的技术,为未来可能的技术选型做好准备。我的建议在一些不那么重要的微服务应用中,可以尝试一些新的技术,在其提供的功能与实际需要之间,找到一些自己的理解,也是自我成长的需要。

什么情况下不必微服务?

论语有言:"子绝四:'毋意、毋必、毋固、毋我'。",简单地说,不要臆断,不要固执,不要自我感觉良好,也有什么是必定的。
那么,在微服务实践过程中,哪些因素可以不必微服务呢?请注意用词,这里说的是"不必",不是"不要"。
  • 场景单一

当应用的场景单一时,没有必要非得微服务,因为它本身就是微服务,例如一些静态的通告页面。

  • 逻辑简单

当应用逻辑简单时,同样也违背了微服务的初衷,因为微服务是为了解决复杂业务逻辑而衍生,因此这种情况下也不必实施微服务。

  • 业务渐逝

首先,我解释一下”渐逝”,也就是逐渐消逝的意思。当应用所关注的业务趋于消逝状态时,尽管有实施的空间,但无实施的必要。因为这样的应用随时可能不复存在,好比没有必要去对BB机或者短信业务大张旗鼓的重构一般。

  • “老成持重”

老成持重的原意是形容人做事情老练和沉稳。这里我引用了这个成语,是为了方便记忆,需要将其拆开,单独解释。

“老”是指年老的应用,多久算得上年老呢?个人经验,应用服役年龄超过三年以上。

“成”则表示应用的规模已成形,业务上几乎不再变化,比如通知应用。

“持”说明应用的场景还将持续较长时间。

“重”表示应用所处的位置举足轻重,不能随时重构,比如交易应用。

当应用符合其中一条以上的特征时,该应用不必实行微服务。

  • 技术盲从

这一点是我最为关注,也是最担心朋友触犯的。我们同为工程人员,对技术的追求毋容置疑,可是千万不能因为技术而技术,新的技术推出或是解决现有问题,或是提供便利性,可是也有夸大其词的成分。理性地评估和谨慎地实施,更是我们更要关注的地方。技术困难挑战聪明才智,理智对待则考验情绪控制。

进阶阅读

怎么实现微服务

怎么样实现微服务,我想从以下三个方面来说明: 心态· 技术 · 思想

心态

· "子路有闻,未之能行,唯恐有闻"

句中的开头二字”子路”,是一个人名。孔子门徒三千,七十二贤,最著名的是”孔门十哲”,其中就包括子路。子路,也就是仲由,字子路。整句话的意思是说,子路听到新的知识或者道理,没有付诸于实践,又担心新的知识或道理的出现。这句话能很好地反应当今这个浮躁的互联网时代,看似科技突飞猛进,新的技术层出不穷,而实践不力,导致首鼠两端的心态。凡是他人掌握了新的技术,自己却没有,就觉得不如人,反之亦然。我想告诉大家的是,微服务并不是新的技术,而是新的思路,只不过资讯发达,加上基础的沉淀,让老的技术或理论在新的时代能够”飞入寻常百姓家”。

· "不患无位,患所以立"

当微服务被广泛地被业界认可和接受时,或许你总会担心在何处实践,因此,在心态上,需要做到不要担心它花落谁家,更要放平心态,思考它为什么存在的理由。

· "攻乎异端,斯害也已"

当你或你的团队在推广微服务过程中,你得首先做好被挑战甚至是攻击的准备,据不完全统计,世界上有5%的人,是因为反对而反对的人。但是反对负面情绪可能会印象其他50%的人。由此前提之后,还需具备攻击”异端邪说”的能力,这样就能达到”斯害也已”(这种危害也可以被消灭)。

· "过则勿惮改"

最后一种心态则是不要怕犯错,错了不要忌惮改正。作为工程人员,实施的过程中不出错是不可能的,除非不去做。不要畏惧犯错,犯错也是更好地缩小内心期望和现实情况的鸿沟,不犯错就没有成长的空间,因此,不怕错,也不忌改正。

前面的部分用了不少诗词,接下来就不会那么”诗”了,来点”干”的,也是今天的技术重头戏。马上进入技术的部分。

技术

技术上,在阿里微服务的实践过程中也不能免俗,基本上也是以下三个套路:

  • Docker
  • DDD
  • Middle-ware

DDD是Domain Driven Design(领域驱动设计)的简写,该技术源于Eric Evans 在其名著《Domain Driven Design》。从年代来看,已是相当老的设计方法论了。它作为微服务重要的理论依据,如今又如”凤凰涅槃”一般,重新进入软件领域的视野。DDD的三大实施策略在具体微服务实践过程中,取二舍一。当然,整个DDD的理论并不限于此,个人理解,DDD好像是一个传说,大家都听说过,但是谁也没有见到过。而是实现这种理想就如同乌托邦式的”共产主义”,目前仍未到时候。

· 有界上下文(Bounded Context)

有界上下文的思想,个人认为是在《设计模式》中的”单职责原则”进一步发展而言。其实也体现了东西方文化的差异,东方是以古代中国为代表的”中央集权”思想,和古希腊城邦的”三权分立”的民治思想。微服务则属于”权力分立”思想的范畴。在微服务实践过程中,确定应用边界是必要的,也是困难的。必要性反应在系统职责划分,要简约、清晰,不耦合。困难性则体现在重构过程不是一蹴而就,而是循序渐进,同时,应用还伴随着业务发展而同步开发,其间的困难是可预知的。虽然过程是痛苦的,但是也不得不去做。

· 持续集成(Continuous integration)

持续集成是继承了TDD(Test Driven Development,测试驱动开发)的思想,对应形成规模的公司而言,基本上都部署了持续集成的环境,在阿里则是Aone 系统来统筹。一些流行的开源软件,如GitLab、Jenkins(Hudson)等。

· 上下文映射(Context Map)

以上两个策略均在实践中被采纳,那么上下文映射(Context Map)则被舍弃,舍弃的原因并不在于其不合理,而是难以驾驭。例如,用户服务提供用户的模型,其中包括了姓名、生日、电话等。可是下游系统,需要仅仅需要用户的姓名信息,而实际情况,用户服务无法提供这么细粒度的服务,那么不得不在中间做一层上下文映射,将两者不再直接关联。这种情况貌似还看不出端倪,可是为服务化后,服务数量众多,其映射环节基本上不可控制,下游系统配合改动也是代价颇高,因此,在实践过程中,还是保持原有的调用关系。尽量做到改造过程中,减低错误率。

Middleware

中间件是微服务实施过程中不可或缺的一个环节,实现中间件的编程语言可以任意。

架构思想

聊完了技术,下面来谈谈思想方面的实现,总结为三大点:

  • ·少谈”敏捷”

国外很多流派在”吹嘘”,敏捷已死。不好我觉得有些夸张的成分,但是也无需过度的实施,借鉴一点即可。

  • 推崇”简洁”

简洁很重要,牢记”Simple is beautiful”。微服务系统设计越简洁越好,这里简洁不是简单。

  • 学习”狄仁杰”

这点可能很多朋友觉得非常突兀,和狄仁杰有什么关系。这里这么描述主要是狄阁老总问李元芳:”元芳,你怎么看?”。这种不耻下问的精神,知道我们来学习。狄仁杰并非事事明察,也需要李元芳这样的武夫分析和提点,能够达到破案的目的,有为何不可呢?

行走的code
行走的code

要发表评论,您必须先登录