SpringCloud系列(15)--Eureka自我保护

news2024/11/20 18:29:56

前言:在上一章节中我们说明了一些关于Eureka的服务发现功能,也用这个功能进行接口的实现,在本章节则介绍一些关于Eureka的自我保护

1、Eureka保护模式概述

保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。默认情况下Eureka Client会定时向Eureka Server端发送心跳包,如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90秒)将该服务从服务注册列表中剔除,但是如果在短时间(90秒)内丢失了大量的服务实例心跳,这时候Eureka Server就会开启自我保护模式(短时间内丢失大量心跳包可能是因为网络不通的原因,这时候Eureka Client是正常运行的,过一会可能网络就恢复了,服务就恢复正常了,但如果因为网络问题没收到心跳包就把服务剔除,这就很冤了,造成严重失误了,所以为了解决这种问题,Eureka提出了保护模块的概念)一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,就是不会注销任何服务实例;简单来说就是某时刻某一个微服务因为网络故障或者其他原因导致不可用了,在一定的时间内Eureka没有收到微服务的心跳反应,但是Eureka不会立刻清理,依旧会对该微服务的信息进行保存,等微服务恢复,这是一种高可用的设计思想(Eureka的保护模式这种高可用设计思想属于CAP理论里面的AP架构)


有兴趣的同学可以简单的了解下CAP理论:

https://blog.csdn.net/m0_64284147/article/details/132258051


综上,自我保护模式是一种应对网络异常的安全保护措施,它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留)也不盲目注销任何健康的微服务,使用自我保护模式,可以让Eureka集群更加的健壮、稳定。

2、Eureka进入保护模式的特征

 如果在Eureka Server的首页看到以下这段提示,则说明Eureka进入了保护模式

3、关闭Eureka的自我保护模式

如果想关闭Eureka的自我保护模式,这时候就可以通过修改配置来实现

(1)分别修改eureka-server7001和eureka-server7002的application.yml文件在eureka参数下加上server:enable-self-preservation: false这一参数,从而关闭Eureka的自我保护模式

例:

eureka-server7001

server:
  port: 7001
eureka:
  instance:
    #eureka服务端的实例名称
    hostname: eureka7001.com
  client:
    #false表示不向服务中心注册自己
    register-with-eureka: false
    #false表示自己端就是注册中心,只需要维护服务实例,并不需要检索服务
    fetch-registry: false
    service-url:
      #设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址
      defaultZone: http://eureka7002.com:7002/eureka/
  server:
    #关闭自我保护模式,不可用服务会被及时被删除
    enable-self-preservation: false

eureka-server7002

server:
  port: 7002
eureka:
  instance:
    #eureka服务端的实例名称
    hostname: eureka7002.com
  client:
    #false表示不向服务中心注册自己
    register-with-eureka: false
    #false表示自己端就是注册中心,只需要维护服务实例,并不需要检索服务
    fetch-registry: false
    service-url:
      #设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址
      defaultZone: http://eureka7001.com:7001/eureka/
  server:
    #关闭自我保护模式,不可用服务会被及时被删除
    enable-self-preservation: false
(2)关闭Eureka的自我保护模式后为了更快的体验到Eureka自我保护模式的关闭,我们在这里也要修改Eureka Server的清理失效服务的时间间隔,修改Eureka Client向Eureka Server发送心跳的时间间隔和让Eureka Server收到最后一次心跳后等待的时间上限

 例:

eureka-server7001

server:
  port: 7001
eureka:
  instance:
    #eureka服务端的实例名称
    hostname: eureka7001.com
  client:
    #false表示不向服务中心注册自己
    register-with-eureka: false
    #false表示自己端就是注册中心,只需要维护服务实例,并不需要检索服务
    fetch-registry: false
    service-url:
      #设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址
      defaultZone: http://eureka7002.com:7002/eureka/
  server:
    #关闭自我保护模式,不可用服务会被及时被删除
    enable-self-preservation: false
    #Eureka服务端清理失效服务的时间间隔(默认是90秒)
    eviction-interval-timer-in-ms: 2000

