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

前言:在上一章节中我们说明了一些关于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.comclient:#false表示不向服务中心注册自己register-with-eureka: false#false表示自己端就是注册中心,只需要维护服务实例,并不需要检索服务fetch-registry: falseservice-url:#设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址defaultZone: http://eureka7002.com:7002/eureka/server:#关闭自我保护模式,不可用服务会被及时被删除enable-self-preservation: false

eureka-server7002

server:port: 7002
eureka:instance:#eureka服务端的实例名称hostname: eureka7002.comclient:#false表示不向服务中心注册自己register-with-eureka: false#false表示自己端就是注册中心,只需要维护服务实例,并不需要检索服务fetch-registry: falseservice-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.comclient:#false表示不向服务中心注册自己register-with-eureka: false#false表示自己端就是注册中心,只需要维护服务实例,并不需要检索服务fetch-registry: falseservice-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.comclient:#false表示不向服务中心注册自己register-with-eureka: false#false表示自己端就是注册中心,只需要维护服务实例,并不需要检索服务fetch-registry: falseservice-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-servicedatasource: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: rootpassword: 123456eureka:client:#表示是否将自己注册进Eureka Server里,默认为trueregister-with-eureka: true#是否从Eureka Server抓取已有的注册信息,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡fetch-registry: trueservice-url:#defaultZone: http://localhost:7001/eurekadefaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eurekainstance: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-servicedatasource: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: rootpassword: 123456eureka:client:#表示是否将自己注册进Eureka Server里,默认为trueregister-with-eureka: true#是否从Eureka Server抓取已有的注册信息,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡fetch-registry: trueservice-url:#defaultZone: http://localhost:7001/eurekadefaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eurekainstance: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.mzph.cn/news/828686.shtml

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

相关文章

论文辅助笔记:LLM-Mob metric测量

0 导入库 import os import pandas as pd from sklearn.metrics import f1_score import ast import numpy as np1 基本的metric计算方式 1.1 get_acc1_f1 def get_acc1_f1(df):#计算top1 prediction的准确度和f1 scoreacc1 (df[prediction] df[ground_truth]).sum() / le…

开源数据集分享———猫脸码客

