为什么要将应用微服务化?

这篇具有很好参考价值的文章主要介绍了为什么要将应用微服务化?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

其实在十多年前,“架构师”并不是一个需求很大的职业,一来那时还没有“全民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包分布式系统来说是个噩梦,好不容易等到了发布窗口,各个团队牟足了劲把所有变更都发布了出去,结果因为其中某个小改动引发的问题,导致全部回滚。又要苦苦等待下一个发布窗口。

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

技术前沿拓展

前端开发,你的认知不能仅局限于技术内,需要发散思维了解技术圈的前沿知识。细心的人会发现,开发内部工具的过程中,大量的页面、场景、组件等在不断重复,这种重复造轮子的工作,浪费工程师的大量时间。

介绍一款程序员都应该知道的软件JNPF快速开发平台,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。

这是一个基于 Java Boot/.Net Core 构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,实现快速开发,提升工作效率;框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用;后端框架支持 Vue2、Vue3。如果你有闲暇时间,可以做个知识拓展。

看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~文章来源地址https://www.toymoban.com/news/detail-802075.html

到了这里,关于为什么要将应用微服务化?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • xxl-job服务化

    xxl-job作为服务,之前使用都是每个服务配置信息,采用方法的形式,xxl-job作为服务的话,只需要进行配置 配置信息 xxl-job创建任务 xxl-job相关输入 clientClass 实现类 clientMethod 调用的方法 加参数,比如用户为张三,年龄18 ,\\\"name\\\":\\\"张三\\\",\\\"age\\\":18 JobHandler:CommonXxlJobHandler 任务参数:

    2024年02月06日
    浏览(42)
  • springboot + activiti实现activiti微服务化

    本文介绍如何将springboot+activiti进行整合,并配合eureka,zuul和feign实现activiti的微服务化,将流程控制和业务逻辑分离. 并实现了几个比较特殊的功能,比如时间段委托(某人请假或出差,出差时间内,所有待办交给被委托人处理),比如节点的无限级加签功能(流程本身有不确定性,临时增加

    2024年02月09日
    浏览(39)
  • PaddleOCR 服务化部署(基于PaddleHub Serving)

    最近用到百度飞桨的 PaddleOCR,研究了一下PaddleOCR的服务化部署,简单记录一些部署过程和碰到的问题。 基础环境 paddlepaddle 2.5.2 python 3.7 paddlehub 2.1.0 PaddleOCR 2.6 pip 20 部署过程中也尝试多次,不同版本遇到的问题不尽相同,这里选取其中一组进行部署说明 使用 docker部署 paddl

    2024年03月09日
    浏览(42)
  • 【架构设计】单体软件向微服务化演变

    假设单体软件的各模块如下,其中服务包含许多功能模块,如用户管理模块、商品模块、订单模块、仓库模块; 服务化是指对单体服务进行拆分,将一个服务软件拆分为多个相互关联的服务,他们之间相互协作,能正常完成原单体服务的所有业务。 服务化后,有如下优点:

    2024年01月17日
    浏览(83)
  • 分布式、服务化的ERP系统架构设计

    ERP 之痛        曾几何时,我混迹于电商、珠宝行业4年多,为这两个行业开发过两套大型业务系统(ERP)。作为一个ERP系统,系统主要功能模块无非是订单管理、商品管理、生产采购、仓库管理、物流管理、财务管理等等。作为一个管理系统,大家的一般开发习惯就是使用

    2024年02月11日
    浏览(56)
  • 【flask】python使用flask发布http服务对算法服务化封装

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 随着应用场景的变化,某些场景中需要调用python的算法对B/S或C/S结构的项目进行支撑,为了将算法服务化,可以使用flask框架对算法进行服务发布,避免不同系统调用算法时进行多次算法的部署以及代码

    2024年04月16日
    浏览(56)
  • PaddleOCR 使用 FastDeploy 服务化部署及postman、java调用服务的方法

    目录 服务化部署 postman调用 java调用 题外话 部署这块大部分按着官方文档来做就差不多 PaddleOCR/deploy/fastdeploy/serving/fastdeploy_serving at dygraph · PaddlePaddle/PaddleOCR · GitHub 提一下两个需要注意的点。 一、如果跟我一样选择的是cpu的版本,那么修改config.pbtxt配置文件时不仅得按官方

    2024年02月08日
    浏览(40)
  • GroundingDINO(一种开集目标检测算法)服务化,根据文本生成检测框

    最近发现一个叫GroundingDINO的开集目标检测算法,所谓开集目标检测就是能检测的目标类别不局限于训练的类别,这个算法可以通过输入文本的prompt然后输出对应的目标框。可以用来做预标注或者其他应用,比如我们要训练某个细分场景的算法时,我们找不到足够的已经标注的

    2024年02月06日
    浏览(49)
  • AI架构师必知必会系列:模型部署与服务化、Mass架构设计方案详解和代码实战指南

    作者:禅与计算机程序设计艺术

    2024年02月05日
    浏览(60)
  • 百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 基于 Paddle Serving快速使用(服务化部署 - Docker)

    目录 安装 Docker 安装 PaddleOCR 安装 准备PaddleServing的运行环境, 模型转换 Paddle Serving pipeline部署 重启 测试 百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 预测部署简介与总览 百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 Paddle Inference 模型推理(离线部署) 百度飞桨(Paddl

    2024年02月07日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包