【图文详解】什么是微服务?什么是SpringCloud?

news2024/9/25 5:06:54


目录

一.认识微服务架构

▐ 微服务带来的挑战

二.微服务解决方案SpringCloud

▐ SpringCloud的版本

▐ SpringCloud和SpringBoot的关系

▐ SpringCloud实现方案

Spring Cloud Netfix

Spring Cloud Alibaba

▐ Spring Cloud 实现对比


在入门Spring Cloud 之前,我们需要先了解下什么是微服务,以及微服务的发展史。在架构发展的过程中,项目开发遇到了哪些问题,以及Spring Cloud是用来解决什么问题的。

一.认识微服务架构

下图表示了单体架构到微服务架构的发展过程

什么是单体架构?

很多创业公司早期或者传统企业会把业务的所有功能实现都打包在⼀个项目,这就是单体架构。业务的所有功能实现都打包在⼀个war包或者Jar包中,我们将这种方式就称为单体架构。

以电商系统为例,电商系统包括:用户管理、商品管理、订单管理、支付管理、库存管理、物流管理等等,项目早期我们会把这些模块都写在⼀个web项目中,然后统⼀部署到⼀个Web服务器中。

这种架构开发和部署都很简单,⼀个项目就包含了所有的功能,省去了多个项目之间的交互和调⽤消耗,直接部署在⼀个服务器即可。

当网站的用户量越来越大,需求也会越来越多,流量也会越来越大,服务可能就会⾯临以下问题:

  • 后端服务器的压力就会越来越大,负载越来越高,甚⾄出现无法访问的情况
  • 业务场景逐渐复杂,为了满⾜用户的需求,单体应⽤也会越来越⼤,各个业务代码之间的耦合度也会越来越高,任何⼀个问题,都需要整个项目重新构建,发布
  • ⼀个微笑的问题都可能会导致整个应用挂掉

我们从两个方向进行优化:

  • 横向: 添加服务器,把单台机器变成多台机器的集群,即利用集群的思想。
  • 纵向: 把⼀个应用,按照业务进行拆分,拆分为多个项目,此架构也称为垂直架构,即利用分布式的思想。

以单体结构规模的项目为单位进行垂直划分,也就是将⼀个⼤项目拆分成⼀个⼀个单体结构项⽬,项目和项目之间相对比较独立。

从上图中可以看出,按照业务进行拆分后,会有⼀些重复的功能开发,比如订单系统在电商平台和支付系统都会涉及。

在分布式架构下,当部署的服务越来越多,重复的代码就会越来越多,服务的调⽤关系也会越来越复杂,我们可以把⼀些通用的会被多个上层服务调⽤的共享业务提取成独⽴的基础服务,组成⼀个个微小的服务,这就是微服务.

很多人会把分布式和微服务弄混淆,这二者严格上说是不能划等号的,

从功能上说:

  • 分布式: 服务拆分, 拆了就⾏.
  • 微服务: 指⾮常微小的服务, 更细粒度的垂直拆分, 通常指不能再拆的服务

从侧重点上说:

  • 分布式架构侧重于压力的分散,强调的是服务的分散化
  • 微服务侧重于能力的分散,更强调服务的专业化和精细分⼯

从实践的⻆度来看,微服务架构通常是分布式服务架构;反之则未必成⽴,所以选择微服务通常意味着需要解决分布式架构的各种难题

▐ 微服务带来的挑战

随着产品的复杂性和流量的增加,技术架构也在不断的发⽣变化,不论是早期的单体架构还是现在⼴泛使用的微服务架构,都是为了更好的服务产品,解决问题。

微服务架构带来好处的同时,也⾯临着⼀些挑战,从单体服务转向微服务意味着管理更加复杂,接下来我们从优势和挑战两个方向分析⼀下微服务架构。

优势

  • 易开发和维护:每个微服务负责的业务比较清晰,体量小,开发和维护成本降低.
  • 容错性高:⼀个服务发生故障,可以使故障隔离在单个服务中,不影响整体服务故障.
  • 扩展性好:每个服务都是独立运行的,我们可以结合项⽬实际情况进⾏扩展,按需伸缩.
  • 技术选型灵活:每个微服务都是单独的团队来运维,可以根据业务特点和团队特点,选择适合的技术栈

虽然微服务具备很多的优势, 但由于服务数的增加, 服务治理也是我们⾯临的巨⼤挑战.

