微服务架构思考

news2024/12/29 14:19:30

时间:2024年06月16日

作者:小蒋聊技术

邮箱:wei_wei10@163.com

微信:wei_wei10

音频地址:

https://xima.tv/1_HvQZkj?_sonic=0icon-default.png?t=N7T8https://xima.tv/1_HvQZkj?_sonic=0

大家好,欢迎来到小蒋聊技术,小蒋准备和大家一起聊聊技术的那些事。

今天小蒋准备和大家一起聊的技术就厉害了!那就是微服务!

  • 简介

随着企业业务规模的不断扩大,传统的单体架构已经难以满足现代企业的需求。微服务架构作为一种经过良好架构设计的分布式架构方案,为企业提供了全新的解决方案。

  • 产生原因

服务架构的演变,并不是偶然,它是由诸多因素共同驱动的,比如要解决的问题规模团队采用的技术栈追求更快速的交付希望保证可维护性可扩展性可伸缩性,等等。这些因素决定了我们必须要在软件架构上进一步优化,才能应对面临的挑战。

概括来说,软件服务架构经历了单体架构SOA架构微服务架构这几种形式。

  • 微服务架构的演变

单体架构

单体架构,指的是在一个应用程序中打包业务场景涉及到的所有功能。例如将一个电商系统完整打包在一个WAR包,然后在Web容器中运行。

当软件规模不是很大的时候,单体架构是比较合适的,开发、测试、部署、监控等相对来说也是比较方便的。但是随着软件规模的扩大,问题会变得越来越复杂。

  1. 系统启动慢,由于一个进程包含了所有的业务逻辑,涉及的启动模块过多,导致系统的启动,重启周期变长。
  2. 随着系统的发展,业务越来越复杂,单体应用的代码量会越来越大。这就使得在某一模块需要变动时,可能会影响到整个系统,带来很大的维护成本和风险。
  3. 对应用程序做任何细微的修改都需要将整个应用程序重新构建、重新部署,带来了不少额外的工作量。
  4. 单体架构通常为垂直扩展,也就是只能通过增加硬件资源的方式来提升系统性能,但这种方式的提升空间有限。
  5. 难以灵活地扩展或缩小单个功能模块。如果某个模块需要更大的计算资源,而其他模块不需要,单体架构无法单独扩展该模块。
  6. 单体架构中所有的模块都在一个应用中,这就导致所有模块都被限制在同一个技术栈中,很难引入新技术。

单体架构有它的简单的优势,但是,企业在选型时还是需要结合业务场景、系统复杂度、未来支撑业务量级,等等,对软件架构做出更科学合理的选型和规划。

分布式架构

为了解决大型软件系统开发中的问题,在单体架构的基础上进行进一步的优化。按照业务功能对原有软件进行垂直拆分,拆分得到多个边界清晰的业务子系统,每个业务子系统依然采用单体架构,每个子系统都可以分布式部署。

和单体架构相比,分布式架构它已经能够按功能进行更细粒度的划分,并且各个子系统能够更细粒度地伸缩。不同的子系统可以交由不同的团队来进行维护,如果需要可以选择不同的技术栈,开发、测试、部署也更顺畅。

分布式架构一定程度上解决了单体架构的不足,但是它仍然存很多问题。比如,按子系统功能垂直拆分粒度过于粗放,各个子系统之间存在数据冗余, 架构设计起来会变得异常复杂,等等。

SOA架构

SOA架构(Service-Oriented Architecture,面向服务的架构),是在分布式架构基础上的进一步优化。将一些公共的基础服务提炼出来,以接口的形式暴露出来给其他服务调用,如将用户管理、单点登录等功能提取出来作为基础服务供各个子系统调用。

各个子系统通过企业服务总线ESB与其他子系统进行交互,具体的可以是通过Web Service、RPC来实现。

SOA架构进一步解决了分布架构存在的问题,它可以将一些公共的功能提炼为基础服务,提高功能复用性,同时这些基础服务、各个子系统也可以进行更细粒度的伸缩,同时,采用ESB也减少了整个系统中服务与服务之间的耦合。

SOA架构也并非就是完美的,比如逻辑层和服务层之间的边界如果拿捏不准,可能导致抽取的基础服务的粒度过大,导致逻辑层过多依赖服务层,耦合严重。另外,引入ESB进一步简化了系统集成的问题,降低了不同服务之间的耦合,但是系统大了之后,各个服务接口的协议也变多,ESB需理解这些协议才能执行后续的订阅分发、转发等操作,协议的维护会变得困难。

微服务架构

微服务架构中对公共功能进行提炼,提炼成一些更细粒度的服务,并以接口的形式对外提供服务。这里的更细粒度的服务,即微服务。

