JoeCao / JoeCao.github.io

543 stars 69 forks source link

多研究些架构,少谈些框架(1) -- 论微服务架构的核心概念 #3

Open JoeCao opened 7 years ago

JoeCao commented 7 years ago

多研究些架构,少谈些框架(1) -- 论微服务架构的核心概念 多研究些架构,少谈些框架(2)-- 微服务和充血模型 多研究些架构,少谈些框架(3)-- 微服务和事件驱动

多研究些架构,少谈些框架(1) -- 论微服务架构的核心概念

2017-6-9 曹祖鹏

微服务架构和SOA区别

微服务现在辣么火,业界流行的对比的却都是所谓的Monolithic单体应用,而大量的系统在十几年前都是已经是分布式系统了,那么微服务作为新的理念和原来的分布式系统,或者说SOA(面向服务架构)是什么区别呢?
我们先看相同点

那么差别在哪?

微服务架构的精髓在切分

微服务和Domain Driven Design

一个简单的图书管理系统肯定无需微服务架构。既然采用了微服务架构,那么面对的问题空间必然是比较宏大,比如整个电商、CRM。

如何拆解服务呢?
使用什么样的方法拆解服务?业界流行1个类=1个服务、1个方法=1个服务、2 Pizza团队、2周能重写完成等方法,但是这些都缺乏实施基础。我们必须从一些软件设计方法中寻找,面向对象和设计模式适用的问题空间是一个模块,而函数式编程的理念更多的是在代码层面的微观上起作用。
Eric Evans 的《领域驱动设计》这本书对微服务架构有很大借鉴意义,这本书提出了一个能将一个大问题空间拆解分为领域和实体之间的关系和行为的技术。目前来说,这是一个最合理的解决拆分问题的方案,透过限界上下文(Bounded Context,下文简称为BC)这个概念,我们能将实现细节封装起来,让BC都能够实现SRP(单一职责)原则。而每个微服务正是BC在实际世界的物理映射,符合BC思路的微服务互相独立松耦合。

微服务架构是一件好事,逼着大家关注设计软件的合理性,如果原来在Monolithic中领域分析、面向对象设计做不好,换微服务会把这个问题成倍的放大

以电商中的订单和商品两个领域举例,按照DDD拆解,他们应该是两个独立的限界上下文,但是订单中肯定是包含商品的,如果贸然拆为两个BC,查询、调用关系就耦合在一起了,甚至有了麻烦的分布式事务的问题,这个关联如何拆解?BC理论认为在不同的BC中,即使是一个术语,他的关注点也不一样,在商品BC中,关注的是属性、规格、详情等等(实际上商品BC这个领域有价格、库存、促销等等,把他作为单独一个BC也是不合理的,这里为了简化例子,大家先认为商品BC就是商品基础信息), 而在订单BC中更关注商品的库存、价格。所以在实际编码设计中,订单服务往往将关注的商品名称、价格等等属性冗余在订单中,这个设计解脱了和商品BC的强关联,两个BC可以独立提供服务,独立数据存储

小结 微服务架构首先要关注的不是RPC/ServiceDiscovery/Circuit Breaker这些概念,也不是Eureka/Docker/SpringCloud/Zipkin这些技术框架,而是服务的边界、职责划分,划分错误就会陷入大量的服务间的相互调用和分布式事务中,这种情况微服务带来的不是便利而是麻烦。 DDD给我们带来了合理的划分手段,但是DDD的概念众多,晦涩难以理解,如何抓住重点,合理的运用到微服务架构中呢? 我认为如下的几个架构思想是重中之重

版权说明

本文采用 CC BY 3.0 CN协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。

关注我

微信公众号 qrcode_for_8

benyVip commented 7 years ago

技术是手段的选择,思想是灵魂

jingpeicomp commented 7 years ago

架构是软件的核心和灵魂,没有好的架构的软件经过一段时间的迭代后,会很快走向腐朽。 不能要求每个程序员都能设计出好的架构,那么框架出现了。框架只是知识和经验的总结,提供了一种通用的套路和便捷的落地方式。框架对应软件的各个层次,最上层的架构框架对应着架构。 SSH是web开发框架,它的背后是分层架构。使用但不盲目追求框架,更要明白框架背后的架构。程序员不应该成为框架的奴隶。 不使用框架也能够设计和写出优雅的软件。比如OSchina网站。

xishuixixia commented 7 years ago

你好,这些文章可以转载到InfoQ吗?不知道是否方便给个您的联系方式?

JoeCao commented 7 years ago

@xishuixixia 本文采用 CC BY 3.0 CN协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。 有什么问题可以邮件联系我。

cytzrs commented 7 years ago

非常受教

wanyouzhu commented 7 years ago

老曹你这是要让DDD传遍天下的节奏啊!都是干货,满满的干货!👍

RussellSN commented 7 years ago

你的论述更多的关注的是解域的东西,怎么拆分、与SOA的对比,更多的是讲如何做。你的标题“多关注架构少谈框架”是正确的,但是你自己也没有设定问题域,在大谈解域,尽管避免了具体框架的论述,但是限界上下文、拆分这些毕竟也只是解域的方法而已。你对微服务产生的背景、SOA的原始动机都没有分析,跟直接谈框架不谈你所说的“架构”是一样的问题。

soulmz commented 7 years ago

限界上下文(Bounded Context,下文简称为BC)这个概念

这里开始就有点难懂了。能否再举些例子?

whiskyzhu commented 7 years ago

文章一些观点不错,感觉还是没有说清楚SOA和微服务的核心区别。

toeasy commented 7 years ago

这系列说到了微服务本质。讲到了事件驱动、上下文、充血这才是想要微服务规划要考虑的事情。形式上通讯协议不是重点

n5ken commented 6 years ago

为什么不在WIKI上写这些