[后端] 微服务的前世今生

news/2024/7/27 8:53:47/文章来源:https://blog.csdn.net/qq_45704048/article/details/135515290

微服务的前世今生

整体脉络:

单体 -> 垂直划分 -> SOA -> micro service 微服务 -> services mesh服务网格 -> future


文章目录

  • 微服务的前世今生
    • 单一应用架构
      • 特征
      • 优点:
      • 缺点:
    • 垂直应用架构
      • 特征
      • 优点
      • 缺点
    • `SOA` 面向服务架构
      • 特征
      • 优点
      • 缺点
    • 微服务架构
      • 特征
      • 优点
      • 缺点

单一应用架构

通俗地讲,“单体应用(monolith application )”就是将应用程序的所有功能都打包成一个独立的单元。当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。

特征

  • 所有的功能集成在一个项目工程中;
  • 所有的功能打一个 war 包部署到服务器;
  • 应用与数据库分开部署;
  • 通过部署应用集群和数据库集群来提高系统的性能。

在这里插入图片描述

优点:

  • 开发简单:一个 IDE 就可以快速构建单体应用;
  • 便于共享:单个归档文件包含所有功能,便于在团队之间以及不同的部署阶段之间共享;
  • 易于测试:单体应用一旦部署,所有的服务或特性就都可以使用了,这简化了测试过程,因为没有额外的依赖,每项测试都可以在部署完成后立刻开始;
  • 容易部署:整个项目就一个 war 包,Tomcat 安装好之后,应用扔上去就行了。群化部署也很容易,多个 Tomcat + 一个 Nginx 分分钟搞定。

缺点:

  • 妨碍持续交付:随着时间的推移,单体应用可能会变得比较大,构建和部署时间也相应地延长,不利于频繁部署,阻碍持续交付。在移动应用开发中,这个问题会显得尤为严重;
  • 不够灵活:随着项目的逐渐变大,整个开发流程的时间也会变得很长,即使在仅仅更改了一行代码的情况下,软件开发人员需要花费几十分钟甚至超过一个小时的时间对所有代码进行编译,并接下来花费大量的时间重新部署刚刚生成的产品,以验证自己的更改是否正确。如果多个开发人员共同开发一个应用程序,那么还要等待其他开发人员完成了各自的开发。这降低了团队的灵活性和功能交付频率;
  • 受技术栈限制:项目变得越来越大的同时,我们的应用所使用的技术也会变得越来越多。这些技术有些是不兼容的,就比如在一个项目中大范围地混合使用 C++ 和 Java 几乎是不可能的事情。在这种情况下,我们就需要抛弃对某些不兼容技术的使用,而选择一种不是那么适合的技术来实现特定的功能。
  • 可靠性差:某个环节出现了死循环,导致内存溢出,会影响整个项目挂掉。
  • 伸缩性差:系统的扩容只能针对应用进行扩容,不能做到对某个功能进行扩容,扩容后必然带来资源浪费的问题。
  • 技术债务:假设我的代码库中有一个混乱的模块结构。此时,我需要添加一个新功能。如果这个模块结构清晰,可能我只需要2天时间就可以添加好这个功能,但是如今这个模块的结构很混乱,所以我需要4天时间。多出来的这两天就是债务利息。随着时间推移、人员变动,技术债务必然也会随之增多。

垂直应用架构

特征

  • 以单体结构规模的项目为单位进行垂直划分,就是将一个大项目拆分成一个一个单体结构项目。
  • 项目与项目之间存在数据冗余,耦合性较大,比如上图中三个项目都存在用户信息。
  • 项目之间的接口多为数据同步功能,如:数据库之间的数据库,通过网络接口进行数据库同步。

在这里插入图片描述

当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。

优点

  • 开发成本低,架构简单;
  • 避免单体应用的无限扩大;
  • 系统拆分实现了流量分担,解决了并发问题;
  • 可以针对不同系统进行扩容、优化;
  • 方便水平扩展,负载均衡,容错率提高;
  • 不同的项目可采用不同的技术;
  • 系统间相互独立。

缺点

  • 系统之间相互调用,如果某个系统的端口或者 IP 地址发生改变,调用系统需要手动变更;
  • 垂直架构中相同逻辑代码需要不断的复制,不能复用。
  • 系统性能扩展只能通过扩展集群结点,成本高、有瓶颈。

SOA 面向服务架构

特征

  • 基于 SOA 的架构思想将重复公用的功能抽取为组件,以服务的形式给各系统提供服务。
  • 各项目(系统)与服务之间采用 WebService、RPC 等方式进行通信。
  • 使用 ESB 企业服务总线作为项目与服务之间通信的桥梁。

在这里插入图片描述

当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心。当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。