微服务架构和SOA架构有些接近,但微服务架构和SOA还是有区别的。SOA侧重于系统的集成,微服务架构的核心思想就是按照服务功能进行最小粒度拆分。不同的微服务可以由不同的团队负责,根据需求开发人员也可以更自由地选择合适的技术栈进行开发。各个微服务都可以快速迭代、测试、上线,也有助于提高研发效率。

微服务并不是说按照功能把服务粒度拆的更细之后就结束了,它还面临着一系列运维上的挑战。相比单体应用,微服务架构的服务数量多了很多,如何合理有效地管理、监控这么多微服务也是一项巨大的挑战,同时还要考虑对于分布式事务的处理。

  • 单体架构与微服务对比

单体架构(Monolithic Architecture VS  微服务架构(Microservices Architecture

单体架构

微服务架构

单体架构被认为是构建应用程序的传统架构方式。单体应用程序是作为一个不可分割的单元构建的。通常,这种解决方案包括客户端用户界面,服务器端应用程序和数据库。

单体架构应用程序是一个统一的整体,而微服务架构则将其分解为较小的独立单元的集合。

在微服务架构中,功能被分解为可独立部署的模块,这些模块通过远程调用方法相互通信。每个服务都涵盖了自己的范围,每个服务可以独立更新,部署和扩展。

简而言之,微服务架构风格是一种将单个应用程序拆分为一组小服务的方法,每个小服务都在自己的进程中运行并使用轻量级机制(通常是HTTP资源API)进行通信。 ----马丁·福勒

单体架构(Monolithic Architecture VS  微服务架构(Microservices Architecture

单体架构优势

  1. 使用成本低:上手容易,学习成本低,通常技术栈比较简单。
  2. 部署简单:易于部署,单体应用部署的复杂度要比微服务低得多。
  3. 易于开发:适合小型团队开发“小而美”的,对业务复杂度不高,对应用扩展能力要求不高的应用程序架构。

微服务架构优势

  1. 独立组件:首先,所有服务都可以独立部署和更新,从而提供了更大的灵活性。比如:针对IO密集型服务增加内存,针对计算密集型服务增加服务器的CPU,等等,达到资源的合理分配。
  2. 业务关注更加集中:将应用程序分解为更小和更简单的组件后,将更易于业务关注理解和管理。您只需专注于与您的业务目标相关的特定服务即可。所以:很多大厂都是面试造火箭,工作拧螺丝。因为微服务化只需要开发人员更专注于自己的服务领域。生产线尽管很庞大,但是只要拆分合理,开发人员只需要拧好自己的“微服务螺丝”就可以了。
  3. 更好的可扩展性:微服务另一个优点是每个服务都可以独立缩放。结合容器化编排管理(k8s、docker等),可以快速的实现服务的扩容与缩放。比如:赶上双十一,电商可以快速地增加部署微服务数量以应对更多的并发需求。待高峰过后,可以将微服务容器释放,回收资源。
  4. 选择技术的灵活性:工程团队不受一开始就选择的技术的限制。他们可以自由地为每个微服务应用各种技术和框架。只要保证接口通信协议一致即可。

单体架构(Monolithic Architecture VS  微服务架构(Microservices Architecture

单体架构缺点

  1. 开发复杂度逐步增加:随着应用需求的增加以及规模的扩大,由于其代码耦合度高,单体应用自身的代码复杂度会很高,从而变得难以维护。
  2. 维护成本高:修改任何一处细节的代码,都会影响整个系统。因此必须全面协调开发、测试、部署。这使软件迭代变的很慢,交付的效率低。
  3. 扩展性差:很难去针对某个模块进行扩展,只能针对整个应用程序扩展。IO密集型和计算密集型模块混合在一起,无法独立升级及扩容。
  4. 引入新技术困难:新技术壁垒,在单体应用程序中应用新技术极其困难,因为这样就必须重写整个应用程序。

微服务架构缺点

  1. 开发复杂度增加:由于微服务架构是分布式系统,因此会产生分布式的数据库操作及分布式事务等复杂度更高的开发需求。所以一定要进行合理的微服务拆分,合理的确定服务边界,保证服务内部高内聚,降低分布式事务等操作出现的概率。
  2. 额外关注:微服务由于其多主机、分布式部署,所以它们需要很多的额外关注,如统一配置,统一日志记录,统一的指标监控,统一的运行状况检查等。
  3. 测试难度高:虽然单个微服务的测试复杂度降低,但是众多可独立部署的服务使集成测试变的更加困难。

  • 企业如何选择最适合的架构?

选择单体架构

  1. 小团队:如果您是一家初创公司,而您的团队很小,则可能不需要处理微服务架构的复杂性。整体组件可以满足您的所有业务需求,因此无需选择微服务架构。
  2. 一个简单的应用程序:不需要大量业务逻辑,小型应用程序与单体应用架构可以更好地协作。
  3. 没有微服务专业知识:微服务需要深厚的专业知识才能运作良好并带来业务价值。如果您想从头开始没有任何技术专业知识的微服务应用程序,那么很可能不会成功。
  4. 快速应用:如果您要开发应用程序并尽快应用它,则单体应用架构是更好的选择。当您的公司打算花最少的钱验证您的经营理念时,它会很好地发挥作用。

选择微服务架构

  1. 用户数量或应用规模庞大:微服务架构使扩展和添加新功能变得更加容易。因此,如果您打算开发具有多个模块和高用户体验的大型并发应用程序时,那么微服务架构可能是您的最佳选择。
  2. 团队庞大并有足够的技能:由于微服务项目由负责多个服务的多个团队组成,因此您需要有足够的资源来处理所有流程。包括人力(技术人员)、物力(服务器)、财力等等。
  3. 具有微服务专业知识:没有适当的技能和知识,构建微服务应用程序将具有极大的风险。但是仅具有架构知识还不够,还需要有DevOps和Containers专家。此外,必须具有领域建模专业知识。处理微服务意味着将系统拆分成单独的功能并划分职责,合理的划分成就效能,不合理的划分导致灾难。

总结

微服务架构作为一种创新的软件架构模式,为企业数字化转型提供了有力支持,但想要真的用好并发挥价值其实并不容易。

软件服务架构的演变过程及原因,从单体架构、分布式架构、SOA架构,到如今流行的微服务架构。每一种架构模式,都有其问题背景,也存在一定的局限性,企业需要根据自身的业务特点及公司自身情况合理的进行应用技术架构的选型。

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

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

相关文章

Vue - 实现登录页面

1、技术框架 1、技术框架Vue-Cli Vue3.0 2、界面推荐大小: 1920 * 1080 3、UI组件:elementui 4、icon: element-plus/icons-vue 5、node版本:v20.14.0 2、效果图 3、源代码部分截图 4、其他 有需要的请联系作者。需要购买,不白…

ABBYY Finereader 15软件安装包下载

软件简介: FineReader PDF提供实用、简易的工具,将纸质文档和PDF结合起来,提高了数字工作场所的效率。 FineReader 15最大特色是采用了ABBYY最新推出的基于AI的OCR技术,可以更轻松地在同一工作流程中 对各种文档进行数字化、检索…

明日周刊-第13期

在这期间发生了很多的事,导致拖更了一周。接下去努力不断更,哈哈哈希望如此。配图是最近上映的一部电影《狗阵》的海报,看完之后感悟颇深,希望大家都能去电影院感受一下。 文章目录 一周热点资源分享言论歌曲推荐 一周热点 最近一…

跨语言翻译的突破:使用强化学习与人类反馈提升机器翻译质量

在人工智能领域,知识问答系统的性能优化一直是研究者们关注的焦点。现有的系统通常面临知识更新频繁、检索成本高、以及用户提问多样性等挑战。尽管采用了如RAG(Retrieval-Augmented Generation)和微调等技术,但它们各有利弊&…

类Copy方法:BeanUtils.copyProperties

类Copy方法:BeanUtils.copyProperties 需求场景 比如有时候我们想要把数据库里面的数据导出到excel表中,比如想要把数据库中的用户数据导出到excel表格中; 假设我们程序代码中与数据库对接的实体类是User,用于展示到前端的实体类…

aarch64系统中给qt编译的可执行程序加上图标

在qt中编译的可执行程序图标是默认是一种格式 而且无法替换改图标,看起来不够美观,可以使用.desktop的链接文件来链接编译的执行程序,通过点击.desktop图标来去运行可执行程序。 实现步骤: 创建一个以.desktop结尾的文件并记得给…

Es 索引查询排序分析

文章目录 概要一、Es数据存储1.1、_source1.2、stored fields 二、Doc values2.1、FieldCache2.2、DocValues 三、Fielddata四、Index sorting五、小结六、参考 概要 倒排索引 优势在于快速的查找到包含特定关键词的所有文档,但是排序,过滤、聚合等操作…

室内定位技术解析:蓝牙信标在室内导航中的应用

室内定位技术,作为现代导航领域的重要突破,解决了GPS在室内空间定位的局限,为我们提供了一种全新的空间认知和利用方式。本文将以蓝牙技术为例,深入解析室内定位的工作原理、关键技术和系统构成,以及在现代导航中的应用…

库的制作 与 使用 (Linux下)

目录 动静态库的制作 前置知识 库的基本构造 问题 分析 要给什么文件 如何更好的让别人使用 库的生成 静态库的生成 makefile参考 动态库的生成 makefile参考(包含动态库和静态库生成) 库的使用 法一:放入系统路径 弊端 法二…

【MATLAB】语法

MATLAB 基本语法(%{和%}) 赋值 函数名值&#xff1b;for for i1:10循环语句 end//while x0; sum0; while x<100sumsumx;x; end//if if x > 1f x^2 1; elsef 2 * x endswitch onum input(请输入一个数); switch num case -1 //注意case后面没有冒号disp(I am…

[Linux] TCP协议介绍(3): TCP协议的“四次挥手“过程、状态分析...

TCP协议是面向连接的 上一篇文章简单分析了TCP通信非常重要的建立连接的"三次握手"的过程 本篇文章来分析TCP通信中同样非常重要的断开连接的"四次挥手"的过程 TCP的"四次挥手" TCP协议建立连接 需要"三次握手". "三次挥手&q…

英伟达开源最强通用模型Nemotron-4 340B

英伟达的通用大模型 Nemotron&#xff0c;开源了最新的 3400 亿参数版本。 本周五&#xff0c;英伟达宣布推出 Nemotron-4 340B。它包含一系列开放模型&#xff0c;开发人员可以使用这些模型生成合成数据&#xff0c;用于训练大语言模型&#xff08;LLM&#xff09;&#xff0…

【CICID】GitHub-Actions语法

[TOC] 【CICID】GitHub-Actions语法 1 场景 ​ 当我们开发过程中&#xff0c;经常需要提交代码&#xff0c;打包&#xff0c;部署新代码到对应的环境&#xff0c;整个过程都是人工手动操作&#xff0c;占据开发人员大量时间&#xff0c;并且很繁琐容易出错。所以需要借助一些…

奥特曼谈AI的机遇、挑战与人类自我反思:中国将拥有独特的大语言模型

奥特曼在对话中特别提到&#xff0c;中国将在这个领域扮演重要角色&#xff0c;孕育出具有本土特色的大语言模型。这一预见不仅彰显了中国在全球人工智能领域中日益增长的影响力&#xff0c;也预示着未来技术发展的多元化趋势。 ①奥特曼认为AI在提升生产力方面已显现积极作用&…

蔡崇信“预言”:微软与OpenAI未来极有可能会分道扬镳

近日&#xff0c;在美国投行摩根大通于上海举行的第二十届全球中国峰会上&#xff0c;阿里巴巴集团联合创始人、董事局主席蔡崇信与摩根大通北亚区董事长兼大中华区投资银行业务副主席关金星&#xff08;Kam Shing Kwang&#xff09;进行了一场精彩对话。蔡崇信深入分享了他对公…

【LVGL】Guider 界面分析

文章目录 前言架构创建 UI切换界面空间释放分析创建页面空间变化 前言 分析Gui Guider-1.7.2-GA 生成的 LVGL 界面切换&#xff0c;资源管理等处理 架构 所有控件存放于同一个结构体 lv_ui 内&#xff0c;每个页面都至少包含 screen_xxx 和 screen_xxx_del 两个成员 typede…

C语言:文件系统

一、目录和文件 在当前目录下使用touch 创建一个名为 -a的文件: touch -a ; // 错误&#xff0c; touch -- -a//正确 touch ./-a 正确 ls -n可以看到对象的用户id&#xff0c;可以在/etc/passwd中查看&#xff0c;/etc/group可以看到组号 获取文件属性 #include <sys/ty…

苹果加大AI布局,上海新店开业昭示中国市场新动向

随着全球科技巨头纷纷进军人工智能领域&#xff0c;苹果公司亦不甘示弱&#xff0c;近期在上海静安新店的开业以及CEO蒂姆库克的一系列动作&#xff0c;都显示出苹果在AI方面的雄心壮志。这不仅是对未来技术趋势的积极回应&#xff0c;更是对市场竞争态势的精准把握。 库克的访…

Gone框架介绍26 - Gone v1.x 版本 正式发布,更加强大的依赖注入,更加卓越的执行效率

gone是可以高效开发Web服务的Golang依赖注入框架 github地址&#xff1a;https://github.com/gone-io/gone 文档地址&#xff1a;https://goner.fun/zh/ 文章目录 优化和新特性gone 核心功能增强内置Goners覆盖测试 后续计划 优化和新特性 gone 核心功能增强 重构了函数参数依…

Qt项目天气预报(1) - ui界面搭建

ui中部 效果演示 ui效果 显示效果 控件列表 配合右图查看 居中对齐-label 设置label居中对齐(别傻傻的空格对齐了) 间距配置 widget03 外围的widget对象: 包含label 和 widget0301&#xff0c;如下图 widget0301 内围的widget对象&#xff0c;如下图 样式表 widget03 …