Spring Cloud微服务治理框架深度解析
在学习一个技术之前,首先我们要了解它是做什么的,我们为什么要用它。不然看再多资料都理解不了,因此我们先来讲解下Spring Cloud
Spring Cloud是一套微服务治理框架,几乎考虑到了微服务治理的方方面面。那么接下来具体说下 Spring Cloud在微服务框架中都起到了什么作用,提供了什么便利。
首先我们来看看互联网架构的发展过程:
传统架构发展史
单体架构
单体结构在微小企业比较常见,典型代表就是一个应用,一个数据库、一个Web就可以跑起来了
以下情况可能会选用单体架构:
1.在企业发展初期,为了保证快速上线,采用此方案较为简单灵活。
2.传统企业中垂直度较高,访问压力小的业务。这种模式下对技术要求较低,方便各层次开发人员接手,也能满足客户需求。
单体架构中,技术选型灵活,优先满足快速上线的要求
垂直架构
在单体架构发展一段时间后,公司的业务模式得到了认可,交易量也慢慢的变大了,这时候企业为了应对更大的流量,就会对原有业务进行拆分,比如说:后台系统,前端系统,交易系统等
在这个阶段往往会将系统分为不同层级,每个层级有对应的职责,UI层负责和用户进行交互,业务逻辑层负责具体业务功能,数据库层负责和上层进行数据交换和存储
这个阶段其实就是我们常说的三层,UI层、业务逻辑层、数据层
服务化架构
随着公司再进一步的做大,垂直子系统会越来越多,系统和系统之间的调用关系不断上升
这种情况下,很多公司都会考虑服务的SOA(Service Oriented Architecture)化。
SOA代表面向服务的架构,将应用程序按照不同的职责划分为不同的模块,不同的模块直接通过特定的协议和接口进行交互。
这样将整个系统切分成很多单个组件服务来完成请求,当流量过大时通过水平扩展相应的组件来支撑,所有组件通过交互来满足整体的业务需求。
服务化架构是一套松耦合的架构,服务的拆分原则是服务内部高内聚,服务之间低耦合。
这个阶段一般使用Web Service或者Dubbo来服务治理。
SOA和微服务的区别
服务化架构已经可以解决大部分企业的需求了,那么为什么我们还要研究微服务呢?
它们的区别有如下几点:
1.微服务架构强调业务系统需要彻底的组件化和服务化,一个组件就是一个产品,可以单独对外提供服务
2.微服务不再强调传统SOA架构里面比较重要的ESB企业服务总线
3.微服务强调每个微服务都有自己独立的运行空间,包括数据库资源。
4.微服务架构本身来源于互联网的思路,因此组件对外发布的服务强调HTTP Rest API的方法进行
5.微服务的切分粒度会更小。
总结:微服务架构是SOA架构思想的一种扩展,更加强调服务个体的独立性、拆分粒度更小
所以说了这么多,为什么用Spring Cloud呢?
因为Spring Cloud不能说是微服务框架里最好的技术,也能说是最周全的技术了
Spring Cloud的特性
1.分布式/版本化配置
2.服务注册和发现
3.路由
4.服务和服务之间的调用
5.负载均衡
6.断路器
7.分布式消息传递
这些特性都是由不同的组件来完成
微服务架构
Spring Cloud解决的第一个问题就是:服务与服务之间的解耦。公司在业务高速发展的同时,服务组件也会相应的不断增加。
服务和服务之间有着复杂的互相调用关系,经常有服务A调用服务B,服务B调用服务C和服务D。。。。,随着服务化组件越来越多,它们之间的调用关系也在成指数级别增长,极端情况下如下图:
这样最容易导致的情况就是牵一发而动全身,经常出现由于某个服务更新而没有通知到其他服务,导致上线后惨案频发。
这时就应该进行服务治理,将服务之间的直接依赖转化为服务对服务中心的依赖。
Spring Cloud核心组件 Eureka就可以解决这类问题。
Eureka
Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现。它也是Spring Cloud体系中最重要的核心组件之一。
简单来说,Eureka就是一个服务中心,将所有的可以提供的服务都注册到它这里来管理,调用者需要的时候去注册中心获取,然后再进行调用,避免了服务之间的直接调用,方便后续的水平扩展、故障转移等。
当然如果服务中心挂掉了,那就是影响全部服务,因此需要搭建Eureka集群来保持高可用性,生存中建议最少两台。
随着系统的流量不断增加,需要根据情况来扩展某个服务,Eureka内部已经提供了均衡负载的功能,只需要增加相应的服务端实例即可。
那么系统运行中某个实例挂了怎么办?
Eureka内容有一个心跳检测机制,如果某个实例在规定时间内没有进行通讯则自动被剔除掉,避免了某个实例挂掉而影响服务。
因此使用Eureka就自动具备了注册中心、负载均衡、故障转移等功能。
Hystrix
在微服务的架构中通常会有多个服务层调用,一个服务的故障可能会导致级联故障,最终造成整个系统不可用的情况,这种现象被称为服务雪崩效应。
服务雪崩效应是一种因 “服务提供者” 的不可用导致 “服务消费者” 的不可用,并将不可用逐步扩大的过程
例如:A是服务提供者,B是A的服务消费者,C和D是B的服务消费者。A不可用引发了B的不可用,B又引发了C和D的不可用,然后就像滚雪球一样,雪崩效应就形成了。
在这种情况下就需要整个服务机构具有故障隔离的功能,避免某一个服务挂掉影响全局。在Spring Cloud中Hystrix组件就扮演了这个角色
Hystrix会在某个服务连续调用N次没有响应的情况下,立刻通知调用端调用失败,避免调用端持续等待而影响了整体服务。Hystrix间隔时间会再次检查此服务,如果服务恢复将继续提供服务。
这种机制被称为服务隔离或服务熔断。
当熔断发生时需要迅速的响应来解决问题,避免故障进一步扩散,那么对熔断的监视就变得非常重要。
熔断的监视现在有两款工具:Hystrix-dashboard和Turbine。
Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard 我们可以直观地看到各个Hystrix Command的请求响应时间,请求成功率等数据。
但是只使用Hystrix Dashboard的话,你只能看到单个应用内的服务信息,这是不够的。
这时我们需要一个汇总系统内多个服务数据,并显示的Hystrix Dashboard上,这个工具就是Turbine。
效果如下:
配置中心
随着微服务不断的增多,每个微服务都有自己对应的配置文件。在研发过程中有测试环境、UAT环境、生产环境,因此每个微服务至少三个环境的配置文件。
这么多的配置文件,如果需要修改某个公共服务的配置信息,如:缓存、数据库等,难免会产生混乱,这个时候就需要引入Spring Cloud 另一个组件:Spring Cloud Config。
Spring Cloud Config
Spring Cloud Config 是一个解决分布式系统的配置管理系统。它包含了Client和Server两个部分,Server提供配置文件的存储、以接口的方式将配置文件的内容提供出去,Client通过接口获取数据,并依据此数据初始化自己的应用。
具体实现是Server端将所有配置文件服务化,需要配置文件的服务实例去Config Server获取对应的数据。将所有配置文件统一整理,避免了配置文件碎片化。
如果服务运行期间改变配置文件,服务不会得到最新配置信息,需要解决这个问题就要引入Refresh。它可以在服务的运行期间重新加载配置文件
当所有的配置文件都存储在配置中心时,配置中心就变成了一个非常重要的组件。如果配置中心出问题就会导致很严重的后果,因此在生产中建议对配置中心做集群,来支持配置中心高可用性。
Spring Cloud Bus
上面的Refresh方案虽然可以解决单个微服务运行期间重载配置信息的问题,但是在真正的实践生产中,可能会有N多个服务需要重新配置。
每次都手动Refresh将是一个巨大的工作量,这时就需要另一个解决方案 Spring Cloud Bus
Spring Cloud Bus 是通过轻量消息代理连接各个分布的节点。一般会用在广播状态变化(例如配置变化)或者其他的消息指令中
Spring Cloud Bus 的一个核心思想是通过分布式的启动器对Spring Boot应用进行扩展,也可以用来创建一个或多个应用之间的通信频道。目前唯一实现的方式是用AMQP消息代理作为通道
Spring Cloud Bus 是轻量级的通讯组件,也可以用在其他类似的场景中。有了Spring Cloud Bus之后,当我们改变配置文件提交到版本库中时,会自动触发对应实例的Refresh
服务网关
在微服务架构模式下,后端服务的实例数一般是动态的,对于客户端而言很难发现动态改变的服务实例的访问地址信息。
因此在基于微服务的项目中为了简化前端的调用逻辑,通常会引入API Gateway作为轻量级网管,同时API Gateway中也会实现相关的认证逻辑,从而简化了内部服务之间相互调用的复杂度。
Spring Cloud 体系中支持API Gateway落地的技术就是Zuul。Spring Cloud Zuul路由是微软服务架构中不可或缺的一部分,提供动态路由,监控,弹性,安全等边缘服务。
Zuul是Netflix出品的一个基于JVM路由的服务端的负载均衡。
他的具体作用就是服务转发,接收并转发所有内外部的客户端调用。使用Zuul可以作为资源的统一访问入口,同时也可以在网关做一些权限校验等类似的功能。
链路跟踪
随着服务数量越来越多,对调用链的分析会越来越复杂,如服务之间的调用关系,某个请求对应的调用链,调用之间消费的时间等,对这些信息进行监控就成了问题
在实际的使用中,我们需要监控服务和服务之间通讯的各项指标,这些数据将是我们改进系统架构的主要依据。
因此分布式的链路跟踪就变的非常重要,Spring Cloud也给出了具体的解决方案:Spring Cloud Sleuth和Zipkin。
Spring Cloud Sleuth 为服务之间调用提供链路跟踪。通过Sleuth可以很清楚的了解到一个服务请求经过了哪些服务,每个服务处理花费了多长时间。从而让我们可以很方便的理清各个微服务之间的调用关系。
Zipkin 是 Twitter 的一个开源项目,允许开发者收集Twitter各个服务上的监控数据,并提供查询接口
总结
我们从整体上来看一下Spring Cloud各个组件如何来配套使用
-
Eureka 负责服务的注册与发现,很好地将各服务连接起来。
-
Hystrix 负责监控服务之间的调用情况,连续多次失败进行熔断保护。
-
Hystrix dashboard,Turbine 负责监控 Hystrix 的熔断情况,并给予图形化的展示。
-
Spring Cloud Config 提供了统一的配置中心服务。
-
当配置文件发生变化的时候,Spring Cloud Bus 负责通知各服务去获取最新的配置信息。
-
所有对外的请求和服务,我们都通过Zuul来进行转发,起到 API 网关的作用。
-
最后我们使用 Sleuth+Zipkin 将所有的请求数据记录下来,方便我们进行后续分析。
相关文章:

Spring Cloud微服务治理框架深度解析
在学习一个技术之前,首先我们要了解它是做什么的,我们为什么要用它。不然看再多资料都理解不了,因此我们先来讲解下Spring Cloud Spring Cloud是一套微服务治理框架,几乎考虑到了微服务治理的方方面面。那么接下来具体说下 Spring…...

设计模式之原型模式Prototype的C++实现
1、原型模式提出 在软件功能设计中,经常面临着“某些结构复杂的对象”的创建工作,且创建的对象想拥有其他对象在某一刻的状态,则可以使用原型模型。原型模型是通过拷贝构造函数来创建对象,并且该对象拥有其他对象在某一刻的状态。…...

Java 中操作 Redis
文章目录 一、Redis 常用数据类型二、Redis 常用操作命令1. 字符串命令2. 哈希命令3. 列表命令4. 集合命令5. 有序集合命令6. 通用命令 三、在 Java 中操作 Redis1. 导入 maven 坐标2. 配置 Redis 数据源3. 编写配置类 四、在代码中的具体使用 一、Redis 常用数据类型 Redis 存…...

数据结构--最短路径 Dijkstra算法
数据结构–最短路径 Dijkstra算法 Dijkstra算法 计算 b e g i n 点到各个点的最短路 \color{red}计算\ begin\ 点到各个点的最短路 计算 begin 点到各个点的最短路 如果是无向图,可以先把无向图转化成有向图 我们需要2个数组 final[] (标记各顶点是否已…...

在 Linux 虚拟机上使用 Azure 自定义脚本扩展版本
参考 azure创建虚拟机,创建虚拟机注意入站端口规则开放80端口、 2.转到资源,点击扩展应用程序,创建存储账户,创建容器,上传文件,选择文件,会自动执行部署。 apt-get update -y && apt-get insta…...

W5500-EVB-PICO 做UDP Server进行数据回环测试(七)
前言 前面我们用W5500-EVB-PICO 开发板在TCP Client和TCP Server模式下,分别进行数据回环测试,本章我们将用开发板在UDP Server模式下进行数据回环测试。 UDP是什么?什么是UDP Server?能干什么? UDP (User Dataqram P…...

ES搜索引擎入门+最佳实践(九):项目实战(二)--elasticsearch java api 进行数据增删改查
本篇是这个系列的最后一篇了,在这之前可以先看看前面的内容: ES搜索引擎入门最佳实践(一)_flame.liu的博客-CSDN博客 ES搜索引擎入门最佳实践(二)_flame.liu的博客-CSDN博客 ES搜索引擎入门最佳实践(三)_flame.liu的博客-CSDN博客 ES搜索引擎入门最佳实践(四)_flame.liu的博…...

android内存分析工具记录,请利用好最后2个神器
相机见证了java内存暴增和native持续增长的问题,因此这里记录一下使用的工具情况,方便后续继续使用 一、java 内存 如果是java层的内存可以直接借助leakCanary工具,配置也很简单,直接在build.gradle中添加依赖即可: …...

安科瑞变电所运维平台在电力系统中应用分析
摘要:现代居民生活、工作对电力资源的需求量相对较多,给我国的电力产业带来了良好的发展机遇与挑战。探索电力系统基本构成, 将变电运维安全管理以及相应的设备维护工作系统性开展,能够根据项目实践工作要求,将满足要求…...

uniapp开发微信小程序使用painter将页面转换为图片并保存到本地相册
引言 我使用到painter的原因是,在uniapp开发微信小程序时,需要将一个页面的内容转换成图片保存到本地相册。 起初在网上找到很多都是在uniapp中使用 html2canvas 将网页转换成图片再jspdf将图片转换为pdf,但是这种方式在小程序环境不支持&am…...

790. 数的三次方根
文章目录 QuestionIdeasCode Question 给定一个浮点数 n ,求它的三次方根。 输入格式 共一行,包含一个浮点数 n 。 输出格式 共一行,包含一个浮点数,表示问题的解。 注意,结果保留 6 位小数。 数据范围 −10000≤…...

POSTGRESQL 关于2023-08-14 数据库自动启动文章中使用KILL 来进行配置RELOAD的问题解释...
开头还是介绍一下群,如果感兴趣Polardb ,mongodb ,MySQL ,Postgresql ,redis ,SQL SERVER ,ORACLE,Oceanbase 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请加 liuaustin3微信号 &…...

vue 使用插件高德地图--vue-amap
第一步:安装 vue-amap npm install vue-amap第二步:在你的 Vue 项目中注册 vue-amap: // main.js import Vue from vue; import VueAMap from vue-amap;Vue.use(VueAMap);VueAMap.initAMapApiLoader({// 高德开发者平台申请key值key: cc9c098…...

减速比如何计算
减速比是用来衡量机械系统中输入轴和输出轴转速之间的比例关系,通常用来描述传动装置(如齿轮传动、皮带传动等)的效果。计算减速比的公式取决于传动装置的类型。以下是一些常见传动装置的减速比计算方法: 齿轮传动: 对…...

HarmonyOS/OpenHarmony应用开发-ArkTSAPI组件总体分类与说明(下)
六、文本与输入 Text 显示一段文本的组件。 Span 作为Text组件的子组件,用于显示行内文本片段的组件。 Search 搜索框组件,适用于浏览器的搜索内容输入框等应用场景。 TextArea 多行文本输入框组件,当输入的文本内容超过组件宽度时会自动换行…...

势函数和鞅的停时定理
前置芝士 鞅: 鞅是一类特殊的随机过程,假设我们从一开始就在观察一场赌博游戏,现在已经得到了前t秒的观测值,那么当第t1 秒观测值的期望等于第t秒的观测值时,我们称这是一个公平赌博游戏。 具体来说,对于…...

途乐证券-炒股开户流程是怎样的?
炒股是一种危险较大但收益也相对较高的出资方法,而开户则是出资炒股的前提。跟着科技的开展,炒股开户已经能够在线完结,但流程相对来说仍是比较繁琐的。那么,炒股开户流程是怎样的呢?下面从多个视点剖析。 一、炒股开户…...

Eclipse如何设置快捷键
在eclopse设置注释行和取消注释行 // 打开eclipse,依次打开:Window -> Preferences -> General -> Key,...

刷享全球美好 中信银行信用卡推出跨境消费系列活动
来源 | 镭射财经(leishecaijing) 日前,文旅部办公厅发布通知,恢复全国旅行社及在线旅游企业经营中国公民赴有关国家和地区(第三批)出境团队旅游和“机票酒店”业务,出境跟团游国家和地区由此前…...

LeetCode算法心得——限制条件下元素之间的最小绝对差(TreeSet)
大家好,我是晴天学长,今天用到了Java一个非常实用的类TreeSet,能解决一些看起来棘手的问题。 1 )限制条件下元素之间的最小绝对差 2) .算法思路 初始化变量:n为列表nums的大小。 min为整型最大值,用于记录…...