P.S. 从软件设计的角度上来说,ESB 是一个抽象的间接层,提取了服务调用过程中调用与被调用动态交互中的一些共同的东西,减轻了服务调用者的负担。Java 编程思想里提到:“所有的软件设计的问题都可以通过增加一个抽象的间接层而得到解决或者得到简化!”简单来说 ESB 就是一根管道,用来连接各个服务节点。为了集成不同系统,不同协议的服务,ESB 做了消息的转化解释和路由工作,让不同的服务互联互通。

优点

  • 将重复的功能抽取为服务,提高开发效率,提高系统的可重用性、可维护性。
  • 可以针对不同服务的特点制定集群及优化方案;
  • 采用 ESB 减少系统中的接口耦合。

缺点

  • 系统与服务的界限模糊,不利于开发及维护。
  • 虽然使用了 ESB,但是服务的接口协议不固定,种类繁多,不利于系统维护。
  • 抽取的服务的粒度过大,系统与服务之间耦合性高。
  • 涉及多种中间件,对开发人员技术栈要求高。
  • 服务关系复杂,运维、测试部署困难

微服务架构

特征

  • 将系统服务层完全独立出来,并将服务层抽取为一个一个的微服务。
  • 微服务中每一个服务都对应唯一的业务能力,遵循单一原则。
  • 微服务之间采用 RESTful 等轻量协议传输。

在这里插入图片描述

优点

  • 团队独立:每个服务都是一个独立的开发团队,这个小团队可以是 2 到 5 人的开发人员组成;
  • 技术独立:采用去中心化思想,服务之间采用 RESTful 等轻量协议通信,使用什么技术什么语言开发,别人无需干涉;
  • 前后端分离:采用前后端分离开发,提供统一 Rest 接口,后端不用再为 PC、移动端开发不同接口;
  • 数据库分离:每个微服务都有自己的存储能力,可以有自己的数据库。也可以有统一数据库;
  • 服务拆分粒度更细,有利于资源重复利用,提高开发效率;
  • 一个团队的新成员能够更快投入生产;
  • 微服务易于被一个开发人员理解,修改和维护,这样小团队能够更关注自己的工作成果。无需通过合作才能体现价值;
  • 可以更加精准的制定每个服务的优化方案(比如扩展),提高系统可维护性;
  • 适用于互联网时代,产品迭代周期更短。

缺点

  • 微服务过多,服务治理成本高,不利于系统维护;
  • 分布式系统开发的技术成本高(网络问题、容错问题、调用关系、分布式事务等),对团队挑战大;
  • 微服务将原来的函数式调用改为服务调用,不管是用 rpc,还是 http rest 方式,都会增大系统整体延迟。这个是再所难免的,这个就需要我们将原来的串行编程改为并发编程甚至异步编程,增加了技术门槛;
  • 多服务运维难度,随着服务的增加,运维的压力也在增大;
  • 测试的难度提升。服务和服务之间通过接口来交互,当接口有改变的时候,对所有的调用方都是有影响的,这时自动化测试就显得非常重要了,如果要靠人工一个个接口去测试,那工作量就太大了,所以 API 文档的管理尤为重要。

作者:哈喽沃德先生
链接:https://juejin.cn/post/6844904078485504008
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

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

相关文章

STM32快速复制MX25L1606E系列Flash

去年做了一个使用RS485对PIC18F45K80系列单片机进行在线升级的程序,如果是小批量的出厂烧录程序和升级验证(出厂前肯定要测试单片机是否能正常读写Flash)是可以的,但是后来产品订单量很大,生产线的烧录及升级验证就很缓…

Android Retrofit使用详情

一、 Retrofit是什么 Retrofit是Android用来接口请求的网络框架,内部是基于OkHttp实现的,retrofit负责接口请求的封装,retrofit可以直接将接口数据解析为Bean类、List集合等,直接简化了中间繁琐的数据解析过程 二、 Retrofit的简单…

使用 Apache POI 更新/覆盖 特定的单元格

使用 Apache POI 更新特定的单元格 一. 需求二. 实现三. 效果 一. 需求 将以下表中第4行,第4列的单元格由“张宇”更新为“汤家凤”,并将更行后的结果写入新的Excel文件中; 二. 实现 使用Apache POI,可以精确定位到需要更改的单…

stm32学习笔记:USART串口通信

1、串口通信协议(简介软硬件规则) 全双工:打电话。半双工:对讲机。单工:广播 时钟:I2C和SPI有单独的时钟线,所以它们是同步的,接收方可以在时钟信号的指引下进行采样。串口、CAN和…

Picturesocial | 开发实践:如何在15分钟内将应用容器化

在常见的软件架构体系中,容器无疑是一个技术热点。有些开发者在工作中熟练使用容器技术,有些可能刚刚开始容器之旅。 面对容器使用经验不同的各类开发者,我们希望通过这个系列文章,由浅入深地介绍如何使用容器技术来构建&#xf…

C语言天花板——指针(经典题目)