挑战

  • 服务依赖:随着服务的数量增多,服务之间的关系也会变得更加复杂,⼀个服务的更改 需要考虑对其他服务的影响.
  • 运维成本:⼀个业务流程会涉及多个微服务共同完成,有更多的服务需要编译、部署、运行,甚⾄可能是不同的编程语言,不同的运⾏环境,当然也需要集群来处理故障转移等,这对于运维人员而言挑战是巨⼤的.
  • 开发和测试:⼀个业务流程可能涉及多个微服务共同完成,服务调⽤引⼊⽹络延迟,不可靠的⽹络,如何进行容错处理等问题,这对开发和测试而言难度也会提升.
  • 服务监控:在⼀个单体结构中, 很容易实现服务的监控,因为所有功能都在⼀个服务中, 微服务架构下,不仅需要对整个链路进⾏监控,还需要对每⼀个服务实现监控.
  • 负载均衡:微服务架构中的服务实例数量可能⾮常庞大,因此需要有效的服务发现和负载均衡机制来管理请求流量和保证⾼可⽤性 

选择微服务架构的话,以上这些问题都需要我们解决,我们是自己研发还是选择市场上比较成熟的技术拿来⽤呢?全球的互联网公司都在积极尝试自己的微服务落地方案,在Java领域最引⼈注⽬的就是Spring Cloud


二.微服务解决方案SpringCloud

上文中说到SpringCloud其实是Java领域内非常热门的微服务解决方案,SpringCloud在业内已经被广泛应用,对于前文中提到的微服务中常见的问题和挑战都有很好的解决效率。

Spring Cloud 提供了⼀些可以让开发⼈员快速构建分布式服务的⼯具,比如配置管理、服务发现、 熔断、智能路由等,他们可以在任何分布式环境中很好的⼯作。

Spring Cloud 并不是Spring 团队研发的框架,它只是把⼀些⽐较优秀的解决微服务架构中常⻅问题的开源框架基于SpringCloud规范进⾏了整合,并基于SpringBoot的⻛格对这些组件进⾏封装,屏蔽掉了复杂的配置和实现原理,为开发者提供了开箱即⽤的微服务开发体验.

▐ SpringCloud的版本

Spring Cloud 是⼀个由很多⼦项⽬组成的庞⼤项⽬,这些⼦项⽬由各个公司来维护的,所以发布阶段也是不同的

为了管理主项目和⼦项目的依赖关系,以及为了避免和⼦项⽬版本的冲突,主项⽬版本命名并没有采⽤和⼦项⽬数字版本化的形式,⽽是采⽤了英⽂名称。这个英⽂版本名称也⽐较有趣, Spring Cloud 采⽤了英国伦敦地铁站的名称来命名,并由地铁站名称字⺟A-Z依次类推的形式来发布迭代版本。

  • Angel
  • Brixton
  • Camden
  • Dalston
  • Edgware
  • Finchley
  • Greenwich
  • Hoxton

但英⽂版本号太复杂了, 从 Hoxton 版本之后, Spring Cloud的版本就变成了2020.0.0 这样的⽇期版本号了

  • 2020.0.x aka Ilford
  • 2021.0.x aka Jubilee
  • 2022.0.x aka Kilburn
  • 2023.0.x aka Leyton

▐ SpringCloud和SpringBoot的关系

SpringCloud中的所有子项目都依赖SpringBoot,所以SpringBoot 和SpringCloud的版本之间也存在⼀定的对应关系。

比如SpringBoot 3.2.X对应的SpringCloud版本是2023.0.X。如果我们有⼀个SpringBoot项目, 我们希望在这个项⽬中添加SpringCloud的⼀些组件,需要根据当前项目的SpringBoot版本, 选择SpringCloud的版本(当然, 新项⽬不存在这个问题) 

▐ SpringCloud实现方案

在Spring Cloud的规范下,有很多实现,其中有以下俩个较为出名

  • Spring Cloud Netfix
  • Spring Cloud Alibaba

Spring Cloud Netfix

Spring Cloud Netflix 是 Netflix OSS(Netflix Open Source Software)在Spring Cloud规范下的实现,包含的组件及其主要功能大致如下:

  • Eureka: 服务注册和发现
  • Zuul: 服务⽹关
  • Ribbon: 负载均衡
  • Feign: 服务调⽤组件
  • Hystrix: 断路器, 提供服务熔断和限流
  • Hystrix Dashboard: 监控⾯板

在很长的⼀段时间里SpringCloud⼀度被泛指SpringCloudNetflix。SpringCloud⼀直以来把Netflix OSS 套件作为其官⽅默认的⼀站式解决⽅案,然而Netflix公司在2018年前后宣布其核⼼组件Hystrix、Ribbon、Zuul等均进⼊维护状态,Spring Cloud 也被迫宣布删除这些维护模块。