MySQL表的基础操作(crud)
1. 新增(Create) insert into 表名 values (值, 值…); 此处列出的这些值,的数目和类型要和表的列相匹配。 -- 在student 表中插入学号1,姓名zhangsan的数据 insert into student values(1, zhangsan); -- 指定列插入 insert into student …...

vue中的activated和deactivated
目录 一、简介二、使用 一、简介 当页面被keep-alive缓存下来的时候,vue提供两个钩子函数 activated被 keep-alive 缓存的组件激活时调用。deactivated被 keep-alive 缓存的组件失活时调用。 当keepalive页面缓存,有activated钩子和created钩子函数时 …...

unity 发布报错 The type or namespace name `UnityEditor‘ could not be found.
引用了UnityEditor的内容,发布当然会报错啦 加上宏判断就好啦...

在ubuntu中将dict.txt导入到数据库sqlite3
将dict.txt导入到数据库 #include <head.h> #include <sqlite3.h> int do_insert(int i,char *str,sqlite3 *db); int main(int argc, const char *argv[]) {//创建泵打开一个数据库sqlite3 *db NULL;if(sqlite3_open("./my.db",&db) ! SQLITE_OK){…...

nginx 代理postgresql
首先,Nginx为我们的数据库增加了额外的安全层。Nginx提供了一整套的选项,这使得管理访问和保护数据库变得很容易。例如,我们可以配置为只有一小部分IP地址可以访问数据库。 PostgreSQL不使用HTTP或HTTPS,而是使用一个新块儿strea…...

小程序 CSS-in-JS 和原子化的另一种选择
小程序 CSS-in-JS 和原子化的另一种选择 小程序 CSS-in-JS 和原子化的另一种选择 介绍快速开始 pandacss 安装和配置 0. 安装和初始化 pandacss1. 配置 postcss2. 检查你的 panda.config.ts3. 修改 package.json 脚本4. 全局 css 注册 pandacss5. 配置的优化与别名 weapp-pand…...

flutter项目 环境搭建
开发flutter项目 搭建工具环境 flutter项目本身 所需开发工具环境 flutter 谷歌公司开发 系统支持库 镜像库 搭建流程: flutter 官网: https://flutter.dev/community/china //步骤1 .bash_profile touch .bash_profile pwd /Users/haijunyan open ~ e…...

PG-DBA培训12:PostgreSQL物理备份与恢复实战
一、风哥PG-DBA培训12:PostgreSQL物理备份与恢复实战 课程目标: 本课程由风哥发布的基于PostgreSQL数据库的系列课程,本课程属于PostgreSQL备份恢复与迁移升级阶段之PostgreSQL物理备份与恢复实战,学完本课程可以掌握࿱…...

饿了么大数据开发凉经
1 一个mapreduce进程会启动多少map进程多少reduce进程* 1)map数量由处理的数据分成的block数量决定default_num total_size / split_size; 2)reduce数量为job.setNumReduceTasks(x)中x 的大小。不设置的话默认为 1。 2 讲下shuffle的过程 shuffle分为…...

前端安全:XSS 与 CSRF 安全防御
在当今数字化的时代,前端安全性变得愈发重要。跨站脚本攻击(XSS)和跨站请求伪造(CSRF)是常见的前端安全威胁,但通过一些简单的防御策略,我们可以有效地保护我们的应用程序和用户信息。本文将为您…...