这些年我对微服务的理解

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年),大数据还比较火,大家都在炒作这个概念,HadoopHBase、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

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 这些年我对微服务的理解

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址