eureka-server7002

server:
  port: 7002
eureka:
  instance:
    #eureka服务端的实例名称
    hostname: eureka7002.com
  client:
    #false表示不向服务中心注册自己
    register-with-eureka: false
    #false表示自己端就是注册中心,只需要维护服务实例,并不需要检索服务
    fetch-registry: false
    service-url:
      #设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址
      defaultZone: http://eureka7001.com:7001/eureka/
  server:
    #关闭自我保护模式,不可用服务会被及时被删除
    enable-self-preservation: false
    #Eureka服务端清理失效服务的时间间隔(默认是90秒)
    eviction-interval-timer-in-ms: 2000

provider-payment8001

#服务端口号
server:
  port: 8001

#服务名称
spring:
  application:
    name: cloud-payment-service
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource      #当前数据源操作类型
    driver-class-name: com.mysql.cj.jdbc.Driver       #mysql驱动包(mysql驱动包版本是5的要写成com.mysql.jdbc.Driver)
    url: jdbc:mysql://localhost:3306/cloud?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8 #mysql连接路径,记得把cloud这个数据库名改成自己的,或者新建名为cloud的数据库
    username: root
    password: 123456

eureka:
  client:
    #表示是否将自己注册进Eureka Server里,默认为true
    register-with-eureka: true
    #是否从Eureka Server抓取已有的注册信息,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url:
      #defaultZone: http://localhost:7001/eureka
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
  instance:
    instance-id: payment8001
    #访问路径可以显示IP地址
    prefer-ip-address: true
    #Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
    lease-renewal-interval-in-seconds: 1
    #Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
    lease-expiration-duration-in-seconds: 2

