初步了解SpringCloud微服务架构

news2024/12/22 23:40:20

✅作者简介:大家好,我是Cisyam,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉
🍎个人主页:Cisyam-Shark的博客
💞当前专栏: 微服务探索之旅
✨特色专栏: MySQL学习
🥭本文内容:初步了解SpringCloud微服务架构
🖥️个人小站 :个人博客,欢迎大家访问
📚个人知识库: 知识库,欢迎大家访问

初步了解SpringCloud微服务架构

随着互联网技术的快速发展,一些传统的IT系统支撑遇到了越来越多的问题:

  • 系统的复杂性越来越高
  • 线上访问压力大,交付速度无法满足业务需求
  • 设备采购和维护成本高,测试、部署成本高
  • IT运维管理复杂,构建一只全功能团队困难

针对上述问题,传统的单体结构已经不再适用于复杂度日益渐增的产品,因此一种新的软件架构提供了解决方案——微服务

随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢?

1. 互联网应用架构演进

1.1 单体应用架构

在诞生之初,系统的用户量、数据量规模都比较小,项目所有的功能模块都放在一个工程中编码、编译、打包并且部署在一个Tomcat容器中的架构模式就是单体应用架构,这样的架构既简单实用、便于维护,成本又低,成为了那个时代的主流架构方式。

image-20230608153308548

image-20230608152904928

优点:

  • 高效开发:项目前期开发节奏快,团队成员少的时候能够快速迭代
  • 架构简单:MVC架构,只需要借助IDE开发、调试即可
  • 易于测试:只需要通过单元测试或者浏览器完成
  • 易于部署:打包成单个可执行的jar或者打成war包放到容器内启动

​ 单体架构的应用比较容易部署、测试, 在项目的初期,单体应用可以很好地运行。然而,随着需求的不断增加, 越来越多的人加入开发团队,代码库也在飞速地膨胀。慢慢地,单体应用变得越来越臃肿,可维护性、灵活性逐渐降低,维护成本越来越高。

缺点:

  • 可靠性差: 某个应用Bug,例如死循环、内存溢出等, 可能会导致整个应用的崩溃
  • 复杂性高: 以一个百万行级别的单体应用为例,整个项目包含的模块多、模块的边界模糊、 依赖关系不清晰、 代码质量参差不齐、 混乱地堆砌在一起。使得整个项目非常复杂。
  • 扩展能力受限: 单体应用只能作为一个整体进行扩展,无法根据业务模块的需要进行伸缩。例如,应用中有的模块是计算密集型的,它需要强劲的CPU; 有的模块则是IO密集型的,需要更大的内存。 由于这些模块部署在一起,不得不在硬件的选择上做出妥协。

业务量上涨之后,单体应用架构进一步丰富变化,比如应用集群部署、使用Nginx进行负载均衡、增加缓存服务器、增加文件服务器、数据库集群并做读写分离等,通过以上措施增强应对高并发的能力、应对一定的复杂业务场景,但依然属于单体应用架构。

image-20230608155148956

1.2 垂直应用架构

​ 为了避免上面提到的那些问题,开始做模块的垂直划分,做垂直划分的原则是基于系统现有的业务特性来做,核心目标第一个是为了业务之间互不影响,第二个是在研发团队的壮大后为了提高效率,减少组件之间的依赖。

image-20200921115149514

优点

  • 系统拆分实现了流量分担,解决了并发问题

  • 可以针对不同模块进行优化

  • 方便水平扩展,负载均衡,容错率提高

  • 系统间相互独立,互不影响,新的业务迭代时更加高效

    缺点

  • 服务之间相互调用,如果某个服务的端扣或者ip地址发生改变,调用的系统得手动改变

  • 搭建集群之后,实现负载均衡比较复杂,如:内网负载,在迁移机器时会影响调用方的路 由,导致线上故障

  • 服务之间调用方式不统一,基于 httpclient 、 webservice ,接口协议不统一

  • 服务监控不到位:除了依靠端口、进程的监控,调用的成功率、失败率、总耗时等等这些监 控指标是没有的

1.3 SOA应用架构

​ 在做了垂直划分以后,模块随之增多,维护的成本在也变高,一些通用的业务和模块重复的越来越多,为了解决上面提到的接口协议不统一、服务无法监控、服务的负载均衡,引入了阿里巴巴开源的 Dubbo ,一款高性能、轻量级的开源Java RPC框架,可以和Spring框架无缝集成。它提供了三个核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

​ SOA (Service-Oriented Architecture),即面向服务的架构。根据实际业务,把系统拆分成合适的、独立部署的模块,模块之间相互独立(通过Webservice/Dubbo等技术进行通信)。

