Monolith、SOA、DDD、The two-pizza rule、分库分表这些概念跟微服务有啥关系,你知道吗?这篇文章记录我的理解,分享给大家。
微服务(micro service),个人感觉也就近几年才吵起来的概念,记得退回去四五年(2014年),那时候大家还谈论SOA(service orentied architecture)比较多。在SOA之前,一个软件系统大多都是前后端不分离的monolith的架构,通常采用比如说spring mvc、java SSH (spring/structs/hibernate)、.net framework mvc、.net framework web form等技术方案实现。
在计算机这个领域,好像每隔一段时间总会有一些概念被炒作起来,就像近几年在炒作的微服务、云原生、人工智能AI、区块链等,大家都在努力抓住这些风口,听说现在有的大学里面,学生不发AI相关的论文就不让毕业,我想这或许是python近两年在有的语言排行榜超过java成为榜首的原因之一吧。
关于微服务架构的概念,网上有很多介绍,大家可以自行搜索。这里推荐一个业界比较有名的网址,Martin Fowler的个人网址:https://martinfowler.com/articles/microservices.html。Martin fowler是微服务领域的一个专家,它有很多关于微服务方面的研究,有兴趣的童鞋可以去他的个人网址上查阅相关资料。
那么,如何构建一个微服务架构的应用呢?基于之前的经验,我的总结如下:
一、掌握好拆分微服务的粒度,使得每个微服务相对独立,但又是整个业务流程的一部分。怎样才能掌握好这个粒度呢?我觉得有一种说法挺有道理:从业务角度,可以遵循DDD(domain driven development),即领域建模,按照具体的业务流程来划分;从团队组织角度,一个团队负责一个或多个微服务,团队大小遵循“The two-pizza rule”。
二、系统的整体设计需要遵循12 factors原则。
三、从系统实现的角度来看,考虑下面这些点:
此外,下面是我对微服务相关话题的一些思考:
一、微服务火了之后,业界一直有这样一个问题:微服务和SOA的区别到底是什么?
我个人的理解是这样的,SOA出现的背景大约是前后端不分离的monolith应用时代,为了解决各个应用系统之间的集成,于是就出现了SOA(service oriented architecture),意即面向服务的架构,idea就是把应用系统当成一个服务来设计,这样外部系统就可以很好的来消费这个服务,记得那时候把服务暴露出来的常用做法就是SOAP;而微服务出现的背景是,SOA本质上大多还是monolith架构,即是单体应用,为了解决单体应用很重的问题,出现了微服务。所以SOA是第一阶段,服务主要面向系统外部集成;而微服务则是第二阶段,服务不但面向系统外部,同时也面向系统内部。
二、微服务和monolith的比较,下面是我个人的看法:
三、微服务到底是选择共享数据库还是独立数据库?下面是我个人的看法:
四、分库分表和微服务的关系?
当一个系统数据量上去了,往往都需要考虑分库分表的事情。因为一旦数据量级上去了,数据库很容易就成为瓶颈。所以,怎么实现分库分表呢?其实,微服务本身就是一个很好的分库分表的实现。首先,每个微服务独立数据库就是一个层面的分库,不同微服务相关的业务数据存在单独的数据库,可以一定程度缓解共享数据库的瓶颈。其次,一个SaaS系统往往需要考虑多租户,一种多租户实现策略就是:每个租户拥有自己的独立数据库,不同租户的数据就被存在各自独立的数据库,这样又是一个层面的分库。其实分库的本质也就是通过一种哈希算法,把数据分散到不同的数据库实例上,以达到负载均衡的作用。另外,有时候通过分库仍然会存在一些表数据量太大的问题,比如订单表,当数据量太大的时候,其读写操作的性能往往会急剧下降,这时候就需要做分表了。其实,个人觉得分库某些时候也是一种分表,除此之外,还有一些其它策略,比如说,我们可以把比较老的数据存到另外一张表去,就像一些电商平台,用户默认只能看最近三个月的订单等。 五、迁移monolith应用到微服务架构
如果我们开发一个系统,一开始选型就是微服务,这样很容易。但是,有时候我们需要把一个非常庞大的monolith应用迁移到微服务架构,这往往不是一件容易的事情。一般怎么做呢?我们需要从多个层面考虑:技术层面,首先需要仔细思考怎么拆分微服务,有时候这会很难,因为对于一个庞大的monolith应用,之前的实现各个模块之间往往耦合得非常紧;其次需要把之前的数据裤拆分为每个微服务独立的数据库,这也会很难,因为怎么实现数据迁移需要仔细考虑,可以参考我之前写过的一篇文章(如何不宕机实现数据库迁移)。另外,团队层面也需要考虑很多,比如说团队的组织结构可能需要调整、团队成员的mindset需要buildup等。 最后,最近各大云厂商都在大力炒作cloud native,我查看了一些关于相关介绍,感觉其实它和微服务就是换汤不换药,其实就是基于微服务的概念,然后加了一些容器编排的概念。See https://jimmysong.io/kubernetes-handbook/cloud-native/cloud-native-definition.html。 References