spring-cloud-netflix并没有从Spring Cloud的依赖中完全删除,只是从2020.0版本起,他只管理Eureka。

Spring Cloud Alibaba

Spring Cloud Alibaba 是阿里巴巴集团下的开源组件和云产品在Spring Cloud规范下的实现。

虽然Spring Cloud Alibaba⽬前并不是Spring Cloud官⽅推荐的默认⽅案,但是Spring Cloud Alibaba是阿里中间件团队主导的⼀个新⽣项⽬,正处于⾼速迭代中,甚⾄在Alibaba的开源组件还没有织⼊SpringCloud生态之前,就已经在各⼤公司广泛使⽤了。

如果说SpringCloudNetflix是SpringCloud的第⼀代实现,那么SpringCloudAlibaba也可以看做是SpringCloud的第⼆代实现,主要由 Nacos、Sentinel、Seata 等组件组成。

官网:Spring Cloud Alibaba 是什么-阿里云Spring Cloud Alibaba官网 (aliyun.com)

Spring Cloud Alibaba 吸收了 Spring Cloud Netflix 微服务框架的核心架构思想,并进行了高性能改进,自 Spring Cloud Netflix 进入停更维护后,Spring Cloud Alibaba 逐渐代替它成为主流的微服务框架。

▐ Spring Cloud 实现对比

Spring Cloud官方Spring Cloud NetflixSpring Cloud Alibaba
服务注册/发现EurekaEurekaNacos
服务调用OpenFeignFeignDubbo
配置中心SpringCloudConfigArchaiusNacos
服务网关SpringCloudGatewayZuulSpringCloudGateway
负载均衡SpringCloudLoadBalanceRibbonDubbo



 本次的分享就到此为止了,希望我的分享能给您带来帮助,创作不易也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见

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

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

相关文章

太速科技-383-基于kintex UltraScale XCKU060的双路QSFP+光纤PCIe 卡

基于kintex UltraScale XCKU060的双路QSFP光纤PCIe 卡 一、板卡概述 本板卡系我司自主研发,基于Xilinx UltraScale Kintex系列FPGA XCKU060-FFVA1156-2-I架构,支持PCIE Gen3 x8模式的高速信号处理板卡,搭配两路40G QSFP接口&#xff…

DataX3.0:深入探索与实战应用

DataX3.0是阿里云DataWorks数据集成的开源版本,它继承了DataX1.0的优良基因,并在此基础上进行了全面的升级和扩展。新版本的DataX3.0不仅支持更多的数据源和目标端,还提供了更高效的数据同步能力,能够满足企业在数据迁移、数据同步…

虚拟硬盘数据恢复(vmdk、vdi、vhd等虚拟磁盘文件)

我们用的虚拟机有时候用着用着就启动不起来了,可能是操作系统启动扇区出了问题或者硬盘数据损坏。如果还有重要的数据文件在虚拟机里面,不要慌,一般只是操作系统的问题,硬盘里面的文件一般是不会丢失损坏的,即使磁盘有…

【论文阅读】RISE: 3D Perception Makes Real-World Robot Imitation Simple and Effective

Abstract 在模仿学习中,精确的机器人操作需要丰富的空间信息。基于图像的policies模型对象位置来自固定摄像头,对摄像头视图变化很敏感。利用3d点云的策略通常预测关键帧而不是连续动作,这在动态和联系人丰富的场景中造成了困难。为了有效地…

C++核心编程和桌面应用开发 第六天(this指针 友元)

目录 1.this指针 1.1C中空类的大小 1.2类中成员的存储方式 1.3this指针 1.3.1常函数 1.3.2常对象 2.友元 2.1全局函数做友元 2.2类做友元 2.3成员函数做友元 1.this指针 1.1C中空类的大小 1.2 类中成员的存储方式 1.3this指针 this指针指向被调用的成员函数所属的对…

Python电能质量扰动信号分类(一)基于LSTM模型的一维信号分类

引言 本文基于Python仿真的电能质量扰动信号,先经过数据预处理进行数据集的制作和加载,然后通过Pytorch实现LSTM模型对扰动信号的分类。Python仿真电能质量扰动信号的详细介绍可以参考下文(文末附10分类数据集): Pyth…

详解机器学习经典模型(原理及应用)——支持向量机

一、什么是支持向量机 支持向量机(Support Vector Machine, SVM)是一种强大的机器学习算法,可用于解决数据分类(二分类)和回归问题。在分类问题上,SVM的核心思想是在特征空间中找到一个最优的超平面&#x…

