微服务2:单机Eureka注册配置和自我保护机制

83 阅读4分钟

1.服务端(注册端)设置:

  1. pom依赖:
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
	<version>3.1.1</version>
</dependency>
  1. 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/
  1. 主启动类添加@EnableEurekaServer

2.客户端(被注册端)设置:

  1. pom依赖:
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  <version>3.1.1</version>
</dependency>
  1. yml配置:
eureka:
  client:
    serviceUrl:
      defaultZone: http://192.168.2.135:8000/eureka/
    # 表示是否将自身注册进EurekaServer中心
    register-with-eureka: true
    # 表示从EurekaServer中心抓取已有的注册信息,默认为true,单点无所谓设置,集群必循设置为true方能陪着ribbon使用负载均衡
    fetch-registry: true
  1. 主启动类添加@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.说明已经关闭自我保护机制

  1. 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
  1. 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客户端