Spring Cloud原理

2023-10-28

之前一直在看《Spring Cloud微服务实战》,最近又看了公众号石衫的架构笔记的《拜托!面试请不要再问我Spring Cloud底层原理》,对Spring Cloud的主要组件的原理有了更深的理解,特地做一下总结

一、Spring Cloud核心组件:Eureka

(1)Netflix Eureka

1)、Eureka服务端:也称服务注册中心,同其他服务注册中心一样,支持高可用配置。如果Eureka以集群模式部署,当集群中有分片出现故障时,那么Eureka就转入自我保护模式。它允许在分片故障期间继续提供服务的发现和注册,当故障分片恢复运行时,集群中其他分片会把它们的状态再次同步回来

2)、Eureka客户端:主要处理服务的注册与发现。客户端服务通过注解和参数配置的方式,嵌入在客户端应用程序的代码中,在应用程序运行时,Eureka客户端想注册中心注册自身提供的服务并周期性地发送心跳来更新它的服务租约。同时,它也能从服务端查询当前注册的服务信息并把它们缓存到本地并周期性地刷新服务状态

3)、Eureka Server的高可用实际上就是将自己作为服务向其他注册中心注册自己,这样就可以形成一组互相注册的服务注册中心,以实现服务清单的互相同步,达到高可用效果

(2)Eureka详解

在这里插入图片描述

1)、服务提供者

A.服务注册

服务提供者在启动的时候会通过发送REST请求的方式将自己注册到Eureka Server上,同时带上了自己服务的一些元数据信息。Eureka Server接收到这个REST请求之后,将元数据信息存储在一个双层结构Map中,其中第一层的key是服务名,第二层的key是具体服务的实例名

在这里插入图片描述

B.服务同步

两个服务提供者分别注册到了两个不同的服务注册中心上,也就是说,它们的信息分别被两个服务注册中心所维护。此时,由于服务注册中心之间因互相注册为服务,当服务提供者发送注册请求到一个服务注册中心时,它会将该请求转发给集群中相连的其他注册中心,从而实现注册中心之间的服务同步。通过服务同步,两个服务提供者的服务信息就可以通过这两台服务注册中心中的任意一台获取到

C.服务续约

在注册完服务之后,服务提供者会维护一个心跳用来持续告诉Eureka Server:“我还活着”,以防止Eureka Server的剔除任务将该服务实例从服务列表中排除出去,我们称该操作为服务续约

# 定义服务续约任务的调用间隔时间,默认30秒
eureka.instance.lease-renewal-interval-in-seconds=30
# 定义服务失效的时间,默认90秒
eureka.instance.lease-expiration-duration-in-seconds=90

2)、服务消费者

A.获取服务

当我们启动服务消费者的时候,它会发送一个REST请求给服务注册中心,来获取上面注册的服务清单。为了性能考虑,Eureka Server会维护一份只读的服务清单来返回给客户端,同时该缓存清单会每隔30秒更新一次

# 缓存清单的更新时间,默认30秒
eureka.client.registry-fetch-interval-seconds=30

B.服务调用

服务消费者在获取服务清单后,通过服务名可以获得具体提供服务的实例名和该实例的元数据信息。在Ribbon中会默认采用轮询的方式进行调用,从而实现客户端的负载均衡

对于访问实例的选择,Eureka中有Region和Zone的概念,一个Region中可以包含多个Zone,每个服务客户端需要被注册到一个Zone中,所以每个客户端对应一个Region和一个Zone。在进行服务调用的时候,优先访问同处一个Zone中的服务提供方,若访问不到,就访问其他的Zone

C.服务下线

当服务实例进行正常的关闭操作时,它会触发一个服务下线的REST请求给Eureka Server,告诉服务注册中心:“我要下线了”。服务端在接收到请求之后,将该服务状态置为下线(DOWN),并把该下线事件传播出去

3)、服务注册中心

A.失效剔除

Eureka Server在启动的时候会创建一个定时任务,默认每隔一段时间(默认为60秒)将当前清单中超时(默认为90秒)没有续约的服务剔除出去

B.自我保护

在服务注册中心的信息面板中出现红色警告信息:

在这里插入图片描述

该警告就是触发了Eureka Server的自我保护机制。Eureka Server在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%,如果出现低于的情况,Eureka Server会将当前的实例注册信息保护起来,让这些实例不会过期,尽可能保护这些注册信息。但是,在这段保护期间内实例若出现问题,那么客户端很容易拿到实际已经不存在的服务实例,会出现调用失败的情况,所以客户端必须要有容错机制,比如可以使用请求重试、断路器等机制

