单体应用与微服务的优缺点

单体应用与微服务的优缺点

单体应用(monolith application)就是将应用程序的所有功能都打包成一个独立的单元,可以是 JAR、WAR、EAR 或其它归档格式。

随着业务需求的快速发展变化,敏捷性、灵活性和可扩展性需求不断增长,迫切需要一种更加快速高效的软件交付方式。微服务就是一种可以满足这种需求的软件架构风格。单体应用被分解成多个更小的服务,每个服务有自己的归档文件,单独部署,然后共同组成一个应用程序。这里的“微”不是针对代码行数而言,而是说服务的范围限定到单个功能。微服务有如下特点:

  • 领域驱动设计:应用程序功能分解可以通过 Eric Evans 在《领域驱动设计》中明确定义的规则实现;每个团队负责与一个领域或业务功能相关的全部开发;团队拥有全系列的开发人员,具备用户界面、业务逻辑和持久化存储等方面的开发技能;
  • 单一职责原则:每个服务应该负责该功能的一个单独的部分,这是 SOLID 原则之一;
  • 明确发布接口:每个服务都会发布一个定义明确的接口,而且保持不变;服务消费者只关心接口,而对于被消费的服务没有任何运行依赖;
  • 独立部署、升级、扩展和替换:每个服务都可以单独部署及重新部署而不影响整个系统。这使得服务很容易升级,每个服务都可以沿着《Art of Scalability》一书定义的 X 轴和 Z 轴进行扩展;
  • 可以异构 / 采用多种语言:每个服务的实现细节都与其它服务无关,这使得服务之间能够解耦,团队可以针对每个服务选择最合适的开发语言、持久化存储、工具和方法;
  • 轻量级通信:服务通信使用轻量级的通信协议,例如,同步的 REST,异步的 AMQP、STOMP、MQTT 等。

单体应用与微服务是两种不同的软件架构模式,它们各自具有一些优点和缺点。

单体应用的优缺点

单体应用的优点:

  1. 简单易用:对于小型项目或团队来说,单体应用架构简单、直观,易于理解和上手。它将所有功能都集成在一个应用中,使得开发、测试、部署和维护都变得相对简单。
  2. 部署方便:单体应用通常只需要部署一个应用包,而不需要考虑多个服务之间的依赖和通信问题。这使得部署过程更加简单和快速。
  3. 调试容易:由于代码都集中在一个应用中,调试和排查问题相对容易。开发人员可以更容易地找到问题的根源并进行修复。
  4. 为人所熟知:现有的大部分工具、应用服务器、框架和脚本都是这种应用程序;
  5. IDE友好:像 NetBeans、Eclipse、IntelliJ 这些开发环境都是针对开发、部署、调试这样的单个应用而设计的;
  6. 便于共享:单个归档文件包含所有功能,便于在团队之间以及不同的部署阶段之间共享;
  7. 易于测试:单体应用一旦部署,所有的服务或特性就都可以使用了,这简化了测试过程,因为没有额外的依赖,每项测试都可以在部署完成后立刻开始。

单体应用的缺点:

  1. 复杂性高:随着业务的发展和功能的增加,单体应用的代码库会变得越来越庞大和复杂。这可能导致代码质量下降、可维护性降低以及开发效率下降。
  2. 可扩展性差:单体应用通常难以进行水平扩展,因为它将所有功能都集成在一个应用中。如果需要增加更多的处理能力或存储容量,可能需要升级整个应用或购买更强大的服务器。
  3. 可靠性低:由于单体应用将所有功能都集成在一个进程中,如果一个模块出现问题,整个应用都可能会受到影响。此外,由于代码之间的紧密耦合,一个模块的修改可能会影响到其他模块的正常运行。
  4. 不够灵活:对应用程序做任何细微的修改都需要将整个应用程序重新构建、重新部署。开发人员需要等到整个应用程序部署完成后才能看到变化。如果多个开发人员共同开发一个应用程序,那么还要等待其他开发人员完成了各自的开发。这降低了团队的灵活性和功能交付频率;
  5. 妨碍持续交付:单体应用可能会比较大,构建和部署时间也相应地比较长,不利于频繁部署,阻碍持续交付。在移动应用开发中,这个问题会显得尤为严重;
  6. 受技术栈限制:对于这类应用,技术是在开发之前经过慎重评估后选定的,每个团队成员都必须使用相同的开发语言、持久化存储及消息系统,而且要使用类似的工具,无法根据具体的场景做出其它选择;
  7. 技术债务:“不坏不修(Not broken,don’t fix)”,这在软件开发中非常常见,单体应用尤其如此。系统设计或写好的代码难以修改,因为应用程序的其它部分可能会以意料之外的方式使用它。随着时间推移、人员更迭,这必然会增加应用程序的技术债务。

