为什么要将应用微服务化

上古时期的高可用架构

其实在十多年前,“架构师”并不是一个需求很大的职业,一来那时还没有“全民App”级别的应用,除了三大门户网站以外,其他的网上应用业务压力并不大;二来也没有现如今这么丰富的技术选型,几乎清一色的PHP(坊间一直流传着PHP是世界上最好的语言这个说法,我08年左右写过一年PHP,那是我人生最黑暗的一年)。因此呢对所谓“架构师?”的需求并不是很大,那些年的高可用架构大体上就是这个样子的:
在这里插入图片描述

在上面的反向代理集群之下,是众多Web服务器构成的高可用集群不过这些服务器中部署的应用却是千篇一律,什么意思呢?大家看过火影忍者吧,里面主人公经常用的一招叫“多重影分身之术”,将一个自己的本尊复制为成千,上万个本尊。这里的服务器集群是-个道理,将一个巨无霸的单体应用复制成N个单体应用,组成一个分布式的服务集群。

传统架构之殇

随着互联网行业的飞速发展,个人的衣食住行几乎全依赖各种APP来满足。每天早上起来刷刷淘宝,地铁,上用视频app看个短句,- -天微信不离手,睡前刷个抖音- -不小心就刷到了后半夜,这些现象级全民应用层出不穷,所承接的用户访问量远飞上古时期的门户网站所能比拟的。在这种用户量级下还要能够满足不断变化的用户请求,就像给飞行中的飞机换引擎,传统的架构模式已经完全不能满足业务发展的节奏。

我们来举几个“单体应用”中经常被人诟病的几个问题:

数据访问杂乱

在这里插入图片描述

同一个war包内,在数据访问层面没有划分领域模型,比如说我们有User、Product和Order三张表, 对于不同的Service来说, 都通过直接访问数据库的方式来获取数据。这种做法有几个显而易见的缺点:

1)数据模型变更

拿Order表来说,如果某一天我的Data Model发生了重大变更,比如说引入了“子订单”的概念,原先的数据模型不能再很好地支持业务必须重构Orderi订单表,与此同时,还要兼容老的订单结构。这种情况下你能贸然改动数据模型吗?恐怕不行,原因就是这个Order表被这个系统中的各个服务引用到了,你的改动可能会破坏其他服务的功能。

再举个例子,Product表 以前存放的是单个的商品记录,数据模型非常简单,后面引入了SKU的概念,这就要对数据模型做重大改动,同时还可能影响到库存模块(以往库存落在Product级别,现在要落地到SKU级别)。

以上都是我做电商业务中遇到的实际场景,对于传统的应用结构来说,一丁点数据结构的改变都会引起很大的影响。如果数据模型的变动是必须的,那我们如何解决这种情况呢?很简单,通过微服务架构在各个服务之间做好隔离,将Data Model的影响带来的业务复杂度隔离在当前微服务中,划分好领域模型,上’ 下游服务只要对接微服务的接口就可以,领域模型驱动不用依赖底层数据结构的变更。

2) 底层组件变更

假如现在我要对Product表的数据访问规则做一个变更,比如引入MyCat分库分表,或者对热点数据的访问加上缓存读写的步骤。那么意味着.上下游所有访问Product表的业务,都需要连带着做同样的改动。

再说个更极端的例子,以前我们使用的是Oracle,这家伙老贵了,领导层想要换成MySQL,即便我们没有存储过程的牵绊,那么这个变更也是极其巨大的,可谓牵一发而动全身。

理论,上来说,我们应该尽可能对业务层屏蔽底层组件的变更,在传统的分布式应用中非常难以办到,但是在微服务架构下却没有那么困难,因为微服务间的访问依赖API接口+业务模型,我们只要在当前微服务中把这种底层组件的变更处理好,对上下游其他服务来讲这个变更其实是无感知的,因为在微服务接口暴露出的业务模型并不会有什么变化。

代码复用带来的维护成本

一整个应用的代码掺杂在一块,少不了各种“借鉴”,咱来细数下这里面的坑:

1)码农的傲娇-rewrite code

作为一个骄傲的码农,看别人写的代码都跟屎一样,只有自己出品的才是最好的。路见不平重构一番,重构不了的干脆重新写个功能上一模一样但是代码结构上更“优雅”的接口出来,随着时间的推移,这深藏于码农血液里的“rewrite code”基因,终究会把一个代码库编程一座屎山。

2)小改动没什么大不了

“我就改了个if条件啊,谁知道你们也用了这个方法,这方法我当初就写给自己用的啊!”

