这些年我对微服务的理解

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原则。


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

  • 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://www.mzph.cn/news/311225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

梯度下降与线性回归

对于代价函数: loss∑i(y^−yi)2loss\sum_i{(\hat{y}-y_i)}^2loss∑i​(y^​−yi​)2 loss∑i(w∗xib−yi)2loss\sum_i{(w*x_ib-y_i)}^2loss∑i​(w∗xi​b−yi​)2 最常见的代价函数:均方差代价函数(Mean-Square Error,MSE&…

fastreport字体自适应_FastReport 自动换行与行高自适应及自动增加空行

设定后即可自动换行及行高自适应。版本号5.6.21、masterData:属性值:stretched 为True2、Memo设定wordwrap为True ,stretchMode:smMaxHeightFastReport自动增加空行1、在masterdata下增加child;2、在code编写如下代码varPageLine: integer;//…

.NET Core开发实战(第21课:中间件:掌控请求处理过程的关键)--学习笔记(下)...

21 | 中间件:掌控请求处理过程的关键如果在 Map 的时候逻辑复杂一点,不仅仅判断它的 URL 地址,而且要做特殊的判断的话,可以这么做把判断逻辑变成一个委托我们要判断当我们的请求地址包含 abc 的时候,输出 new abcapp.…

英伟达3060Ti安装GPU版本TensorFlow2.X和Pytorch

查看Python与TensorFlow对应版本 安装GPU版本的TensorFlow的时候,我们需要考虑的一个问题是Python版本与TensorFlow版本的对应关系,可以参考下面这个链接: Python对应TensorFlow CPU版本 GPU版本 查看显卡驱动对应的CUDA版本并且下载安装 …

石子合并-区间dp

设有N堆石子排成一排,其编号为1,2,3,…,N。 每堆石子有一定的质量,可以用一个整数来描述,现在要将这N堆石子合并成为一堆。 每次只能合并相邻的两堆,合并的代价为这两堆石子的质量…

cesium米转换经纬度_cesium 笛卡尔坐标(单位:米) 与 经纬度(单位:弧度/度) 之间的转换。...

this.model.readyPromise.then(function (tileset) {//记录模型原始的中心点var boundingSphere tileset.boundingSphere;that.boundingSphere boundingSphere;//模型原始的中心点。此处是笛卡尔坐标,单位:米。var position boundingSphere.center;//…

200行代码,7个对象——让你了解ASP.NET Core框架的本质[3.x版]

2019年1月19日,微软技术(苏州)俱乐部成立,我受邀在成立大会上作了一个名为《ASP.NET Core框架揭秘》的分享。在此次分享中,我按照ASP.NET Core自身的运行原理和设计思想创建了一个 “迷你版” 的ASP.NET Core框架&…

逻辑回归(二)

逻辑回归 在学习逻辑回归之前我们先回顾一下线性回归。线性回归解决的是回归问题,简单来说就是,我们需要找到一个函数,这个函数需要尽可能的拟合所有训练集的样本点。 逻辑回归解决的是分类问题,它的目标是找到一个函数&#x…

ios 顶部tab滑动实现_iOS开发之多表视图滑动切换示例(仿头条客户端)

好长时间没为大家带来iOS开发干货的东西了,今天给大家分享一个头条新闻客户端各个类别进行切换的一个示例。在Demo中对所需的组件进行的简单封装,在封装的组件中使用的是纯代码的形式,如果想要在项目中进行使用,稍微进行修改即可。…

上元节的灯会(灭)-区间dp

题目背景 上元节的庙会上,牛宝靠自己的聪明才智成功破解了花灯阵,点亮了在场所有花灯,但他没料到的是这个游戏包含AB两个项目,A项目就是点亮所有花灯,而B项目则是熄灭所有花灯。不过点亮的是花灯阵,熄灭的…

Asp.Net Core 中IdentityServer4 授权中心之应用实战

一、前言查阅了大多数相关资料,搜索到的IdentityServer4 的应用文章大多是比较简单并且多是翻译官网的文档编写的,我这里在 Asp.Net Core 中IdentityServer4 的应用分析中会以一个电商系统架构升级过程中普遍会遇到的场景进行实战性讲述分析,…

交通标志识别项目教程

项目结构图 下载好项目压缩包后解压,得到以上的文件,首先将画红圈的文件删除(如果有) 安装软件 安装Anaconda 安装Pycharm 安装格式工厂 在上图中这个位置输入cmd回车,即可打开命令终端。用这样的方式打开命令终端…

内存超频trfc_这只是开始?四款DDR4内存超频效果对比

原标题:这只是开始?四款DDR4内存超频效果对比之前有人说DDR4内存的频率极限是5000MHz,但在最近结束的台湾电脑展上,有些内存的默认频率已经达到了4400MHz,看样子5000MHz的频率极限很快要实现了,由此也说明5…

素数-试除法和埃式筛选法模板

试除法&#xff1a; bool is_prime(int n) {if (n < 1) return false;for (int i 2;i<sqrt(n);i)//这样写更好!if (n % i0) return false;return true; }埃式筛选法&#xff1a; const int N 1e7; int prime[N 1]; bool vis[N 1];int n_prime(int n) {int k 0;mem…

C# 视频监控系统

去过工厂或者仓库的都知道&#xff0c;在工厂或仓库里面&#xff0c;会有很多不同的流水线&#xff0c;大部分的工厂或仓库&#xff0c;都会在不同流水线的不同工位旁边安装一台电脑&#xff0c;一方面便于工位上的师傅把产品的重要信息录入系统&#xff0c;便于公司系统数据采…

sklearn svm如何选择核函数_机器学习之支持向量机多种核模型对比

机器学习xueyifeiyun1989zx&#xff0c;公众号&#xff1a;围着围巾的小黑机器学习之监督学习实战前文我们提到机器学习中的监督学习&#xff0c;其中有一个模型是我们提到的但是没有训练测试的&#xff0c;叫做支持向量机(简称SVM)。支持向量机也是监督学习里面一个非常容易理…

7的序列-数论

题目背景 墨家机关城即将被攻陷&#xff0c;墨家家主无意间发现了一道逃生密道&#xff0c;但这道密道需要密码&#xff0c;机智的你决定参与密码的破译。 题目描述 密码门上有两行数字序列&#xff0c;数字均为非负整数&#xff0c;根据门上的古语&#xff0c;你需要求出满足…

程序员过关斩将--从每秒6000写请求谈起

点击上方“蓝字”关注我们菜菜哥&#xff0c;紧急求助呀怎么回事&#xff1f;产品经理砍你了&#xff1f;没有&#xff0c;只是写了个新项目&#xff0c;上线就被压垮了什么功能&#xff0c;这么强悍&#xff1f;一个记录用户观看视频进度信息的功能那如果用户基数大&#xff0…

批量将PPM格式图片转化为JPG格式

将PPM格式图片转化为JPG格式 做图像识别的时候数据集常常是ppm格式的&#xff0c;虽然不影响建模训练&#xff0c;但是我们电脑往往不支持ppm格式的图像展示。 比如到做交通标志识别的时候用到的BelgiumTS交通数据集或者德国GTSRB数据集 下载后得到都是ppm格式的图像。 格式转…

python数据收集整理教案_数据收集整理教案讲解学习

一、数据收集整理第一课时教学目标初步体验数据收集、整理、描述的过程&#xff0c;会用分类数数的方法将数据整理成简单的统计表&#xff0c;初步认识统计表&#xff0c;能正确填写统计表&#xff0c;能从中获得简单统计的结果。通过对学生身边有趣事例的调查活动&#xff0c;…