转载

这些年我对微服务的理解

M onolith、 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原则。

三、从系统实现的角度来看,考虑下面这些点:

  • API Gateway

  • Service Registry and Discovery - Eureka

  • Circuit Breaker - Hystrix

  • Fault Tolerant - Hystrix

  • Message Broker - RabbitMQ

  • Database - Postgres

  • Logging and Tracing - ELK

  • Authorization and Authentication - OpenID/SAML/OAuth/JWT

  • Secure Credential Store - Vault

  • Security and Audit

  • CI/CD - Jenkins

  • Monitoring - Grafana

  • Container Runtime - Docker/CloudFoundry/Kuberntes

  • Scaling - Vertical scaling/Horizontal scaling

  • Proxy and Load Balancer - nginx

  • Multi-Tenancy

此外,下面是我 对微服务相关话题的一些思考:

一、微服务火了之后,业界一直有这样一个问题:微服务和SOA的区别到底是什么?

我个人的理解是这样的,SOA出现的背景大约是前后端不分离的monolith应用时代,为了解决各个应用系统之间的集成,于是就出现了SOA(service oriented architecture),意即面向服务的架构,idea就是把应用系统当成一个服务来设计,这样外部系统就可以很好的来消费这个服务,记得那时候把服务暴露出来的常用做法就是SOAP;而微服务出现的背景是,SOA本质上大多还是monolith架构,即是单体应用,为了解决单体应用很重的问题,出现了微服务。所以SOA是第一阶段,服务主要面向系统外部集成;而微服务则是第二阶段,服务不但面向系统外部,同时也面向系统内部。

二、 微服务和monolith的比较, 下面是我个人的看法:

  • 微服务开发效率更高,环境setup简单,build/checkout/run更快,ut/it 时间更短。各个微服务职责分离,边界清晰,有利于cross team开发,特别是对于跨location的协作开发,优势更加明显。记得之前有一个monolith的项目,代码总共几百万行,从git上拉下来都要几十分钟,build也很慢,ut/it需要跑非常长时间,开发效率很低,同时也非常不利于实现CI/CD。

  • 从扩展性方面来讲,微服务既可以水平扩展,也可以垂直扩展。而monolith只可以水平扩展。

  • 有人说monolith可以利用数据库事务,保证强一致性,而微服务则不能保证强一致性,通常只能保证最终一致性,这是monolith的一个优点。我觉得这个点需要辩证的来看,因为强一致性,有时候也会带来一些性能问题,比如事务很大且高并发的情况,数据库容易成为瓶颈,最终导致吞吐量太低。同时,正如我之前写的一篇文章( 关于分布式系统数据一致性的那些事 ),现实生活中也不可能有一个大而全的系统可以cover所以的场景,并且用事务保证强一致性。一个典型的例子,银行转账往往需要强一致性,单个银行系统可以用数据库事务实现,但是跨银行系统转账就不可能利用单机数据库事务,因为不同银行系统都是自己的数据库,所以即使是银行系统并不能保证强一致性。之前一个同事说他就亲身经历过一次银行系统短时不一致的情况:他跨行取钱,钱被扣了,但是钱没吐出来,最后是去柜台人工处理才解决。

三、 微服务到底是选择共享数据库还是独立数据库? 下面是我个人的看法:

  • 如果是共享数据库的话,仍然类似于单体设计(数据库层面的单体设计),数据库层只能水平扩展, 容易成为瓶颈,比如说锁资源占有、死锁、 DB层面紧耦合导致开发互相影响等。原则上,对于微服务系统,应该只有API是不同微服务之间的contract,如果采用共享数据库,就又引入了另外一个层面的contract,不容易维护,当有其他团队的人改了数据库,容易导致意想不到的错。

  • 有人说采用共享数据库,做报表更方便。是的,如果是共享数据库,报表生成可以直接基于数据库来做join等操作,而如果是独立数据库,直接基于数据库的join就不行。但是,采用共享数据库也并不意味着报表方便。一般来说报表属于OLAP操作,而业务逻辑属于OLTP操作,理论上讲,列级数据库更适合OLAP操作,而行级数据库更适合OLTP操作,如果报表这类OLAP操作和业务逻辑OLTP操作同用一个数据库的话,大量的OLAP操作会影响OLTP业务处理,所以,这两类操作分开用各自合适的数据库,才能互不影响并且利用不同数据库的优势。记得,退回去几年(2014年),大数据还比较火,大家都在炒作这个概念,Hadoop、HBase、Spark、HANA等就是那时候的产物,其实个人理解大数据就是拿来做OLAP操作的。

四、分库分表和微服务的关系?

当一个系统数据量上去了,往往都需要考虑分库分表的事情。因为一旦数据量级上去了,数据库很容易就成为瓶颈。所以,怎么实现分库分表呢?其实,微服务本身就是一个很好的 分库分表的实现 。首先,每个微服务独立数据库就是一个层面的分库,不同微服务相关的业务数据存在单独的数据库,可以一定程度缓解共享数据库的瓶颈。其次,一个SaaS系统往往需要考虑多租户,一种多租户实现策略就是:每个租户拥有自己的独立数据库,不同租户的数据就被存在各自独立的数据库, 这样 又是一个层面的分库。其实分库的本质也就是通过一种哈希算法,把数据分散到不同的数据库实例上,以达到负载均衡的作用。另外,有时候通过分库仍然会存在一些表数据量太大的问题,比如订单表,当数据量太大的时候,其读写操作的性能 往往会急剧下降 ,这时候就需要做分表了。其实,个人觉得分库某些时候也是一种分表,除此之外,还有一些其它策略,比如说,我们可以把比较老的数据存到另外一张表去,就像一些电商平台,用户默认只能看最近三个月的订单等。

五、迁移monolith应用到微服务架构

如果我们开发一个系统,一开始选型就是微服务,这样很容易。但是,有时候我们需要把一个非常庞大的monolith应用迁移到微服务架构,这往往不是一件容易的事情。一般 怎么做呢?我们需要从多个层面考虑: 技术层面,首先 需要仔细思考怎么拆分微服务,有时候这会很难,因为 对于一个庞大的monolith应用,之前的实现各个模块之间往往耦合得非常紧;其次需要把之前的数据裤拆分为每个微服务独立的数据库,这也会很难,因为怎么实现数据迁移需要仔细考虑,可以参考我之前写过的一篇文章( 如何不宕机实现数据库迁移 )。另外, 团队层面也需要考虑很多,比如说团队的组织结构可能需要调整、团队成员的mindset需要buildup等。

最后,最近各大云厂商都在大力炒作cloud native,我查看了一些关于相关介绍,感觉其实它和微服务就是换汤不换药,其实就是基于微服务的概念,然后加了一些容器编排的概念。See https://jimmysong.io/kubernetes-handbook/cloud-native/cloud-native-definition.html

References

  • https://martinfowler.com/articles/microservices.html#HowBigIsAMicroservice

  • https://docs.microsoft.com/en-us/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/ddd-oriented-microservice

  • https://12factor.net/

  • https://jimmysong.io/kubernetes-handbook/cloud-native/cloud-native-definition.html

  • https://www.oreilly.com/library/view/microservices-antipatterns-and/9781492042716/ch04.html

原文  http://mp.weixin.qq.com/s?__biz=MzAwNTMxMzg1MA==&mid=2654077770&idx=8&sn=36ae96e5ebd324b8d1b14ee1d817e7f2
正文到此结束
Loading...