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


目录

一.认识微服务架构

[▐ 微服务带来的挑战](#▐ 微服务带来的挑战)

二.微服务解决方案SpringCloud

[▐ SpringCloud的版本](#▐ SpringCloud的版本)

[▐ SpringCloud和SpringBoot的关系](#▐ SpringCloud和SpringBoot的关系)

[▐ SpringCloud实现方案](#▐ SpringCloud实现方案)

[Spring Cloud Netfix](#Spring Cloud Netfix)

[Spring Cloud Alibaba](#Spring Cloud Alibaba)

[▐ Spring Cloud 实现对比](#▐ 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 Netflix | Spring Cloud Alibaba |
| 服务注册/发现 | Eureka | Eureka | Nacos |
| 服务调用 | OpenFeign | Feign | Dubbo |
| 配置中心 | SpringCloudConfig | Archaius | Nacos |
| 服务网关 | SpringCloudGateway | Zuul | SpringCloudGateway |
| 负载均衡 | SpringCloudLoadBalance | Ribbon | Dubbo |




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

相关推荐
直裾1 分钟前
scala借阅图书保存记录(三)
开发语言·后端·scala
黑胡子大叔的小屋19 分钟前
基于springboot的海洋知识服务平台的设计与实现
java·spring boot·毕业设计
ThisIsClark22 分钟前
【后端面试总结】深入解析进程和线程的区别
java·jvm·面试
星就前端叭1 小时前
【开源】一款基于Vue3 + WebRTC + Node + SRS + FFmpeg搭建的直播间项目
前端·后端·开源·webrtc
9527华安1 小时前
FPGA多路MIPI转FPD-Link视频缩放拼接显示,基于IMX327+FPD953架构,提供2套工程源码和技术支持
fpga开发·架构·音视频
雷神乐乐1 小时前
Spring学习(一)——Sping-XML
java·学习·spring
小林coding2 小时前
阿里云 Java 后端一面,什么难度?
java·后端·mysql·spring·阿里云
AI理性派思考者2 小时前
【保姆教程】手把手教你在Linux系统搭建早期alpha项目cysic的验证者&证明者
后端·github·gpu
V+zmm101342 小时前
基于小程序宿舍报修系统的设计与实现ssm+论文源码调试讲解
java·小程序·毕业设计·mvc·ssm
从善若水2 小时前
【2024】Merry Christmas!一起用Rust绘制一颗圣诞树吧
开发语言·后端·rust