备案变更网站,集团公司门户网站建设,瑞金网站建设光龙,郑州网站建设 58前言#xff1a;在上一章节中我们说明了一些关于Eureka的服务发现功能#xff0c;也用这个功能进行接口的实现#xff0c;在本章节则介绍一些关于Eureka的自我保护 1、Eureka保护模式概述
保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。默认情况…前言在上一章节中我们说明了一些关于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.Driverurl: jdbc:mysql://localhost:3306/cloud?useUnicodetruecharacterEncodingUTF-8useSSLfalseserverTimezoneGMT%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.Driverurl: jdbc:mysql://localhost:3306/cloud?useUnicodetruecharacterEncodingUTF-8useSSLfalseserverTimezoneGMT%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也会立马剔除服务导致看不出关停自我保护模式前后的区别