发布时间:2025-12-09 11:56:15 浏览次数:1
一:Eureka自我保护
通过Renew来判断这个微服务是否可用(通过发送心跳来判断我们的微服务是否可用)
启动自我保护条件一般情况下,服务在 Eureka 上注册后,会每 30 秒发送心跳包,Eureka 通过心跳来判断服务是否健康,同时会定期删除超过 90 秒没有发送心跳的服务。如下我们的服务都启动着:我把serveice-product服务关了:(底下的红字就是提示信息,它将这个service-product保护了起来,提示我们去检查这个服务)①有两种情况会导致 Eureka Server 收不到微服务的心跳微服务自身的原因微服务与 Eureka 之间的网络故障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 实现。①添加依赖(添加到我们服务提供者中)<!-- 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了:
这个时候开启我们的生产者和消费者(都是可以的):