锤子眼里全是钉?谈如何对现有系统进行微服务改造

news2024/11/20 13:40:09

 

 

1 什么是微服务架构?

微服务架构,主要是一种思想,并非具体的技术、框架、语言等。核心在于将现有系统拆分为功能明确,内聚性强,职责单一的微小部分,以服务形式对外提供,从而将原来的复杂大系统分而治之,以此降低整体复杂度,达到更好的可控性。

2 现有系统问题是什么,核心问题是什么,核心业务需求是什么?

传统应用系统架构通常为单体应用,表现为单进程,业务逻辑耦合。应用系统随着业务逻辑增加,功能增多,特性增强,会不断填充进新的需求处理逻辑,系统中也会遍布各种补丁式的、面条式的代码。这样,开发人员在面对功能的修改和扩展时,会发现代码理解困难,进一步导致逻辑添加困难,遗留的各种特殊处理逻辑混合,容易代入不易察觉的问题。整个系统的测试也因此变得困难,一个小修改可能需要整体功能的覆盖测试,而且问题不容易测出,隐匿风险大。这种不断填充式的逻辑,还会导致测试用例编写困难,更增加问题潜伏的风险。更进一步,随着代码体积的增加,会导致系统构建编译时间长,学习成本增加,特别是新人很难快速上手,隐形成本大增。随着恶性循环,对旧代码的依赖会越来越强,新的框架语言也很难加入,改造难度增大。整个系统部署风险也很大,需要停用现有系统,无法做到无缝对接,无缝过渡,不利于业务产品的迭代,系统本身升级成本和风险也比较大,如此,带来的是整体运维成本增加。最终,整个系统变得臃肿庞大,成为一个行动迟缓的怪兽,可维护性,可扩展性,灵活性等也再无从谈起。

通过上面问题的介绍,可见微服务对于需求易变的业务类系统,尤其适用。

3 结合微服务改造有什么好处?适不适合用微服务改造?或者说,为什么适合用微服务进行改造?如何改造?

为解决上述传统应用开发维护中的问题,提出了微服务架构思想。微服务的形式及好处如下:

(1)微服务,微表示小,细粒度,这点从名称上直接体现出来。将应用拆成小粒度服务,每个服务单独开发测试部署运维,服务本身还是体现高内聚低耦合特性。一个服务完成一类或者一个特定业务功能。这里涉及到多小才算合适,才算微,这是实践中特别需要把握,重点关注的一个度。

 (2)作为一个服务,本身是可以采用适合该服务特性及贴合其承载业务特点的语言和框架的。服务也可以由单独的团队来构建、开发、测试、维护等等,甚至可以从UI到底层,都由该团队负责了,只要这个服务显著的内聚,低耦合。这样,每个微服务就是轻量级的一个应用了,占用单独的进程资源,可以拥有自己的数据存储,天然支持分布式部署,方便适用集群架构,可灵活扩容增量。可见,这是一种思想的体现。这种方式,对框架和语言的要求放宽了,自然也对团队组建的要求降低了,从而更容易快速上手,更容易快速应对变化,有敏捷的思想包含在里面。

 (3)一个大系统拆分后,肯定会构建成多个微服务。原来是一个整体对外的业务系统,拆分后仍然需要体现这些服务是为一个大整体系统而构建和服务的,每个服务是大系统中的一部分。这种业务需求内生的就要求这些微服务需要交互,通信。微服务之间如何方便、高效、灵活、可靠、可扩展的通信?其实有许多现成方案可供选择。对于分布式、大数据量、异步特点的通信,消息队列是优先选择。对于裸机内、局域网,可采用RPC做同步通信。对于跨平台、跨语言,同步可采用HTTP的RESTfull方案。这些都需要根据具体场景、具体需求、具体分析,因地制宜的实施。

显然,拆分服务后,简化了功能开发,这是分而治之带来的复杂度降低。从面向未来来看,开发可以轻装上阵,新人也比较容易上手,语言框架可以选择最适合的,团队搭建成本降低;修改面对的功能范围会因为单一职责而比较明确;测试也会因为单一职责而受益;更重要的是,因为容器化的构建、部署技术的成熟,整个修改测试上线过程可以实现无缝切换,极大的降低了运维成本。对服务本身而言,因为不担心对现有系统运行的影响,架构扩展可以更加从容,而且基于单一职责和容器部署技术,加之分布式技术的使用,集群搭建更加方便,系统的扩容增量也不再是问题。

但是服务多了后,通信就成为整体系统的制约因素。一方面,跨进程、跨主机、跨语言的通信,比起单体应用内部的直接调用或线程间通信效率要低很多;其次,当服务多了后,通信链条自然就变多了,极端情况,每一个服务都需要同其他所有服务通信,这使得通信链条的调试,问题点的定位,功能的验证变得复杂了;最后,服务增多,服务间通信链路变多后,对服务性能要求会提高,这与服务对外提供接口的形式又存在矛盾。而且,相互调用情况的普遍化会使得整体系统的设计复杂度陡然提升。所以,这一块还是需要综合考虑,整体平衡的。另外,分布式技术本身的复杂度也会从逐渐体现出来,如果不能很好的驾驭这块,反而会成为整个系统的梦魇。