微服务的优缺点

微服务的优点:

  1. 高可扩展性:微服务架构允许将应用拆分成多个独立的服务,每个服务都可以独立地进行扩展和升级。这使得应用可以根据需要灵活地增加或减少处理能力或存储容量。
  2. 高可靠性:每个微服务都是独立的进程,它们之间通过轻量级的通信机制(如REST API或消息队列)进行通信。这使得一个服务的故障不会影响到其他服务的正常运行。此外,由于每个服务都是独立的,可以更容易地进行故障隔离和恢复。
  3. 技术选型灵活:每个微服务都可以使用最适合的技术栈进行开发,这使得团队可以根据需要选择最适合的技术来解决特定问题。
  4. 易于开发、理解和维护;
  5. 比单体应用启动快;
  6. 局部修改很容易部署,有利于持续集成和持续交付;
  7. 故障隔离,一个服务出现问题不会影响整个应用;
  8. 不会受限于任何技术栈

微服务的缺点:

  1. 开发难度大:微服务架构需要更多的开发人员来管理和维护多个独立的服务。此外,由于服务之间的通信是异步的,开发人员需要处理更多的网络问题和并发问题。
  2. 运维成本高:微服务架构需要更多的服务器和基础设施来支持多个独立的服务。此外,由于服务之间的通信是异步的,需要更多的监控和日志记录工具来确保服务的正常运行和故障排查。
  3. 数据一致性问题:在微服务架构中,数据通常被分散在多个服务中,这可能导致数据一致性问题。需要采取一些措施(如分布式事务、数据总线等)来确保数据的一致性。

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

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

相关文章

Window GDI+ API有BUG?GetBounds测不准?

文章目录 GraphicsPath的GetBounds测不准?方法一:GetBounds ()实战 方法二:GetBounds(Matrix)实战 GraphicsPath的GetBounds测不准?实战 .NET 版本的问题?C也一样,不是.NET的问题怀疑人生MiterLimit惹得祸完美结果结束…

MyBatis-Plus介绍及Spring Boot 3集成指南

我们每个Java开发者都在使用springbootmybatis开发时,我们经常发现自己需要为每张数据库表单独编写XML文件,并且为每个表都需要编写一套增删改查的方法,较为繁琐。为了解决这一问题,MyBatis-Plus应运而生。在本文中,我…

第七节:带你全面理解vue3: 其他响应式进阶API

前言: 针对vue3官网中, 响应式:进阶API 中, 我们在上一章中给大家讲解了shallowRef, shallowReactive, shallowReadonly几个API的使用. 本章主要对剩下的API 进行讲解, 我们先看一下官网中进阶API 都有那些 对于剩下这些API, 你需要了解他们创建目的, 是为了解决之前的API存在…

查看cpu进程数

import multiprocessing from multiprocessing import Pool# 导入 Pool 允许你创建一个进程池 # 进程池是一组工作进程,它们可以并行地执行多个任务# multiprocessing.cpu_count(): 返回当前机器上的CPU核心数 sum_cpu multiprocessing.cpu_count()use_cpu max(1,…

LLM多模态——GPT-4o改变人机交互的多模式 AI 模型应用

1. 概述 OpenAI 发布了迄今为止最新、最先进的语言模型 – GPT-4o也称为“全“ 模型。这一革命性的人工智能系统代表了一次巨大的飞跃,其能力模糊了人类和人工智能之间的界限。 GPT-4o 的核心在于其原生的多模式特性,使其能够无缝处理和生成文本、音频…

AWPortrait1.4更新,人物的生成更加趋近真实感,将SD1.5人像的真实感提升到了一个新的高度

AWPortrait1.4更新,人物的生成更加趋近真实感,将SD1.5人像的真实感提升到了一个新的高度 经过5个月,AWPortrait终于迎来了1.4。 本次更新基于1.3训练,使得人物的生成更加趋近真实感,将SD1.5人像的真实感提升到了一个新…

SpringBoot(七)之监控