猫脸码客作为一个专注于开源数据集分享的公众号,致力于为广大用户提供丰富、优质的数据资源。我们精心筛选和整理各类开源数据集,涵盖机器学习、深度学习、自然语言处理等多个领域,以满足不同用户的需求。 (https://img-blog.csdnimg.cn/d98…

Exploiting CXL-based Memory for Distributed Deep Learning——论文泛读

ICPP 2022 Paper CXL论文阅读笔记整理 问题 深度学习(DL)正被广泛用于解决不同领域的科学应用中的复杂问题。DL应用程序使用大规模高性能计算(HPC)系统来训练给定的模型,需要消耗大量数据。这些工作负载具有很大的内…

Git for Windows 下载与安装

当前环境:Windows 8.1 x64 1 打开网站 https://git-scm.com/ ,点击 Downloads 。 2 点击 Windows 。 3 选择合适的版本,这里选择了 32-bit Git for Windows Portable。 4 解压下载后的 PortableGit-2.44.0-32-bit.7z.exe ,并将 P…

使用 Flask 和 WTForms 构建一个用户注册表单

在这篇技术博客中,我们将使用 Flask 和 WTForms 库来构建一个用户注册表单。我们将创建一个简单的 Flask 应用,并使用 WTForms 定义一个注册表单,包括用户名、密码、确认密码、邮箱、性别、城市和爱好等字段。我们还将为表单添加验证规则&…

好用的在线客服系统PHP源码(开源代码+终身使用+安装教程) 制作第一步

创建一个在线客服系统是一个涉及多个步骤的过程,包括前端界面设计、后端逻辑处理、数据库设计、用户认证、实时通信等多个方面。以下是使用PHP制作在线客服系统的第一步:需求分析和系统设计。演示:ym.fzapp.top 第一步:需求分析 确…

分布式技术在文本摘要生成中的应用

摘要 自然语言处理首先要应对的是如何表示文本以供机器处理,随着网络技术的发展和信息的公开,因特网上可供访问的数字文档成爆炸式的增长,文本摘要生成逐渐成为了自然语言处理领域的重要研究课题。本文主要介绍了分布式技术在文本摘要生成中…

基于springboot+vue+Mysql的广场舞团管理系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

猫头虎分享已解决Bug || TypeError: Cannot read property ‘map‘ of undefined**

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

智慧养猪场视频AI智能监控与可视化管理方案

在科技日新月异的今天,智能化、自动化已成为众多行业追求的方向。养猪业作为传统农业的重要组成部分,同样迎来了技术革新的春风。特别是随着人们对食品安全等问题的日益关注,养猪场视频监控监管方案的智能化升级显得尤为重要。 养猪场视频智…

Android11适配

1.分区存储 1.1.背景 Android 11 进一步增强了平台功能,为外部存储设备上的应用和用户数据提供了更好的保护。作为这项工作的一部分,平台引入了进一步的改进,以简化向分区存储的转换。 为了让用户更好地控制自己的文件,保护用户…

(C++) share_ptr 之循环引用

文章目录 🚩前言🚩循环引用🕹️例子1Code😭shared_ptr (错误)😂weak_ptr (正确)😭unique_ptr (错误) 🕹️例子2Code &…

Vu3+QuaggaJs实现web页面识别条形码

一、什么是QuaggaJs QuaggaJS是一个基于JavaScript的开源图像识别库,可用于识别条形码。 QuaggaJs的作用主要体现在以下几个方面: 实时图像处理与识别:QuaggaJs是一款基于JavaScript的开源库,它允许在Web浏览器中实现实时的图像…

LORA详解

参考论文: low rank adaption of llm 背景介绍: 自然语言处理的一个重要范式包括对一般领域数据的大规模预训练和对特定任务或领域的适应处理。在自然语言处理中的许多应用依赖于将一个大规模的预训练语言模型适配到多个下游应用上。这种适配通常是通过…

DiT论文精读Scalable Diffusion Models with Transformers CVPR2023

Scalable Diffusion Models with Transformers CVPR2023 Abstract idea 将UNet架构用Transformer代替。并且分析其可扩展性。 并且实验证明通过增加transformer的宽度和深度,有效降低FID 我们最大的DiT-XL/2模型在classconditional ImageNet 512、512和256、256基…

小程序AI智能名片S2B2C商城系统:四大主流商业模式深度解析与实战案例分享

在私域电商迅速崛起的大背景下,小程序AI智能名片S2B2C商城系统以其独特的商业模式和强大的功能,正成为品牌商们争相探索的新领域。在这一系统中,拼团模式、会员电商、社区团购和KOC营销等四种主流模式,为品牌商提供了多样化的营销…

【文章转载】Lance Martin的关于RAG的笔记

转载自微博黄建同学 从头开始学习 RAG,看Lance Martin的这篇笔记就行了,包含了十几篇论文和开源实现! —— 这是一组简短的(5-10 分钟视频)和笔记,解释了我最喜欢的十几篇 RAG 论文。我自己尝试实现每个想…

C# GetField 方法应用实例

目录 关于 C# Type 类 GetField 方法应用 应用举例 心理CT设计题 类设计 DPCT类实现代码 小结 关于 C# Type 类 Type表示类型声明:类类型、接口类型、数组类型、值类型、枚举类型、类型参数、泛型类型定义,以及开放或封闭构造的泛型类型。调用 t…

WPS-EXCEL:快速删除多个线条对象

问题图 我需要将线条快速删除 方法一:使用定位对象功能 使用定位功能:按Ctrl G打开定位对话框。在对话框中,点击“定位条件”。 定位对象:在定位条件对话框中,勾选“对象”选项,然后点击“确定”。这样,…

CTF之变量1

拿到题目发现是一个php代码,意思是用get方式获取args参数。 至于下面那个正则表达式怎么绕过暂且不知,但是题目最上面告诉我们lag In the variable ! (意思是flag就在变量中)。 那我们就传入全局变量globals(&#xf…