虽然微服务有很多好处,但是我们也看到了,微服务可能带来额外的问题,所以系统适不适合用微服务来改造,还需要看具体存在的问题。如果适合用微服务这个“药”来治,那就坚决将微服务思想贯彻到底,否则,也别勉强,别硬进行微服务化。因为,微服务并不是包治百病的神药。在回答这个问题之前,我们先看看那些地方或那些情况不适合用微服务进行改造,或者说选择微服务解决不了存在的问题。也就是我们需要进一步看看微服务方案存在那些缺点,这些缺点或许会给我们一些启发。俗话说,有得就有失,有利就有弊,要趋利避害。首先,微服务的分布式会带来很大的复杂性问题,如果没有丰富的经验,问题可能会无法收敛,从而导致改造失败。其次,服务调用路径确定,服务间的依赖管理,服务间依赖测试以及性能热点追踪等,每一个都会是改造之路的绊脚石,要有心理准备。再次,跨进程、高通信成本、高运维要求、高组织架构成本(服务之间有通信,组织之间就必然有沟通,资源就必然涉及有协调),也是需要特别关注的。最后,上述问题延伸一下,对实时系统而言,微服务改造可能会带来不可预测的潜在风险。所以说,微服务潜在的适用于大型系统开发,通过上述分析,道理是显而易见的。

因此,对一些不算太复杂,中等程度,已经在团队内磨合维护,运转正常的程序来讲,进行微服务改造要尤为慎重,除非有非常坚定的难以拒绝的理由。

回到问题本身。最后研判后,如果得出适合进行微服务化改造的结论,那么该如何实施?具体方案实施中遇到了那些问题,是如何解决的,这些也是需要好好总结的。这里给出别人的一个微服务改造实践流程:

1 最小修改,移到新的环境中

2 功能剥离,从现有中移动已有接口

3 数据解耦,剥离数据,独立提供服务

4 数据同步

5 迭代替换,业务功能逻辑加数据,等价替换。

下面也是别人在微服务实践过程中总结的有益经验。

四大切分原则:

1 业务先行

2 由粗到细

3 避免耦合

4 持续改进。

四大切分要求:

1 根据业务模块划分服务种类

2 服务独立部署,相互隔离

3 服务间轻量级接口

4 服务高可用,幂等原理

四大特点:

1 服务颗粒化

2 责任单一

3 运行隔离

4 自动管理

四大挑战:

1 运维要求高

2 分布式复杂性

3 服务依赖强

4 通信成本高

作为一个微服务架构师,系统改造专家,既需要全面通透的理解原系统,从而可以庖丁解牛式的分解原系统,也需要吃透微服务的精髓,以便高瞻远瞩的布局新系统。

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

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

相关文章

SpringBoot 通过@Profile注解配置多环境

参考资料 Springboot中的Profile注解 目录 一. 使用场景二. 前期准备三. Profile注解作用于类上3.1 配置类3.2 效果 四. Profile注解作用于方法上4.1 定义一个生产环境的注解4.2 配置类4.3 效果 一. 使用场景 在Spring中,可以使用配置文件的方式来指定不同环境下所…

让AI写今年高考作文,满分60你给AI打多少分呢?

随着高考的落幕,各地高考作文已成为我们讨论的话题。 下面是2023年全国甲卷作文题目 我们就让AI根据要求,写上两篇作文。作文标题也是AI起的 一 、① 标题:与时间赛跑,不为时间所困 ​ 时间,这位无情的审判长&#…

知识点滴 - Tumble test和Drop test

翻滚测试(Tumble test)和跌落测试(Drop test)是十分重要的方法,用于评估产品的维持功能的能力,针对的是当产品在终端用户手中的整个生命周期中经历许多碰撞和刮擦的情况。 跌落测试的随机性较强,而跌落测试可以控制跌落方向、撞击点等。 翻滚…

将一个正整数分解质因数(Java)

题目:将一个正整数分解质因数。例如:输入1023,打印出10233*11*31。 目录 1、解题思路 2、程序代码 3、程序输出 1、解题思路 从最小的质数开始,不断地将输入的正整数进行分解,直到无法再分解为止。具体实现方法为:从…

Flutter调用Rust代码操作指南

在之前的利用Rust与Flutter开发一款小工具文章中,我们使用Rust代码实现了一个简单的WebSocket发送功能。也在Rust库交叉编译以及在Android与iOS使用这篇中介绍了Rust库的打包以及双端的使用。 今天我们继续用之前WebSocket的代码举例,来介绍如何在Flutt…

chatgpt赋能python:Python怎么取出换行的数据?

Python怎么取出换行的数据? 在数据分析和处理中,我们常常需要从文件中读取数据,特别是当数据量很大时更是如此。在Python中,读取文本文件中的数据很简单,但是有时候读取的文本文件中可能含有换行符,这可能…