​ 优点:分布式、松耦合、扩展灵活、可重用。

​ 缺点:服务抽取粒度较大、服务调用方和提供方耦合度较高(接口耦合度)

image-20200921115445100

1.4 微服务应用架构

​ 微服务架构可以说是SOA架构的一种拓展,这种架构模式下它拆分粒度更小、服务更独立。把应用拆分成为一个个微小的服务,不同的服务可以使用不同的开发语言和存储,服务之间往往通过Restful等轻量级通信。微服务架构关键在于微小、独立、轻量级通信

​ 微服务是在 SOA 上做的升华粒度更加细致,微服务架构强调的⼀个重点是业务需要彻底的组件化和服务化

image-20200921115721307

微服务架构和SOA架构相似又不同

​ 微服务架构和SOA架构很明显的一个区别就是服务拆分粒度的不同,但是对于系统的架构发展来说,我们所看到的SOA阶段其实服务拆分粒度相对来说已经比较细了(超前哦!),所以上述系统SOA到系统微服务,从服务拆分上来说变化并不大,只是引入了相对完整的新一代Spring Cloud微服务技术。自然,上述我们看到的都是系统架构演变的阶段结果,每一个阶段其实都经历了很多变化,系统的服务拆分其实也是走过了从粗到细,并非绝对的一步到位。

举个系统案例来说明SOA和微服务拆分粒度不同

​ 我们在SOA架构的初期,“简历投递模块”和“人才搜索模块”都有简历内容展示的需求,只不过说可能略有区别,一开始在两个模块中各维护了一套简历查询和展示的代码;后期我们将服务更细粒度拆分,拆分出简历基础服务,那么不同模块调用这个基础服务即可。

2. 微服务架构体现的思想及优缺点

微服务架构设计的核心思想就是**“微”**,拆分的粒度相对比较小,这样的话单一职责、开发的耦合度就会降低、微小的功能可以独立部署扩展、灵活性强,升级改造影响范围小。

微服务架构的优点:

  • 微服务很小,便于特定业务功能的聚焦
  • 微服务很小,每个微服务都可以被一个小团队单独实施(开发、测试、部署上线、运维),团队合作一定程度解耦,便于实施敏捷开发
  • 微服务很小,便于重用和模块之间的组装
  • 微服务很独立,那么不同的微服务可以使用不同的语言开发,松耦合
  • 微服务架构下,我们更容易引入新技术

微服务架构的缺点

  • 微服务架构下,分布式复杂难以管理,当服务数量增加,管理将越加复杂;

  • 微服务架构下,分布式链路跟踪难等;

3. 微服务架构中的核心概念

  • 服务注册与服务发现

    例如:订单模块 ->用户模块

    ​ 服务提供者:用户模块

    ​ 服务消费者:订单模块

服务注册: 服务提供者将所提供服务的信息(服务器IP和端口、服务访问协议等)注册/登记到注册中心

服务发现: 服务消费者能够从注册中心获取到较为实时的服务列表,然后根究一定的策略选择一个服务访问

image-20200921121002811

image-20201001143512949

  • 负载均衡

负载均衡即将请求压力分配到多个服务器(应用服务器、数据库服务器等),以此来提高服务的性能、可靠性

image-20200921121612979
  • 熔断

​ 熔断即断路保护。微服务架构中,如果下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体可用性,可以暂时切断对下游服务的调用。这种牺牲局部,保全整体的措施就叫做熔断。

image-20200921121900709

image-20201001143852876

  • 链路追踪

微服务架构越发流行,一个项目往往拆分成很多个服务,那么一次请求就需要涉及到很多个服务。不同的微服务可能是由不同的团队开发、可能使用不同的编程语言实现、整个项目也有可能部署在了很多服务器上(甚至百台、千台)横跨多个不同的数据中心。所谓链路追踪,就是对一次请求涉及的很多个服务链路进行日志记录、性能监控

image-20200921122004045
  • API 网关

​ 微服务架构下,不同的微服务往往会有不同的访问地址,客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信可能出现:

  1. 客户端需要调用不同的url地址,增加了维护调用难度

  2. 在一定的场景下,也存在跨域请求的问题(前后端分离就会碰到跨域问题,原本我们在后端采用Cors就能解决,现在利用网关,那么就放在网关这层做好了)

  3. 每个微服务都需要进行单独的身份认证

    ​ 那么,API网关就可以较好的统一处理上述问题,API请求调用统一接入API网关层,由网关转发请求。API网关更专注在安全、路由、流量等问题的处理上(微服务团队专注于处理业务逻辑即可),它的功能比如

