SpringCloudEureka自我保护,Eureka优雅停服,Eureka安全认证

发布时间:2025-12-09 11:56:15 浏览次数:1

一:Eureka自我保护

通过Renew来判断这个微服务是否可用(通过发送心跳来判断我们的微服务是否可用)

启动自我保护条件一般情况下,服务在 Eureka 上注册后,会每 30 秒发送心跳包,Eureka 通过心跳来判断服务是否健康,同时会定期删除超过 90 秒没有发送心跳的服务。如下我们的服务都启动着:我把serveice-product服务关了:(底下的红字就是提示信息,它将这个service-product保护了起来,提示我们去检查这个服务)①有两种情况会导致 Eureka Server 收不到微服务的心跳微服务自身的原因微服务与 Eureka 之间的网络故障
②自我保护模式Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,EurekaServer 会将这些实例保护起来,让这些实例不会过期,同时提示一个警告。这种算法叫做 Eureka Server 的自我保护模式。
③为什么要启动自我保护因为同时保留"好数据"与"坏数据"总比丢掉任何数据要更好,当网络故障恢复后,这个 Eureka 节点会退出"自我保护模式"。Eureka 还有客户端缓存功能(也就是微服务的缓存功能)。即使 Eureka 集群中所有节点都宕机失效,微服务的 Provider 和 Consumer 都能正常通信。微服务的负载均衡策略会自动剔除死亡的微服务节点。④如何关闭自我保护注册中心配置自我保护
server:  port: 8763   #端口spring:  application:    name: eureka-server   #应用名称# 配置 Eureka Server 注册中心eureka:  server:    enable-self-preservation: false  #true: 开启自我保护模式, false :关闭自我保护模式    eviction-interval-timer-in-ms: 60000 #清理间隔(单位:毫秒,默认是60*1000)  instance:    hostname: eureka03     #主机名,不配置的时候根据操作系统的主机名获取    prefer-ip-address: true   #是否使用ip地址注册    instance-id: ${spring.cloud.client.ip-address}:${server.port}  #ip port  client:    service-url:            #注册中心对外暴露的注册地址        defaultZone: http://localhost:8761/eureka/
eureka: server:  enable-self-preservation: false # true:开启自我保护模式,false:关闭自我保护模式  eviction-interval-timer-in-ms: 60000 # 清理间隔(单位:毫秒,默认是 60*1000)

此时我关闭了service-product服务后(过一段时间):直接将我们的service-product下了

二:优雅停服

(如果我们下线了就会给我们的注册中心发送信息,告诉下线了,从服务列表将我们这个服务剔除)

我们上面说的关闭保护功能,现在我们有了优雅停服就能区别是网络问题还是我们故意关闭服务。 所以有了优雅停服就不需要关闭保护功能

配置了优雅停服以后,将不需要 Eureka Server 中配置关闭自我保护。本文使用 actuator 实现。①添加依赖(添加到我们服务提供者中)
服务提供者添加 actuator 依赖
<!-- spring boot actuator 依赖 --><dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-actuator</artifactId></dependency>

配置:

server:  port: 7070  #端口spring:  application:    name: service-product   #应用名称(集群下相同)#配置 Eureka  Server 注册中心eureka:  instance:    prefer-ip-address: true    #是否使用ip地址注册    instance-id: ${spring.cloud.client.ip-address}:${server.port}   # ip  ;  port  client:    service-url:               #设置服务注册中心地址      defaultZone: http://localhost:8761/eureka#度量指标监控与健康检查management:  endpoints:    web:      exposure:        include: shutdowm  #开启shutdown 端点访问  endpoint:    shutdown:      enabled: true  #开启shutdownn 实现优雅停服

一般的没有下面这个endpoint,这个是强调,一般不能将这个停了,所以这里进行了确认

开启:

优雅停服使用 POST 请求访问:http://localhost:7070/actuator/shutdown 效果如下

三:Eureka安全认证

我们访问Eureka列表的时候是要有安全认证的,还有就是我们将服务注册到Eureka的时候也是要进行安全认证的

①添加依赖(添加到我们的Eureka中)

<!-- spring boot security 依赖 --><dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-security</artifactId></dependency>

②配置文件

注册中心配置安全认证
spring: # 安全认证 security:  user:   name: root   password: 123456
修改访问集群节点的 url(Eureka,生产者与消费者都需要加上用户名加和密码):

③启动俩个Eureka(这个时候俩个都有错(自己也整了半天))

这个上面也是没有注册上去:

为什么会出现上面的问题呢? 就是CSRF过滤

④过滤CSRF

Eureka 会自动化配置 CSRF 防御机制,Spring Security 认为 POST, PUT, and delete http methods 都是有风险的,如果这些 method 发送过程中没有带上 CSRF token 的话,会被直接拦截并返回 403 forbidden。官方给出了解决的方法,具体可以参考 spring cloud issue 2754,里面有大量的讨论,这里提供两种解决方案。首先注册中心配置一个 @EnableWebSecurity 配置类,继承org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter,然后重写 configure 方法。在每个注册中心都要写一个类,来进行写这个:

这样就ok了:

这个时候开启我们的生产者和消费者(都是可以的):


eureka 7
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477