关于微服务新知

最近在读Sam Newman的《Building Microservices》,让我对微服务又有了新的认识,当然也包括对SOA的进一步理解,需要整理一下新知,以让这些知识融入自己的知识体系,为我所用。

微服务是2014年由大神Martin Fowler提出来的一种架构设计理念,同时在Spring Cloud以及Dubbo技术的推动下,微服务迅速红遍大江南北。

而我对于微服务的理解就是将过去的单体应用拆分成彼此之间能够通过服务接口进行通信的尽可能小的组件服务,再加上我用上了Spring Cloud,那么我的系统就是微服务架构了。

其实看起来还是挺像那么回事儿的,但是现在看来还是“Too Young! Too Simple! Too Naive!"

什么是微服务

微服务是一种基于“高内聚、低耦合“设计原则的架构模式,是由一组可独立释放的业务领域服务组成的系统架构,各个服务之间通过网络进行通信,共同对外提供服务。

微服务中每个服务都可以看做是一个黑盒,其内部的实现细节、技术架构、变化对外界都是无感的。这样的设计符合信息隐藏的理念,即尽可能的将更多的信息隐藏在组件内部,同时通过对外接口也尽可能暴露更好的信息。这样能够保证边界清晰,让我们清楚知道哪些是对变化开放的,哪些是对变化封闭的。

微服务的关键就在于构建一个清晰、稳定的服务边界,这表示服务内部发生变化时不会对外界系统造成影响,进而做到低耦合、高内聚。

微服务与SOA的关系

SOA是一种针对服务协同的设计方法,旨在解决大型单体应用的软件复用问题,它的目的是使维护或重写软件变得更容易。应用SOA的方法,理论上讲只要服务语义不发生太大的变化,就可以在任何人都不知道的情况下用一种服务替换另一种服务。

也就是说,SOA的本质是解决应用间耦合的问题,保证在不影响其他应用的前提下进行软件的变更。可以说其理念非常好、非常先进,只是缺乏行之有效的实践手段,往往将SOA演变成了产品推销的商业行为。

那么通过以上的理解,我们可以将微服务看成是SOA方法的一种最佳实践,通过采用微服务设计能够实现每个服务应用的独立变更,并且不会对其他应用乃至整体造成影响,也就是实现SOA的目标。

微服务设计的关键

微服务设计的关键就是要做到可独立部署,即一个服务的变更、部署及发布,不影响也不需要重新部署任何其他的服务。

可独立部署初看起来比较简单,但实际上要达到这个目标需要满足服务间是完全松耦合的,否则是做不到独立部署的。那么问题就来了,怎么才叫松耦合的服务呢?

答案是服务自身要面向业务高内聚,而不是我们习惯的面向技术能力的高内聚。怎么理解这句话呢?这就需要谈一谈分层架构设计,相信在过去开发和设计中,我们用的最多的就是分层架构设计方法,非常典型的就是三层架构设计。

分层架构倡导的就是技术能力的高内聚,表现层聚焦的如何给用户进行UI展现;业务层聚焦的是如何处理表现层的请求;数据层聚焦的是如何高效存储和查询。这种分层架构的设计实际上遵循的也是“低耦合、高内聚”的设计原则,期望一层的变动不会对其他的层级造成影响。

但是实际情况并非如此,比如业务发生了变动,要求我们在前端页面增加一个按钮,要求用户喜欢作者的文章时,点击按钮来表示“喜欢”。期望是只影响表现层,但是我们有开发经验的都会认识到,增加这一个按钮在业务层需要增加相应的接口以及处理逻辑,在数据层需要增加相应的数据表或者数据字段用来存储用户的行为,也就是各个层级之间实际是相互影响的。

那么我们再来看一下什么叫面向业务的高内聚,情况确实就不太一样了。

上图每一个方块是一个业务高内聚的服务,假设用户服务提供的是用户注册、个人信息维护等能力;文章服务提供发布文章、浏览文章、评论文章等能力;视频服务提供视频发布、视频浏览、视频点评等能力。那么这时候再看实际上上面的业务变动就只会影响“文章服务”这个服务,其他服务不会受到影响。

要做到业务高内聚,实际上关键就在于划定稳定、清晰的业务边界,也就是围绕业务领域进行微服务的建模,这时候“领域驱动设计(Domain Driven Design,DDD)”是一个很好的选择。

另外,通过上面的说明,我们也能够知道,实际上每个微服务实际上不只是只能够包含后端的服务接口,而是可能需要包含前端展示的UI。也就是说,每个微服务可以应用分层架构的方法进行设计和实现