​ 1. 统一接入(路由)

​ 2. 安全防护(统一鉴权,负责网关访问身份认证验证,与“访问认证中心”通信,实际认证业务逻辑交移“访问认证中心”处理)

​ 3. 黑白名单(实现通过IP地址控制禁止访问网关功能,控制访问)

​ 4. 协议适配(实现通信协议校验、适配转换的功能)

​ 5. 流量管控(限流)

​ 6. 长短链接支持

​ 7. 容错能力(负载均衡)

image-20200921122144344

4. Spring Cloud概述

4.1 Spring Cloud 是什么

我摘抄了百度百科的原话:

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包

Spring Cloud是一系列框架的有序集合(Spring Cloud是一个规范)

开发服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等

利用Spring Boot的开发便利性简化了微服务架构的开发(自动装配)

image-20200921141543080

这里,我们需要注意,Spring Cloud其实是一套规范,是一套用于构建微服务架构的规范,而不是一个可以拿来即用的框架(所谓规范就是应该有哪些功能组件,然后组件之间怎么配合,共同完成什么事情)。在这个规范之下第三方的Netflix公司开发了一些组件、Spring官方开发了一些框架/组件,包括第三方的阿里巴巴开发了一套框架/组件集合Spring Cloud Alibaba,这些才是Spring Cloud规范的实现。

​ Netflix搞了一套 ,简称SCN

​ Spring Cloud 吸收了Netflix公司的产品基础之上自己也搞了几个组件

​ 阿里巴巴在之前的基础上搞出了一堆微服务组件,Spring Cloud Alibaba(SCA)

4.2 Spring Cloud 解决什么问题

Spring Cloud 规范及实现意图要解决的问题其实就是微服务架构实施过程中存在的一些问题,比如微服务架构中的服务注册发现问题、网络问题(比如熔断场景)、统一认证安全授权问题、负载均衡问题、链路追踪等问题。

  • Distributed/versioned configuration (分布式/版本化配置)

  • Service registration and discovery (服务注册和发现)

  • Routing (智能路由)

  • Service-to-service calls (服务调用)

  • Load balancing (负载均衡)

  • Circuit Breakers (熔断器)

  • Global locks (全局锁)

  • Leadership election and cluster state ( 选举与集群状态管理)

  • Distributed messaging (分布式消息传递平台)

5. Spring Cloud 架构

如前所述,Spring Cloud是一个微服务相关规范,这个规范意图为搭建微服务架构提供一站式服务,采用组件(框架)化机制定义一系列组件,各类组件针对性的处理微服务中的特定问题,这些组件共同来构成Spring Cloud微服务技术栈

5.1 Spring Cloud 核心组件

​ Spring Cloud 生态圈中的组件,按照发展可以分为第一代 Spring Cloud组件和第二代 Spring Cloud组件。

第一代 Spring Cloud(Netflix,SCN)第二代 Spring Cloud(主要就是Spring Cloud Alibaba,SCA)
注册中心Netflix Eureka阿里巴巴 Nacos
客户端负载均衡Netflix Ribbon阿里巴巴 Dubbo LB、Spring Cloud Loadbalancer
熔断器Netflix Hystrix阿里巴巴 Sentinel
网关Netflix Zuul:性能一般,未来将退出Spring Cloud 生态圈官方 Spring Cloud Gateway
配置中心官方 Spring Cloud Config阿里巴巴 Nacos、携程 Apollo
服务调用Netflix Feign阿里巴巴 Dubbo RPC
消息驱动官方 Spring Cloud Stream
链路追踪官方 Spring Cloud Sleuth/Zipkin
阿里巴巴 seata 分布式事务方案

5.2 Spring Cloud 体系结构(组件协同工作机制)

image-20200921142652330

Spring Cloud中的各组件协同工作,才能够支持一个完整的微服务架构。比如

  • 注册中心负责服务的注册与发现,很好将各服务连接起来

  • API网关负责转发所有外来的请求

  • 断路器负责监控服务之间的调用情况,连续多次失败进行熔断保护。

  • 配置中心提供了统一的配置信息管理服务,可以实时的通知各个服务获取最新的配置信息

6. Spring Cloud 与 Dubbo 对比

​ Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,基于RPC调用,对于目前使用率较高的Spring Cloud Netflix来说,它是基于HTTP的,所以效率上没有Dubbo高,但问题在于Dubbo体系的组件不全,不能够提供一站式解决方案,比如服务注册与发现需要借助于Zookeeper等实现,而Spring Cloud Netflix则是真正的提供了一站式服务化解决方案,且有Spring大家族背景。