码农之间的撕逼没有那么轰轰烈烈,反正最后归根结底就是-改出bug来了。上面那个情景在传统架构的系统里很常见,当你的业务需要添加一个新功能,瞄了几眼发现,咦?我去年写的这个方法改一下正好能用,随手改了个if条件。谁曾料想,隔壁组的程序媛妹子没打招呼也用了这个方法,被你这么一改,把别人的服务搞挂了,又不好意思跟人妹子撕逼,只好自己背了个生产事故的锅。

时不我待!糙快猛才是生产力

不知道大伙有没有经历过互联网公司的业务节奏,拥抱变化不是白叫的,研发团队沉浸在996的福报中不能自拔。就像前面说的,为了支持不断变化的新业务,开发团队对系统的改造就像给飞行中飞机换引擎,既要让飞机飞,又要保证完成任务,还得要快。因此我们提出了“糙快猛”的开发模式,它是继瀑布模型、敏捷模型等等软件工程理论之后的具有中国特色的互联网研发模式。

面对一个屎山- -般的单war包应用,产品的发布节奏往往是以月甚至年来计,-个变更从评估到上线,拖个- -年半载是很常见的事情这种节奏对于互联网公司来说,倒闭100次都够了。

小步快跑

互联网产品的迭代依靠小步快跑,尽快上线,尽快验证业务模式,有问题立即调整,-切都是“快字当头”。对于传统应用来说,发布节奏只能划归到一个千年等-回的发布窗口,再小的变更都得耗上很长的时间,可能每次发布都要经历很耗时的全链路回归测试。对微服务架构来说完全不存在这个问题,每个微服务模块由于职责边界足够清晰,规模可控便于快速变更和测试,完全可以让团队自己制定发布窗口,即便是上线前的回归测试也只局限在当前服务模块

回滚

回滚对于传统的单war包分布式系统来说是个噩梦,好不容易等到了发布窗口,各个团队牟足了劲把所有变更都发布了出去,结果因为其中某个小改动引发的问题,导致全部回滚。又要苦苦等待下一个发布窗口。

在微服务架构中,回滚只局限在某个微服务的范围内,只要把出问题的应用回滚就好了,不会影响上下游其他应用的发布节奏。

本文已收录至我的个人网站:程序员波特,主要记录Java相关技术系列教程,共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源,让想要学习的你,不再迷茫。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/629071.shtml

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

相关文章

LINUX基础培训九之网络管理