关于微服务的大小

理解了微服务设计的核心关键在于构建稳定和清晰的服务边界,也就是面型业务的高内聚,那么我们也就不需要过分执着于微服务的服务究竟要有多大了。业界也没有标准答案,引用书中的话讲,“你能理解的服务有多大,那么微服务就可以是多大”。

同时相比关注微服务大小的话题,我们需要关注的是下面两个问题:

1、你能hold住多少个微服务?按常理理解,服务数量越多,复杂性越高,出错概率也就越高。

2、你能够定义出多少个稳定且清晰的服务边界?

所以,就像“1千人心中住着1千个哈姆雷特”一样,微服务设计并没有标准答案,还是要结合自身组织以及业务的特点进行划分和设计。

微服务架构的优势

1、技术自由

前面讲到每个服务都是独立的个体,那么也就不需要像传统的单体架构那样整个大平台必须保证技术统一。这时候每个微服务小团队就可以按照各自的技术强项以及业务场景选取合适的技术,从而提高整体的开发效率

2、鲁棒性

提高应用鲁棒性的关键是构建应用间的“隔水板”,即如果一个系统组件宕掉了,但是能够将这个错误进行隔离没有产生级联效应,从而保证系统的其他部分能够继续正常工作。

而我们前面说的,微服务天然就具备的这样的“隔水板”,即他们彼此之间稳定且清晰的服务边界。

3、弹性

相比于单体应用,只能进行完整应用的扩展部署,微服务可以做到每个服务的独立扩展和伸缩,使得应用整体更加弹性。

4、易发布

就像“哪里不会点哪里”一样,微服务能够做到“哪里变了发哪里”。

5、组合编排

由于每个服务是业务高内聚的,不同的业务之间可以进行灵活组合,从而创造出更多的可能性,降低创新成本。

不能盲目的技术崇拜

就像书中说的,包括我之前选用微服务架构一样,我们选用微服务架构的主要原因是被上面所说的各种好处所吸引,在应用还没有成型,还没有用户的情况下就考虑应用需要具备分布式的特性,以能够支撑大规模、海量并发的情况。这实际上是一种脱离实际的过度设计,也是一种技术崇拜。

实际上单体应用架构也是一种很好的架构选择,单体架构的优势也很突出:

1. 部署简单

2. 容易监控和维护

3. 问题定位更简单

这实际上,在我们开发新产品或者企业在初创阶段是很好的选择,因为这可以让我们将更多的精力放在业务上,而不是用在微服务的维护和排错上。

选择微服务架构,也要付出相应的代价,这就包括:

1. 开发者体验问题:因为服务数量变多了,开发者很难在开发机上将所有服务都运行起来,这就意味着,可能只能了解到局部。

2. 技术过载问题:像上面说的,技术自由了,代价就是技术管理更复杂了。

3. 监控和问题定位问题:分布式架构导致信息分散、日志分散,这就给监控和问题定位都造成很大的麻烦。

4. 安全问题:相比于单体架构,微服务架构更多的依赖网络进行消息传递,可能带来消息泄露带来的安全性问题。

5. 测试问题:微服务比较分散,导致很难进行很大范围的测试覆盖。

6. 延迟问题:相比于单体架构进程内的方法调用,微服务需要通过网络进行消息的流转传递,这必然会造成延迟性。

7. 数据一致性问题:一次请求通常需要经过多个服务,同时数据也要在多个服务间流转,这会带来数据一致性问题。

所以,我们需要理性的选择微服务,最好的办法是逐步迭代的向微服务进行过渡。

基于上面强调的微服务的独立性设计原则,那么我们很容易判断新产品以及初创阶段的产品不宜采用微服务,因为这时候业务边界并不清晰,很容易频繁的发生变化,从而导致每个服务的大量变更。

总结

微服务架构是SOA的一种最佳实践方法,一个重要的设计原则就在于保证每个服务的独立性。这个独立性一方面是微服务的优势,另外一方面也是我们在进行微服务架构设计时需要重点关注的设计原则。

那么回过头来看我们当时采用的微服务架构,只是照猫画虎,主要破坏的原则就是“独立性”原则,也就是业务边界的不清晰。

通过本文,让我对微服务架构有了更清晰的认识,也对于我们数据中台的架构有了新的理解。实际上,巧合的是我们的数据中台在设计上是能够与微服务架构的设计理念完全匹配的,这也算是意外收获吧,哈哈。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容