​ 前些年,Dubbo使用率高于SpringCloud,但目前Spring Cloud在服务化/微服务解决方案中已经有了非常好的发展趋势。

image-20201001165006733

7. SpringCloud 与 SpringBoot 的关系

​ Spring Cloud 只是利用了Spring Boot 的特点,让我们能够快速的实现微服务组件开发,否则不使用Spring Boot的话,我们在使用Spring Cloud时,每一个组件的相关Jar包都需要我们自己导入配置以及需要开发人员考虑兼容性等各种情况。所以Spring Boot是我们快速把Spring Cloud微服务技术应用起来的一种方式。

另外,SpringCloud底层是依赖于SpringBoot的,并且有版本的兼容关系,如下:

image-20210713205003790

笔者这次的版本是 Hoxton.SR10,因此对应的SpringBoot版本是2.3.x版本。

8. 总结

  • 单体架构:简单方便,高度耦合,扩展性差,适合小型项目。例如:xxx管理系统

  • 分布式架构:松耦合,扩展性好,但架构复杂,难度大。适合大型互联网项目,例如:京东、淘宝

  • 微服务:一种良好的分布式架构方案

    ①优点:拆分粒度更小、服务更独立、耦合度更低

    ②缺点:架构非常复杂,运维、监控、部署难度提高

  • SpringCloud是微服务架构的一站式解决方案,集成了各种优秀微服务功能组件

这一节主要是让我们可以系统的认识到互联网架构的一个演变,以及对SpringCloud微服务架构有一个初步认识,下一节我们通过一些实战案例用代码去体会到我们在开发中怎么去构建SpringCloud项目以及如果进一步了解SpringCloud组件,在咱们下期见!欢迎评论区交流讨论!

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

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

相关文章

Apikit SaaS 10.9.0 版本更新:接口测试支持通过 URL 请求大型文件,覆盖更多场景的文件请求测试

Hi,大家好! Eolink Apikit 即将在 2023年 6月 8日晚 18:00 开始更新 10.9.0 版本。本次版本更新主要是对多个应用级资源合并,并基于此简化付费套餐和降低费率。 本次应用合并是为了接下来更好的发挥 Eolink Apikit 的优势,提供 …

Web前端-React学习

React基础 React 概述 React 是一个用于构建用户界面的JavaScript库。 用户界面: HTML页面(前端) React主要用来写HTML页面, 或构建Web应用 如果从MVC的角度来看,React仅仅是视图层(V),也就…

多目标建模loss为什么最好同时收敛?

多目标的多个loss是否同时收敛最好? 假设 task A的独有参数 W a W_a Wa​task B的独有参数 W b W_b Wb​task A和 task B的共享的参数 W s W_s Ws​ 那么 l o s s l o s s a l o s s b loss loss_a loss_b losslossa​lossb​ 假设损失函数为 f f f&…

【DepthFilter】深度滤波器

14讲P326-327 函数实现一个深度滤波器,用于计算图像中某个像素点的深度值。算法步骤的含义和含义: 将当前帧的像素点和参考帧的像素点通过三角化计算深度。将参考帧到当前帧的变换矩阵 T_C_R 转换为当前帧到参考帧的变换矩阵 T_R_C。将参考帧像素点 pt_…

Docker超详细基础使用(带图)

目录 安装ubuntu 基本使用命令 docker run 容器名 延伸命令 启动ubuntu 查看所有正在运行的容器 指定容器别名启动 doker ps 延伸命令 退出容器 重新进入正在运行的容器 启动容器 删除已停止的容器 强制删除容器 查看容器日志 查看容器内部运行的进程 ​编辑 查看容…

Axure教程—分段滑动条

本文将教大家如何用AXURE中动态面板制作单分段滑动条 一、效果 预览地址:https://c00qrq.axshare.com 下载地址:https://download.csdn.net/download/weixin_43516258/87881401?spm1001.2014.3001.5503 二、功能 滑块滑动到相应的浮点,显示…

【SVN】SVN查看日志时报错:联系服务器时出现问题,条目不可读

目录 0.背景介绍 1.问题原因 2.解决步骤 0.背景介绍 环境:SVN服务器在ubuntu下,SVN客户端在windows下。 最近在搭ubuntu下的SVN的服务器,然后再windows下用SVN客户端将文件上传至服务器保管。 windows下想查看日志时,报错【…

React学习7 redux