指针我们已经学习的差不多了,今天我来给大家分享几个经典的题目,来让我们相互学习🏎️🏎️🏎️ int main() {int a[4] { 1, 2, 3, 4 };int* ptr1 (int*)(&a 1);int* ptr2 (int*)((int)a 1);printf("%x,%…

C++ OJ基础

C OJ基础 在学校学习C程序设计基础课程的OJ题目 缺少第二十题 这里写目录标题 C OJ基础习题练习(一)打印图形习题练习(二)数据的输入输出习题练习(三)函数重载习题练习(四)设计矩形类习题练习(五)定义Tree类习题练习(六)完善职工工资类Salary的设计习题练习(七)设计矩形类recta…

运维工具之iptables命令

运维工具之iptables命令 1.iptables防火墙介绍 ​ iptables其实并不是真正的防火墙,我们可以理解成一个客户端代理,用户通过 IPTables这个代理,将用户的安全设定执行到对应的"安全框架"中,这个"安全框架"才…

Laravel 框架中队列的使用

概述 Laravel 框架内置了强大的队列系统,用于处理异步任务、提高系统性能等。队列可以让任务异步执行,而不会阻塞当前进程,可以提高系统的处理能力。 Laravel 的队列系统支持多种驱动,如 Redis、Beanstalkd、SQS 等,…

Android WiFi Service启动-Android13

Android WiFi Service启动 - Android13 1、SystemServer中入口2、WifiService启动2.1 关键类概要2.2 启动时序图 Android WiFi基础概览 AOSP > 文档 > 心主题 > WiFi概览 1、SystemServer中入口 编译生成对应的jar包:"/apex/com.android.wifi/javalib…

桌面显示器type-c接口方案6020

TYPE-C接口桌面显示器,与传统的显示器不同的是 新一类的显示器不仅仅支持视频传输,还可以利用显示器的DC电源转成PD协议充电给设备端(笔记本,任天堂等HOST设备)充电。 这种新型的TYPE-C接口桌面显示器,不仅…

基于机器学习的高考志愿高校及专业分析系统

本项目在“基于 Python 的高考志愿高校及专业分析系统”基础上补充添加了机器学习算法对高考总问进行预测; 项目采用了网络爬虫技术,从指定的高考信息网站上抓取了各大高校的历年录取分数线数据。 通过精细的数据清洗过程,这些数据被存储于…

物联网智能控制器—福建蜂窝物联网科技有限公司

什么是物联网智能控制器? 物联网智能控制器是蜂窝物联自主研发的一种远程测控设备(RTU),负责对现场信号、工业设备的监测和控制。本质上是一个模块化封装的微型计算机设备,将相应的一些功能进行了封装,无需进行电路设计和硬件程序…

为什么使用双token实现无感刷新用户认证?

单token机制 认证机制:对与单token的认证机制在我们项目中仅使用一个Access Token的访问令牌进行用户身份认证和授权的方案处理。 不足之处: 安全性较低(因为只有一个token在客户端和服务器端之间进行传递,一目Acess Token被截获或者被泄露…

在程序中链接静态库 和 动态库

9. 链接库 在编写程序的过程中,可能会用到一些系统提供的动态库或者自己制作出的动态库 或者静态库文件,cmake中也为我们提供了相关的加载动态库的命令hehedalinux:~/Linux/loveDBTeacher-v3$ tree . ├── CMakeLists.txt ├── include │ └── …

远程开发之vscode端口转发

远程开发之vscode端口转发 涉及的软件forwarded port 通过端口转发,实现在本地电脑上访问远程服务器上的内网的服务。 涉及的软件 vscode、ssh forwarded port 在ports界面中的port字段,填需要转发的IP:PORT,即可转发远程服务器中的内网端…

Monorepo-uniapp 构建分享

Monorepo uniapp 构建灵感:刚好要做一个项目,于是想到升级一下之前自己写的一个vue3tspiniauno的模版框架,其实那个框架也不错;只是感觉还差点东西,我已经用那个小框架写了两三个项目;轻巧实用。为什么选…

idea使用docker-compose发布应用程序

非常重要的话说在前头 idea要想使用docker-compose,不能使用ssh创建idea Docker,而需要使用socket创建idea Docker。 socket docker是不安全的,任何人都可以访问你的docker,所以只能测试环境使用,请勿在正式环境使用s…

ubuntu安装mysql(tar.xz)

0:本机Ubuntu的版本为 腾讯云 18.04 1:下载地址 MySQL :: 下载 MySQL 社区服务器 2:上传文件到服务器 3:解压 sudo sumv mysql-8.2.0-linux-glibc2.17-x86_64-minimal.tar.xz /usrtar -xvf mysql-8.2.0-linux-glibc2.17-x86_6…

推荐一款.NET开发的物联网开源项目

物联网(IoT)是一个正在快速发展的技术领域,它涉及到各种设备、物体和系统的互联。所以各种物联网平台和物联网网关项目层出不穷,在物联网(IoT)领域,.NET平台扮演着重要的角色。作为一款广泛使用…