# 关闭保护机制,以确保注册中心可以将不用的实例正确剔除(本地调试可以使用,线上不推荐)
eureka.server.enable-self-preservation=false

二、Spring Cloud核心组件:Ribbon

Ribbon是一个基于HTTP和TCP的客户端负载均衡器,它可以在通过客户端中配置的ribbonServerList服务端列表去轮询访问以达到服务均衡的作用。当Ribbon和Eureka联合使用时,Ribbon的服务实例清单RibbonServerList会被DiscoveryEnabledNIWSServerList重写,扩展成从Eureka注册中心中获取服务端列表。同时它也会用NIWSDiscoveryPing来取代IPing,它将职责委托给Eureka来去定服务端是否已经启动

在客户端负载均衡中,所有客户端节点都维护着自己要访问的服务端清单,而这些服务端的清单来自于服务注册中心(比如Eureka)。在客户端负载均衡中也需要心跳去维护服务端清单的健康性,只是这个步骤需要与服务注册中心配合完成

通过Spring Cloud Ribbon的封装,我们在微服务架构中使用客户端负载均衡调用只需要如下两步:

  • 服务提供者只需要启动多个服务实例并且注册到一个注册中心或是多个相关联的服务注册中心
  • 服务消费者直接通过调用被@LoadBalanced注解修饰过的RestTemplate来实现面向服务的接口调用

三、Spring Cloud核心组件:Feign

Feign的关键机制是使用了动态代理

1)、首先,对某个接口定义了@FeignClient注解,Feign就会针对这个接口创建一个动态代理

2)、接着调用接口的时候,本质就是调用Feign创建的动态代理

3)、Feign的动态代理会根据在接口上的@RequestMapping等注解,来动态构造要请求的服务的地址

4)、针对这个地址,发起请求、解析响应

Feign是和Ribbon以及Eureka紧密协作的

1)、首先Ribbon会从Eureka Client里获取到对应的服务注册表,也就知道了所有的服务都部署在了哪些机器上,在监听哪些端口

2)、然后Ribbon就可以使用默认的Round Robin算法,从中选择一台机器

3)、Feign就会针对这台机器,构造并发起请求

四、Spring Cloud核心组件:Hystrix

在微服务架构中,存在着那么多的服务单元,若一个单元出现故障,就很容易因依赖关系而引发故障的蔓延,最终导致整个系统的瘫痪,这样的架构相较传统架构更加不稳定。为了解决这样的问题,产生了断路器等一系列的服务保护机制

在分布式架构中,当某个服务单元发生故障之后,通过断路器的故障监控,向调用方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延

Hystrix具备服务降级、服务熔断、线程和信号隔离、请求缓存、请求合并以及服务监控等强大功能

Hystrix使用舱壁模式实现线程池的隔离,它会为每一个依赖服务创建一个独立的线程池,这样就算某个依赖服务出现延迟过高的情况,也只是对该依赖服务的调用产生影响,而不会拖慢其他的依赖服务

五、Spring Cloud核心组件:Zuul

Spring Cloud Zuul通过与Spring Cloud Eureka进行整合,将自身注册为Eureka服务治理下的应用,同时从Eureka中获得了所有其他微服务的实例信息

对于路由规则的维护,Zuul默认会将通过以服务名作为ContextPath的方式来创建路由映射

Zuul提供了一套过滤器机制,可以支持在API网关无附上进行统一调用来对微服务接口做前置过滤,已实现对微服务接口的拦截和校验

六、总结

  • Eureka:各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里
  • Ribbon:服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台
  • Feign:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求
  • Hystrix:发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题
  • Zuul:如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Cloud原理 的相关文章