redux的三个核心概念 1. action 动作的对象包含2个属性 type:标识属性, 值为字符串, 唯一, 必要属性data:数据属性, 值类型任意, 可选属性例子:{ type: ADD_STUDENT,data:{name: tom,age:18} } 2. reducer 用于初始化状态、加工状态。加工…

健身器材开发方案,带有12位ADC检测、LED屏显的语音IC-N9300

身体锻炼过程中所使用到的所有物品,健身器材类体育用品则主要涉及健身领域,包括室外健身器材和室内健身器材。 每天清晨或傍晚跑跑步,不仅能提高身体素质同时能得到很好的瘦身效果。然而大部分人觉得慢跑等运动过于无聊没有给予运动者本身进行…

【Redis编译安装】---redis-4.0.8

【Redis编译安装】---redis-4.0.8 🔻 一、Redis 编译安装1.1 ⛳ 上传解压1.2 ⛳ 升级gcc环境1.3 ⛳ 编译安装1.3.1 🍁cd 到redis解压目录1.3.2 🍁编译1.3.3 🍁 make test1.3.4 🍁 安装tcl-8.51.3.5 🍁 安装…

shell 第十一章

1.写一个库函数,用定时任务调用这个库函数,每月1号执行 1.sh: 1.1.sh: 2.以免交互的方式实现 ssh 远程登录,密码错误也直接退出,不用人干预 3.以免交互的方式,实现磁盘分区、格式化、挂载

Keysight 34970A数据采集记录仪产品介绍

Keysight 34970A数据采集记录仪 Keysight 34970A数据采集记录仪开关单元由一个 3 插槽主机和一个内置的 6 1/2 位数字万用表组成。每个通道可以单独配置,以测量 11 种不同功能之一,这样既不会增加成本,也不必使用复杂的信号调理附件。您可用…

【干货】PCB材料选择与性能比较

PCB板被广泛应用于电子行业,作为电子设备的重要组成部分之一,负责连接各种电子元件。PCB板的性能直接影响着电子设备的质量和稳定性。而PCB板的材料选择则是影响PCB板性能的关键因素之一。本文将对常见PCB材料进行比较分析,以便于选择适合的材…

直线模组的应用案例

直线模组最早是在德国开发使用的,因其具有单体运动速度快、重复定位精度高、本体质量轻、占设备空间小、寿命长等特点,被广泛应用在各种各样的机械设备中,尤其是自动化领域,基本上都能看到直线模组的身影,那么&#xf…

Target DVS EDI项目开源介绍

近期为了帮助广大用户更好地使用 EDI 系统,我们根据以往的项目实施经验,将成熟的 EDI 项目进行开源。用户安装好知行之桥EDI系统之后,只需要下载我们整理好的示例代码,并放置在知行之桥指定的工作区中,即可开始使用。 …

小程序项目结构与组件基础

文章和代码已经归档至【Github仓库:https://github.com/timerring/front-end-tutorial 】或者公众号【AIShareLab】回复 小程序 也可获取。 文章目录 项目结构了解项目的基本组成结构小程序页面的组成部分json配置文件的作用全局配置文件app.jsonproject.config.jso…

数据仓库基础知识

数据仓库 企业信息应用现状企业对应用集成的需求1. 什么是BI1.1 BI的定义1.2 BI要做的事情1.3 BI的智能1.4 BI应用架构1.5 BI系统架构1.6 BI应用带来的关键效益 2. 什么是数据仓库2.1 数据仓库的概念2.2 数据仓库的特性 3. 数据仓库设计中的几个重要概念3.1 ETL3.2 数据集市&am…

vue2vue3 el-table实现整行拖拽排序功能(使用sortablejs插件)

1、此功能已集成到[TTable组件中]—Vue2TTable组件 、Vue3TTable组件 2、最终效果 3、安装sortablejs npm install sortablejs --save4、Vue2实现方式 <template><el-tableref"el-table":data"tableData":class"{cursor:isCopy,row_sort:…

探究JavaScript:Array方法、原型链继承和JSON

目录 Array对象 构造函数 静态方法 Array.isArray() 实例方法 valueOf&#xff08;&#xff09; toString&#xff08;&#xff09; 对象的继承 构造函数的缺点 prototype属性作用 原型链 读取对象的某个属性的过程&#xff1a; constructor属性 instanceof运算符…

Linux防火墙学习笔记5

iptables规则匹配及动作&#xff1a; 规则&#xff1a;根据规定的匹配条件来尝试匹配每个流经此处的数据包&#xff0c;匹配成功&#xff0c;则由规则指定的处理动作进行处理。规则是由匹配条件和动作组成的。 iptables的规则匹配条件分类&#xff1a; 基本匹配条件&#xff…