前言、本章学习目标 了解LINUX网络接口和主机名配置的方法熟悉网络相关的几个配置文件了解网关和路由熟悉网络相关的命令使用 一、网络IP地址配置 在Linux中配置IP地址的方法有以下这么几种: 1、图形界面配置IP地址(操作方式如Windows系统配置IP&…

快速入门Torch构建自己的网络模型

真有用构建自己的网络模型 读前必看刚学完Alex网络感觉很厉害的样子,我也要搭建一个可以看着网络结构实现上面的代码你已经很强了,千万不要再想实现VGG等网络!!!90%你能了解到的模型大佬早已实现好,直接调用…

MFC CAsyncSocket类作为客户端示例

之前写过CAsyncSocket类使用的博客;进一步看一下; VS新建一个MFC 对话框工程; 添加一个类,从CAsyncSocket继承,起个自己的名字; 对话框添加几个编辑框,按钮,静态控件; 为自己的CxxxAsyncSocket类添加重写的虚函数,OnConnect、OnReceive、OnSend; 自己的CAsyncSoc…

pytorch一致数据增强—独用增强

前作 [1] 介绍了一种用 pytorch 模仿 MONAI 实现多幅图(如:image 与 label)同用 random seed 保证一致变换的写法,核心是 MultiCompose 类和 to_multi 包装函数。不过 [1] 没考虑各图用不同 augmentation 的情况,如&am…

生物制药厂污水处理需要哪些工艺设备

生物制药厂是一种特殊的工业场所,由于其生产过程中涉及的有机物较多,导致废水中含有高浓度的有机物和微生物等污染物,因此需要采用一些特殊的工艺设备来进行污水处理。本文将介绍生物制药厂污水处理中常用的工艺设备。 首先,对于生…

【面试合集】说说微信小程序的支付流程?

面试官:说说微信小程序的支付流程? 一、前言 微信小程序为电商类小程序,提供了非常完善、优秀、安全的支付功能 在小程序内可调用微信的API完成支付功能,方便、快捷 场景如下图所示: 用户通过分享或扫描二维码进入商…

2024年华数杯国际赛赛题浅析

21号完赛,28号出成绩的华数杯国际赛,作为美赛最合适的练手赛正式开赛。为了让大家更好地比赛,首先为大家带来本次竞赛两道题目的浅要解析。主要分析两道题目适合的群体,未来大家求解过程中可能遇到的问题。方便大家快速完成选题。…

农业四情监测管理系统的特点优势

TH-Q2农业四情监测管理系统是一种利用现代信息技术,对农业生产中的墒情、苗情、虫情、灾情进行实时监测和管理的智能化系统。那么,这个系统到底有哪些特点和优势呢?让我们一起来了解一下。 1.实时监测:通过传感器、摄像头等设备&a…

美国智库发布《用人工智能展望网络未来》的解析

文章目录 前言一、人工智能未来可能改善网络安全的方式二、人工智能可能损害网络安全的方式三、人工智能使用的七条建议四、人工智能的应用和有效使用AI五、安全有效地使用人工智能制定具体建议六、展望网络未来的人工智能(一)提高防御者的效率&#xff…

DWM1000 MAC层

DWM1000 MAC层 MAC层 概述 MAC层,即媒体访问控制层,是数据通信协议栈中的一个重要部分,位于链路层的下半部分,紧邻物理层。在OSI模型中,它属于第二层,即数据链路层的一部分。MAC层的主要职责是控制如何在…

框架基础-Maven+SpringBoot入门

框架基础 Maven基础 Maven概述 Maven是为Java项目提供项目构建和依赖管理的工具 Maven三大功能 - 项目构建构建:是一个将代码从开发阶段到生产阶段的一个过程:清理,编译,测试,打包,安装,部署…

运筹说 第46期 | 目标规划-数学模型

经过前几期的学习,想必大家已经对线性规划问题有了详细的了解,但线性规划作为一种决策工具,在解决实际问题时,存在着一定的局限性:(1)线性规划只能处理一个目标,而现实问题往往存在多个目标;(2)…

GEE时序——利用sentinel-2(哨兵-2)数据进行地表物候学分析(时间序列平滑法估算和非平滑算法代码)

简介 哨兵-2A/B 串联卫星的空间分辨率高、重访时间长,有可能改进对陆地表面物候的检索。不过,生物群落和区域特征在很大程度上限制了陆表物候学算法的设计。在北极地区,这种生物群落特有的特征包括长期积雪、持续云层覆盖和生长季节短暂。在此,我们评估了哨兵-2 获取北极高…

【jupyter添加虚拟环境内核(pytorch、tensorflow)- 实操可行】

jupyter添加虚拟环境内核(pytorch、tensorflow)- 实操可行 1、查看当前状态(winR,cmd进入之后)2、激活虚拟环境并进入3、安装ipykernel5、完整步骤代码总结6、进入jupyter 添加pytorch、tensorflow内核操作相同,以下内容默认已经安…

Klocwork—符合功能安全要求的自动化静态测试工具

产品概述 Klocwork是Perforce公司产品,主要用于C、C、C#、Java、 python和Kotlin代码的自动化静态分析工作,可以提供编码规则检查、代码质量度量、测试结果管理等功能。Klocwork可以扩展到大多数规模的项目,与大型复杂环境、各种开发工具集成…

低代码自动化测试的实践

何为低代码测试 传统上,功能、 UI、端到端等测试自动化的实现都涉及编写测试脚本,代替测试人员执行重复的手动测试任务。自动化脚本的开发工作通常由 QA 工程师或开发人员完成,这需要编写大量代码。 而低代码甚至无代码的理念也是在自动化测…

【ubuntu】ubuntu 20.04安装docker,使用nginx部署前端项目,nginx.conf文件配置

docker 官网:Install Docker Engine on Ubuntu 一、安装docker 1.将apt升级到最新 sudo apt update2.使用apt安装 docker 和 docker-compose (遇到提示输入y) sudo apt install docker.io docker-compose3.将当前用户添加到docker用户组 …

HNU-模式识别-作业2-面向应用分类系统

模式识别-作业2 计科210X 甘晴void 202108010XXX 【具体实现思路是按照去年数学建模国赛题来做的,就放个思路,完整不放全了】 题目: 查阅文献资料,构建一个面向应用的分类系统。 要求: 至少3页A4纸,文…

Leetcode951. 翻转等价二叉树

Every day a Leetcode 题目来源:951. 翻转等价二叉树 解法1:递归 存在三种情况: 如果 root1 或者 root2 是 nullptr,那么只有在他们都为 nullptr 的情况下这两个二叉树才等价。如果 root1,root2 的值不相等&#x…

人民网(人民日报官网)投稿方式解读

当今社交媒体风行的时代,人民网作为我国最大的新闻门户网站,扮演着传递信息、引导民意的重要角色。人民网积极鼓励社会各界朋友,尤其是普通民众,分享自己的见闻和观点,通过投稿的方式参与到新闻报道中来。那么&#xf…