Bootstrap框架-container类,container-fluid类,栅格系统

1.Bootstrap Bootstrap为页面内容和栅格系统包裹了一个.container容器,框架预先定义类 1.1container类 响应式布局容器的宽度 手机-小于768px 宽度设置100%; 平板-大于等于768px 设置宽度为750px 桌面显示器-大于等于992px 设置宽度 970px 大屏幕显…

【全网最全】2024年华为杯研赛A题成品论文获取入口(后续会更新)

您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片,那是获取资料的入口! 【全网最全】2024年华为杯研赛A题保奖思路matlab/py代码成品论文等(后续会更新完整 点击链接加入【2024华为杯研赛资料汇总】:https:…

linux驱动开发-arm汇编基础

目录 写在前面 1、Cortex-A7 处理器有 9 种处理模式 2、Cortex-A 寄存器组 通用寄存器 1、汇编语法 2、Cortex-A7 常用汇编指令 2.1 处理器内部数据传输指令 2.1.1 传输数据操作类型 1、MOV指令 2、MRS指令 3、MSR指令 2.2、存储器访问指令 2.2.1 LDR指令 2.2.2 …

IDEA:如何设置项目启动的JVM运行内存大小

IDEA版本不一样页面也不一样 -Xms20m -Xmx200m 其实在本地开发调试的时候不需要太大内存,如果测试性能建议放到运算服务器上面去跑~~~

最小花费爬楼梯(动态规划)问题

目录 一题目: 二思路: 三代码: 一题目: 最小花费爬楼梯_牛客题霸_牛客网 二思路: 思路:动态规划找前后规律化简题意:此题想要的结果其实就是能上到顶楼也就是: 分为&#xff1…

信息安全工程师(16)密码学概况

前言 密码学是研究编制密码和破译密码的技术科学,它涵盖了加密技术和解密技术的各个方面,是现代信息安全的核心组成部分。 一、定义与基本概念 定义:密码学是研究如何隐密地传递信息的学科,主要涉及保密通信和数字签名两个方面。它…

4.1章节python中顺序结构

顺序结构(Sequential Structure)是最基本、最简单的程序结构。 顺序结构意味着程序中的语句将按照它们在代码中出现的顺序依次执行。这是大多数编程语言中最直观和自然的执行方式。 在Python中编写顺序结构的程序时,你只需将语句按照你希望它…

docker:docker-compose容器编排

docker-compose容器编排 安装docker-compose 下载链接:https://github.com/docker/compose/releases/下载这个版本 [rootc1-10-66 ~]# ls anaconda-ks.cfg docker-compose-linux-x86_64_2 gpu-burn## 改个名字 [rootc1-10-66 ~]# mv docker-compose-linux-x86…

联想2025届C++开发工程师(编程题AK)

前面20个选择题吧 编程题 T1、爆破 时间限制:3000MS 内存限制:589824KB 题目描述: 小明当起了矿场的爆破工程师。小明工作的矿场可以看作一个N x N的二维网格,小明可以将一个炸弹放置到矿场的任意位置,若干时间后…

更新C语言题目

1.以下程序输出结果是() int main() {int a 1, b 2, c 2, t;while (a < b < c) {t a;a b;b t;c--;}printf("%d %d %d", a, b, c); } 解析:a1 b2 c2 a<b 成立 ,等于一个真值1 1<2 执行循环体 t被赋值为1 a被赋值2 b赋值1 c-- c变成1 a<b 不成立…

CSS——网格布局(display: grid)之下篇

CSS——网格布局&#xff08;display: grid&#xff09;之下篇 前面我们介绍了网格布局的基础的创建以及一些比较基础的属性&#xff0c;下面我们将介绍网格布局的剩余部分&#xff0c;还将结合实例来进行细致的讲解&#xff08;图文并茂&#xff0c;生动形象有内涵&#xff0…

使用现有的科技或许无法实现对人类智能的模拟

现有科技在实现真正的人类智能方面面临许多挑战。科技的局限性涉及许多领域&#xff0c;在计算能力方面&#xff0c;尽管处理速度不断提升&#xff0c;但要模拟人脑的复杂性仍然困难重重&#xff1b;当前的人工智能依赖于大量数据进行训练&#xff0c;缺乏灵活性和适应性&#…

时间序列数据可视化

#时间序列可视化 #离散数据的时间序列可视化 import numpy as np import pandas as pdts pd.Series(np.random.randn(1000), indexpd.date_range(1/1/2000, periods1000)) ts ts.cumsum() ts.plot() #%% #连续数据的时间序列可视化 import matplotlib.pyplot as plt df pd.D…