#mybatis配置
mybatis:
  mapper-locations: classpath:mapper/*.xml            #扫描类路径下的mapper文件夹下所有的.xml配置文件
  type-aliases-package: com.ken.springcloud.entities  #该包下的所有Entity类都取默认别名

provider-payment8002

#服务端口号
server:
  port: 8002

#服务名称
spring:
  application:
    name: cloud-payment-service
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource      #当前数据源操作类型
    driver-class-name: com.mysql.cj.jdbc.Driver       #mysql驱动包(mysql驱动包版本是5的要写成com.mysql.jdbc.Driver)
    url: jdbc:mysql://localhost:3306/cloud?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8 #mysql连接路径,记得把cloud这个数据库名改成自己的,或者新建名为cloud的数据库
    username: root
    password: 123456

eureka:
  client:
    #表示是否将自己注册进Eureka Server里,默认为true
    register-with-eureka: true
    #是否从Eureka Server抓取已有的注册信息,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url:
      #defaultZone: http://localhost:7001/eureka
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
  instance:
    instance-id: payment8002
    #访问路径可以显示IP地址
    prefer-ip-address: true
    #Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
    lease-renewal-interval-in-seconds: 1
    #Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
    lease-expiration-duration-in-seconds: 2

#mybatis配置
mybatis:
  mapper-locations: classpath:mapper/*.xml            #扫描类路径下的mapper文件夹下所有的.xml配置文件
  type-aliases-package: com.ken.springcloud.entities  #该包下的所有Entity类都取默认别名
(3)查看配置是否生效

重新启动eureka-server7001模块和eureka-server7002模块,最后再启动provider-payment8001模块和provider-payment8002模块,然后分别进入http://eureka7001.com:7001/和http://eureka7002.com:7002/查看效果,可以发现页面上的红色提示变成了THE SELF PRESERVATION MODE IS TURNED OFF. THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.,这说明Eureka的自我保护模式已经关闭了,然后我们也能看到provider-payment8001模块和provider-payment8001模块已经成功注册进Eureka Server里了

(4)停掉两个服务提供者provider-payment8001模块和provider-payment8002模块,然后回到Eureka Server的页面刷新,查看Eureka Server在关闭自我保护模式的情况下对待Eureka Client的情况

可以看到当provider-payment8001模块和provider-payment8002模块停掉后,Eureka Server马上就把provider-payment8001模块和provider-payment8002模块这两个服务剔除了,而不是继续保留,这也进一步验证Eureka的自我保护模式已经关闭

注意:如果想对比Eureka自我保护模式关闭前后的区别,停服务时最好不要在IDEA等工具里面停,最好是用任务管理器关闭服务,因为IDEA关停服务后服务会通知Eureka Server下线了,这样Eureka Server也会立马剔除服务,导致看不出关停自我保护模式前后的区别

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

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

相关文章

带你走进不一样的策略模式

欢迎来到我的博客,代码的世界里,每一行都是一个故事 带你走进不一样的策略模式 前言策略模式简介概念解释 策略模式的结构策略模式优点项目实践之bean策略构思业务策略实现策略接口实现策略上下文业务实现 前言 在编程的世界里,每一次按键都…

Golang对接Ldap(保姆级教程:概念搭建实战)

Golang对接Ldap(保姆级教程:概念&搭建&实战) 最近项目需要对接客户的LDAP服务,于是趁机好好了解了一下。LDAP实际是一个协议,对应的实现,大家可以理解为一个轻量级数据库。用户查询。比如&#xff…

高频前端面试题汇总之Vue篇

1. Vue的基本原理 当一个Vue实例创建时,Vue会遍历data中的属性,用 Object.defineProperty(vue3.0使用proxy )将它们转为 getter/setter,并且在内部追踪相关依赖,在属性被访问和修改时通知变化。 每个组件实…

【ruoyi-vue】登录解析(后端)

调试登录接口 进入实现类可以有 验证码校验 登录前置校验 用户验证 验证码校验 通过uuid获取redis 中存储的验证码信息,获取后对用户填写的验证码数据进行校验比对 用户验证 1.进入控制器的 /login 方法 2.进入security账号鉴权功能,经过jar内的流…

算法-动态规划专题

文章目录 前言 : 动态规划简述1 . 斐波那契模型1.1 泰波那契数列1.2 最小花费爬楼梯1.3 解码方法 前言 : 动态规划简述 动态规划在当前我们的理解下,其实就是一种变相的递归,我们查看一些资料也可以知道,动态规划其实属于递归的一个分支,通过把递归问题开辟的栈帧通过一定的手…

代码随想录第45天|70. 爬楼梯 (进阶)322. 零钱兑换

70. 爬楼梯 &#xff08;进阶&#xff09; 57. 爬楼梯&#xff08;第八期模拟笔试&#xff09; (kamacoder.com) 代码随想录 (programmercarl.com) 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬至多m (1 < m < n)个台阶。你有多少种不同的方法可以爬到楼顶…

企业数字化转型,“业务”先行

在当今时代&#xff0c;数字化转型已经成为企业发展的必经之路。数字化转型&#xff0c;简而言之&#xff0c;就是运用数字技术&#xff0c;对企业运营管理的各个环节进行深度改造&#xff0c;以提升企业的运营效率和市场竞争力。据有关机构研究测算&#xff0c;数字化转型可使…

【静态分析】静态分析笔记07 - 指针分析基础

参考&#xff1a; 【课程笔记】南大软件分析课程7——指针分析基础&#xff08;课时9/10&#xff09; - 简书 -------------------------------------------------------------- 1. 指针分析规则 规则&#xff1a;采用推导形式&#xff0c;横线上面是条件&#xff0c;横线下…

Linux开发板配置静态IP

1、查看网口信息&#xff0c;易知eth0无IP地址 ifconfig2、首先分配一个IP地址 sudo ifconfig eth0 192.168.5.8 up3、此时配置的IP地址只是临时的&#xff0c;当你reboot重启板子上电后&#xff0c;ip地址会消失&#xff0c;因此需要为板子配置静态ip&#xff0c;避免每次上…

说方法不如传授经验向媒体投稿你可以这样

在信息爆炸的时代,作为单位的信息宣传员,肩负着将本单位的重要资讯、活动成果、政策解读等内容有效传播至公众视野的重任。其中,向各类媒体投稿无疑是实现这一目标的重要途径。然而,传统的邮件投稿方式常常让我深感力不从心,费时费力不说,成功率低、出稿慢等问题更是让我和领导…

SQL注入简单总结

一、SQL注入是什么 SQL注入即&#xff1a;是指web应用程序对用户输入数据的合法性没有判断或过滤不严&#xff0c;攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句&#xff0c;在管理员不知情的情况下实现非法操作&#xff0c;以此来实现欺骗数据库服…

【论文推导】基于有功阻尼的转速环PI参数整定分析

前言 在学习电机控制的路上&#xff0c;PMSM的PI电流控制是不可避免的算法之一&#xff0c;其核心在于内环电流环、外环转速环的设置&#xff0c;来保证转速可调且稳定&#xff0c;并且保证较好的动态性能。整个算法仿真在《现代永磁同步电机控制原理及matlab仿真》中已详细给出…

前端项目中使用插件prettier/jscodeshift/json-stringify-pretty-compact格式化代码或json数据

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、json代码格式化-选型二、json-stringify-pretty-compact简单试用三、prettier在前端使用四、查看prettier支持的语言和插件五、使用prettier格式化vue代码最终效果如图&#xff1a; ![在这里插入图片描述](https://im…

3.8设计模式——State 状态模式(行为型)

意图 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 结构 Context&#xff08;上下文&#xff09;定义客户感兴趣的接口&#xff1b;维护一个ConcreteState子类的实例&#xff0c;这个实例定义当前状态。State&#xff08;状态&#xff09;定义…

[x86] OpenBMC简介

什么是 OpenBMC&#xff1f; OpenBMC 被设计为一个完整的开源 Linux 发行版&#xff0c;可以灵活地进行定制以支持不同的 SoC 或主板。 传统的BMC由固件提供商专有构建&#xff0c;是闭源的&#xff0c;这意味着它不具有在开放平台上修改的灵活性。 另一方面&#xff0c;OpenB…

链栈的基本操作(c语言实现)

栈的概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 栈的结构 定义栈…

做抖音小店,“自然流量”和“达人带货”,选择哪个更香?

大家好&#xff0c;我是电商笨笨熊 做抖音小店&#xff0c;关于选择自然流还是达人带货&#xff0c;从推出时就一直争吵到现在&#xff1b; 有人觉得自然流不需要佣金&#xff0c;一次性带来的爆单量很大&#xff1b; 有人觉得达人带货细水长流&#xff0c;虽然需要佣金&…

Docker 网络与资源控制

一 Docker 网络实现原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(docker0)&#xff0c;Docker启动一个容器时会根 据Docker网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c;同时Docker网桥是每个容器的默 认网关。因为在同…

2000-2022年各区县农产品产量数据

2000-2022年县域农产品产量数据 1、时间&#xff1a;2000-2022年 2、指标&#xff1a;统计年度、县域名称、所属地级市、所属省份、地区编码ID、县域代码、产品种类或名称、单位、产量、 3、来源&#xff1a;统计局、县域统计年鉴、各区县政府官网 4、范围&#xff1a;具体…

基于Linux的Ncurse库的贪吃蛇项目

贪吃蛇项目的意义 承上启下&#xff1a;从C语言基础的学习&#xff1a;数据结构链表基础、C变量、流程控制、函数、指针、结构体等。过渡到Linux系统编程&#xff1a;文件编程、进程、线程、通信、第三方等。 Linux终端图形库curses curses的名字起源于"cursor optimiz…