5.DIY可视化-拖拽设计1天搞定主流小程序-公告管理

1.DIY可视化-拖拽设计1天搞定主流小程序-公告管理 公告管理-本教程均在第一节中项目启动下操作 1.DIY可视化-拖拽设计1天搞定主流小程序-公告管理2.创建数据表执行: php think diygw:tableandapi oneHdp 3. 复制幻灯片界面进行编辑4.修改后台API5.富文本添加6.验证 :访问url : …

linux下动态链接过程

序 总是在工作中会遇到符号表,链接等字眼,之前看过《程序员自我修养》这本书,但是基本上都忘记了,这几天再刷一遍,顺便记录一下,加深记忆。 本文会完整的描述程序运行的动态加载及运行的整个流程&#xff…

大学生心理健康APP的设计与实现

摘 要:大学生群体本该是象牙塔中的学习者,是祖国未来的支柱,是民族复兴的期望所在,但是近几年大学生心理健康问题日益严峻,例如情感问题,原生家庭的问题,学业问题,与同学相处所带来…

【ps】photoshop 入门

文章目录 Adobe Photoshop 安装快捷键照片裁剪保存/导出图片复制图层新建图层及颜色填充人物轮廓调整、增高颅顶人物瘦脸、缩小鼻翼、丰唇、放大眼睛人物祛痘/祛斑背景杂质去除图像提亮调色工具 Adobe Photoshop 安装 参照 【Adobe Photoshop 2023 v24.3.0【附安装破解教程】中…

串口通讯,三种数据传输方式介绍

前言 (1)备考微机原理,这里就把这个知识点分享给和我一样不认真上课的同学们。 (2)虽然在我的STM32串口通讯的教程里面已经有描述这部分的内容了。但是担心有些人只是想单纯的了解这个知识点,所以我就又单独…

【工具】putty下载、安装、使用和常用设置教程

一,Putty简介 Putty是一个远程登录工具,适用于 Windows 和 Unix 平台的Telnet、SSH和 RLOGIN客户端。 跨平台支持:PuTTY 可以在多个操作系统上运行,包括 Windows、Linux、Mac 等,使得在不同的平台上使用相同的工具成为…

YOLOV1——你总能在这找到你想要的答案

目录 一:前言 与传统的RCNN的区别在哪? 二:YOLO-V1中心思想 三:计算损失 (1):位置损失 为什么高宽要加上根号的损失? (2):置信度损失 &a…

一次虚拟机centos7系统崩溃恢复记录

前两天,因为单独断开电源测试网络,结果不知道为什么,两台虚拟机中一台就出现紧急状态,看日志是下面情况 通过网上一些资料,说可以通过xfs_repair -v -L /dev/dm-0来修复,但这次我这里没有相关 看这个mappe…

【Docker】docker部署前Springboot-vue后端分离项目【实战篇】

文章目录 1、docker 安装jdk2、docker 安装mysql通过Docker命令进入Mysql容器内部初始化数据sqlDbx连接查看 3、docker build构建后端镜像修改配置数据库JDBC链接IP为虚拟机服务器IPmaven clean package打包后端jar并上传到服务器编写Dockfilebuild 构建查看构建的后端镜像app …

AAOS系列之音量设置

文章目录 前言UI 处理流程音量键的响应流程AudioService设置音量流程AAOS音量条选项总结 前言 AAOS音量设置内容可以分为几个部分 音量的ui响应流程legacy模式dynamic模式通过按键进行设置 AAOS 音量设置比通用的Android系统复杂,表现在两个方面。首先是UI响应上…

chatgpt赋能python:如何取出带有4的整数

如何取出带有4的整数 Python是一门功能强大的编程语言,可以轻松解决复杂的编程问题。在本文中,我们将介绍如何使用Python编程语言从一个整数列表中取出所有带有4的整数。我们将从介绍如何创建一个整数列表开始,然后编写Python代码以实现我们…

Unreal 5 实现丢弃武器功能

之前实现了物品的拾取功能,但是没有实现丢弃功能,这一篇讲一下我是如何实现丢弃功能的。 丢弃功能的逻辑是:拾取物品时,需要使用拾取的物品进行类的实现,所以,我们需要把数据存储到拾取的物品上&#xff0c…

4.DIY可视化-拖拽设计1天搞定主流小程序-后台设计幻灯

后台设计幻灯:本教程均在第一节中项目启动下操作 1.首页幻灯片php安装:phpthink安装: 2.数据库创建:幻灯片表:项目根目录下cmd :执行 : php think diygw:tableandapi oneHdp查看结果目录:访问url: http://one.com/one/api.hdp/list 3.界面增删…

【6.10 代随_53day】 最长公共子序列、不相交的线、最大子数组和

最长公共子序列、不相交的线、最大子数组和 最长公共子序列动态规划方法图解步骤代码 不相交的线动态规划方法 最大子数组和图解步骤代码 最长公共子序列 力扣连接:1143. 最长公共子序列(中等) 动态规划方法 确定递推公式 主要就是两大情况…