随机推荐

  • 怎么将服务器中图片显示出来,服务器显示图片

    服务器显示图片 内容精选 换一换 将图片导入图片索引库 该图片可以是同一区域OBS桶内的图片或请求消息体里的图片 只有导入图片索引库的图片方可被搜索到 添加或搜索的图片存储在OBS的桶中时 需要对OBS的桶授权 在图像搜索服务管理控制台实例
  • sublim python提示插件

    python解释器的路径 python interpreter C Users xy AppData Local Programs Python Python36 32 python exe 去掉白框 anaconda linting fa
  • SpringCloud服务发现-ribbon

    服务消费者 api order add 通过 eureka 查找服务提供者 order add 通过服务调 组件调 提供者 创建springboot应用 添加依赖 eureka server ribbon 配置application yml
  • 智能车图像处理20-进阶篇12--正入十字补线1

    前言 希望大家多多点赞评论收藏哦 不懂的地方评论区留言就好 这篇文章主要讲述基本的正入十字补线方法 场景图 效果图 一 函数主体 思路讲解 void buzhongxian2 secondmid 0 if
  • 基于减法优化SABO优化ELM(SABO-ELM)负荷预测(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及数据 1 概述 基于减法优化的 SABO ELM Sub
  • IDEA反编译jar包源码

    1 maven 项目查看jar源码 如何在idea中查看jar包源码 文章目录 准备jar包 idea打开文件夹 最后一步 准备jar包 例如 我准备看resin的jar 在桌面准备了一份 idea打开文件夹 在idea中file gt o
  • spring redis 永不过期_Springboot-Redis分布式锁

    随着现在分布式架构越来越盛行 在很多场景下需要使用到分布式锁 分布式锁的实现有很多种 比如基于数据库 zookeeper 等 本文主要介绍使用 Redis 做分布式锁的方式 并封装成spring boot starter 方便使用 一 Re
  • C++输出中文字符 C/C++多字节字符与宽字符的输出

    原文 http www cnblogs com lixiaohui ambition archive 2012 07 17 2596490 html C 输出中文字符 1 cout 场景1 在源文件中定义 const char str 中文
  • (一)TiDB简介

    TiDB是PingCAP公司自主设计 研发的开放源分布式关系型数据库 NewSQL 是一个款同时支持在线事务处理与在线分析处理 Hybird Transactional and Analytical Processing HTAP 的融合型
  • Android Studio JNI开发入门教程

    概述 在Andorid Studio不支持JNI开发之前大家一般都是使用Eclipse开发JNI 各种配置让人觉得很蛋疼 从Andorid Studio支持JNI开发后 让我们开发JNI变的如此简单 下面我就介绍一下Android Stud
  • Python+Selenium_UI自动化操作(1)——将浏览器最大化

    UI自动化 最大化浏览器 语法 maximize window unittest框架执行顺序 1 先执行setUp 做测试数据准备 2 执行测试用例方法testXXXX 测试用例都是以test开头的方法 可以有多个测试用例 3 所有的测试用
  • LInux脚本- 将一个路径下的前500个文件复制到另一个路径下

    需求 从 home majn llvm project extract main 路径下复制前500个 c 文件到 home majn llvm project extract main 500 目录 以下是一个用于实现该功能的 Bash
  • 将本地的代码上传到github ,Github提交更改的代码,

    1 将本地的代码上传到github 首先你需要一个github账号 所有还没有的话先去注册吧 https github com 我们使用git需要先安装git工具 这里给出下载地址 下载后一路直接安装即可 https git for win
  • OpenvSwitch实现简单VLAN

    需求 现有拓扑结构如下的网络结构 s1 s4为交换机 h1 h9为主机 现欲让单数主机 h1 h3 h5 h7 h9 之间互相能ping通 双数主机之间互相能够ping通 但单数和双数主机之间不能访问 拓扑结构 s1
  • BigDecimal的用法详解(保留两位小数,四舍五入,数字格式化,科学计数法转数字,数字里的逗号处理)

    原文地址 https blog csdn net ochangwen article details 51531866 一 简介 Java在java math包中提供的API类BigDecimal 用来对超过16位有效位的数进行精确的运算
  • 深度学习小车中的cv应用

    深度学习系列教程 深度学习小车中cv应用 一 get images py中的cv应用 1 调用摄像头demo 2 操作视频文件demo 深度学习小车中cv应用 主要解决串口问题 一 get images py中的cv应用 get image
  • 程序员的烦心事——工作计划

    差不多每个程序员都要写工作计划 尽管工作计划的格式和提交流程随公司和项目组的不同而有所差别 但不管是哪种方式程序员的工作计划都是在详细设计完成之后编码开始之前进行的 有些项目组会根据它来制定进度计划 有些则用于进度计划的修订 无论是哪种情况
  • 为何要学习计算机基础

    一 什么是计算机 计算机是一种能够按照指令对各种数据和信息进行自动加工和处理的电子设备 电脑系统分为硬件和软件两大部分 硬件相当于人的身体 而软件相当于人的灵魂 而一套完整的计算机系统分为 计算机硬件 操作系统 软件 程序员开发的就是软件
  • 模拟实验室合成器插件-Arturia Analog Lab v5.2.0 WiN

    STANDALONE VSTi VSTi3 AAX x64 Minta Foundry Mellotron Expansion 01 02 4 28GB 通过模拟实验室 您可以轻松访问我们屡获殊荣的V系列中6500多种最热门的预设 包含所有
  • Spring Cloud原理

    之前一直在看 Spring Cloud微服务实战 最近又看了公众号石衫的架构笔记的 拜托 面试请不要再问我Spring Cloud底层原理 对Spring Cloud的主要组件的原理有了更深的理解 特地做一下总结 一 Spring Clou