SpringCloud(7)Eureka自我保护,Eureka优雅停服,Eureka安全认证

一:Eureka自我保护

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

启动自我保护条件
一般情况下,服务在 Eureka 上注册后,会每 30 秒发送心跳包,Eureka 通过心跳来判断服务是否健康,同时会
定期删除超过 90 秒没有发送心跳的服务。
如下我们的服务都启动着:

 

 

我把serveice-product服务关了:(底下的红字就是提示信息,它将这个service-product保护了起来,提示我们去检查这个服务)

 

①有两种情况会导致 Eureka Server 收不到微服务的心跳
微服务自身的原因
微服务与 Eureka 之间的网络故障

②自我保护模式
Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka
Server 会将这些实例保护起来,让这些实例不会过期,同时提示一个警告。这种算法叫做 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了:

 

 

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

 

 

 

 

 

posted @ 2021-06-25 17:35  iLisa  阅读(335)  评论(0编辑  收藏  举报