1.服务端(注册端)设置:
- pom依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>3.1.1</version>
</dependency>
- yml配置:
eureka:
instance:
# eureka服务端实例名称
hostname: 192.168.2.135
client:
# 表示是否向注册中心注册自身,false否
registerWithEureka: false
# 表示自己端就是注册中心
fetchRegistry: false
# 设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
- 主启动类添加
@EnableEurekaServer
2.客户端(被注册端)设置:
- pom依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>3.1.1</version>
</dependency>
- yml配置:
eureka:
client:
serviceUrl:
defaultZone: http://192.168.2.135:8000/eureka/
# 表示是否将自身注册进EurekaServer中心
register-with-eureka: true
# 表示从EurekaServer中心抓取已有的注册信息,默认为true,单点无所谓设置,集群必循设置为true方能陪着ribbon使用负载均衡
fetch-registry: true
- 主启动类添加
@EnableEurekaClient
3.注册中心预览:
4.自动我保护机制处理:
概述:自我保护模式主要用户一组客户端和Eureka Server之间存在网络分区场景下的保护,一旦进入保护模式Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务
- 警告描述:EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT.RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
原因说明:
- 默认情况下,如果Eureka Server在一定时间内(默认90秒)没有接收到某个微服务实例的心跳,Eureka Server将会移除该实例。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,而微服务本身是正常运行的,此时不应该移除这个微服务,所以引入了自我保护机制。
- 自我保护模式正是一种针对网络异常波动的安全保护措施,使用自我保护模式能使Eureka集群更加的健壮、稳定的运行。
- 自我保护机制的工作机制是如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,Eureka Server自动进入自我保护机制
情况场景:
- Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。
- Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。
- 当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中
解决建议:
- 在生产上可以开自注册,部署两个server
- 在本机器上测试的时候,可以把比值调低,比如0.49
eureka.server.renewalPercentThreshold=0.49
- 或者简单粗暴把自我保护模式关闭
eureka.server.enable-self-preservation=false
出现THE SELF PRESERVATION MODE IS TURNED OFF. THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.说明已经关闭自我保护机制
- Eureka服务端如关闭了保护模式,并自定义设置清理无效结点时间的话(不设置则取默认),则在客户端心跳异常后会在相应时间内剔除
eureka:
instance:
# eureka服务端实例名程
hostname: eureka7001.com
client:
# 表示是否向注册中心注册自身,false否
registerWithEureka: false
# 表示自己端就是注册中心
fetchRegistry: false
# 设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
serviceUrl:
defaultZone: http://admin:admin@eureka7002.com:7002/eureka/
# Eureka服务端相应设置
server:
# 关闭禁用自我保护机制,保证不可用的服务被及时剔除
enable-self-preservation: false
# 清理无效节点的时间间隔,默认60000毫秒,即60秒
eviction-interval-timer-in-ms: 2000
- Eurke客户端也可以自定义设置相应的自定义心跳参数(不设置则取默认)
#Eureka被注册端配置
eureka:
client:
serviceUrl:
# defaultZone: http://admin:admin@192.168.2.135:7001/eureka/,http://admin:admin@192.168.2.135:7002/eureka/
defaultZone: http://admin:admin@192.168.2.135:7001/eureka/
# 表示是否将自身注册进EurekaServer中心
register-with-eureka: true
# 表示从EurekaServer中心抓取已有的注册信息,默认为true,单点无所谓设置,集群必循设置为true方能陪着ribbon使用负载均衡
fetch-registry: true
instance:
#主机名称修改
instance-id: PaymentModuleService8001
#是否在访问路径中显示ip
ip-address: 192.168.2.135
prefer-ip-address: true
# 向Eureka服务端发送的心跳间隔,单位默认是30秒
lease-renewal-interval-in-seconds: 1
# 向Eureka服务端收到最后一次心跳后等待时间上线,单位默认是90秒,超时剔除服务
lease-expiration-duration-in-seconds: 2
3. 测试结果,在自主关闭8001微信客户端模块之后,7001即刻便剔除了8001客户端