SpringBoot(七)之监控 Spring Boot 提供了丰富的监控和管理功能,可以通过 Spring Boot Actuator 组件实现。Actuator 使你能够监控和管理 Spring Boot 应用程序的各个方面,比如健康检查、指标、环境信息等。以下是如何在 Spring …

EUT上电时,测试LISN拾取的脉冲电压对接收机的影响

背景:在2024年4月25日发现G220 IP20 FSF1测试结果不一致,有5dB差异,经排查,是两台接收机测试出的结果不一致,经过进一步确认,使用信号发生器直接灌入接收机DI-111内,测试出的结果会少4dB.使用梳…

linux-ftp服务器搭建简介

安装ftp服务器: vsftpd全称为“very secure FTP daemon”,是一个在UNIX类操作系统上运行的服务,可以提供高安全性的FTP服务。 vsftpd是一个免费和开放源代码的FTP服务器软件,它提供了许多其他FTP服务器不支持的特性,例…

基于python+Django大数据的电影市场预测分析系统设计与实现

博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…

uview1.0 u-form表单回显校验不通过

提交到后端的数据,回显后不做任何修改无法通过表单校验 原因,u-form表单校验的类型默认为string,但是后端返回的是integer类型,导致无法通过校验 解决,既然后端返回的是整数形,那么我们就将校验规则的type…

html 根字号 以及 设置根元素font-size:calc(100vw/18.75)、元素rem实现自适应

rem 单位介绍:rem 是相对文档根元素(html)字体大小的尺寸单位,当元素的尺寸或文字字号等使用 rem 单位时,会随着根元素的 font-size变化而变化。 得出结论:在不同分辨率的设备下动态设置根元素的字体大小就可以实现页面自适应。 …

【企业动态】东胜物联成为AWS硬件合作伙伴,助力实现边缘智能

近日,AIoT硬件设备供应商东胜物联与全球领先的云计算服务提供商亚马逊云(AWS)达成合作关系,共同致力于推动物联网技术的发展,为企业客户提供更智能、灵活的硬件解决方案,助力智能化升级和数字化转型。 作为…

Android studio关闭自动更新

Windows下: 左上角file - setting - Appearance & Behavier - system setting - update - 取消勾选

图书管理系统(Java版本)

文章目录 前言要求1.设置对象1.1.图书1.2.书架2.管理员3.功能的实现 2.搭建框架2.1.登录(login)2.2.菜单2.3.操作方法的获取 3.操作方法的实现3.1.退出系统(ExitOperation)3.2.显示图书(ShowOperation)3.3.查阅图书(FindOperation)3.4.新增图书(AddOperation)3.5.借出图书(Borr…

现代浏览器性能优化示例-提前加载prefetch:

prefetch就是在核心代码 加载完成后,浏览器有空闲就会帮我们prefetch预取资源 请注意,prefetch 是一种优化手段,而不是必须使用的功能。在决定是否使用它之前,请确保你的应用程序已经进行了其他必要的性能优化(如代码压…

《Python学习》-- 入门篇一

一、概述 Python是一门由Guido van Rossum于20世纪80年代末开发的高级编程语言,并在1991年首次发布。它同JAVA一样是一门解释性语言,它的性能不如C、golang等编译型语言,但它具有入门门槛低、开发效率高等优点。2008年发布了Python3.0的版本&…

链游:区块链技术的游戏新纪元

随着区块链技术的快速发展,越来越多的行业开始探索与其结合的可能性,其中,游戏行业与区块链的结合尤为引人注目。链游,即基于区块链技术的游戏,正以其独特的优势,为玩家带来全新的游戏体验。本文将对链游进…

QQ技术导航源码附带交易系统

网站功能 QQ登录 友联自助交换 友情链接交易功能 多功能搜索 ico小图标本地化 网站图片本地化 蜘蛛日志 文章评论 网站评论 自助链接匿名提交站点,添加友链访问网站自动审核通过 VIP 会员等级 VIP 付费升级 单个文章或者站点付费快审 多背景图片可自定义背景图片…

c语言bug汇总中篇5

40. 不关注代码风格一致性 代码风格一致性有助于提高代码的可读性和可维护性。如果团队成员使用不同的代码风格,会导致代码看起来杂乱无章,增加阅读和理解的成本。 为了保持代码风格的一致性,程序员应该: - 遵循团队或项目约定的…