EurekeServer高可用性

1,383 阅读4分钟

这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战

当我们完成了一个简单的微服务架构之后我们观察的结构图,发现了一个问题,就是我们Eureka Server占据了我们整个服务重要的一环,如果我们的Eureka Server出现了问题,那么真个服务就会处于瘫痪状态

image.png

为了能够解决这个问题,我们可以搞两个Eureka Server,他们之间相互备份,用来保证我们服务的可靠性

为了便捷,我们就只在一个模块中来模拟两个注册中心

我们只需要修改一下我们的yaml配置即可使8000端口的服务注册到9000端口,反之也是如此

server:
  port: 9000
eureka:
  client:
#    register-with-eureka: false #是否将自己注册到注册中心
#    fetch-registry: false #是否从注册中心获取信息
    #配置暴露给注册中心的请求地址
    service-url:
      defaultZone: http://127.0.0.1:8000/eureka/
server:
  port: 8000
eureka:
  client:
#    register-with-eureka: false #是否将自己注册到注册中心
#    fetch-registry: false #是否从注册中心获取信息
    #配置暴露给注册中心的请求地址
    service-url:
      defaultZone: http://127.0.0.1:9000/eureka/

这是我们两个服务的配置,他们只有小小的区别,为了就是相互注册

服务启动时要注意,就是我们使用的是一个模块,我们先启动一个,然后我们右键

image_1.png

复制配置,新起一个服务,我们再去修改我们的配置文件,去启动另一个服务,我们在先启动一个服务的时候会发生报错,问题是,我们先启动的服务,找不到我们的另一个服务(原因:我们还没来得及去启动)当我们启动另一个服务的时候就好了。

在浏览器查看

image_2.png

image_3.png 在这之前,我们的服务就只在一个服务中心进行了注册,那我们还需要同时在两个注册中心上注册吗?答案是不需要,一旦我们的两个注册中心相互注册,那么两个注册中心的信息是同步的。只需要注册一个就可以

image_4.png

image_5.png 这时候问题又来了,我们如果只注册一个,如果被注册那个注册中心发生错误,那我们的服务就不好使了,为了保证我们服务的安全性,我们还是需要把我们的服务注册到多个注册中心,来确保我们的服务能够安全稳定的运行。

image_6.png

一些小问题

IP和服务续约时间

显示IP

我们只需要在我们的配置文件中修改一下就可以

eureka:
  client:
    service-url:
      defaultZone: http://localhost:9000/eureka/
  instance:
    prefer-ip-address: true
    instance-id: ${spring.cloud.client.ip-address}:${server.port} #向注册中心注册ID

谁需要显示IP谁就修改配置文件

image_7.png

Eureka的服务剔除问题

在服务的提供者,设置心跳问题,设置续约到期时间

instance:
    prefer-ip-address: true
    instance-id: ${spring.cloud.client.ip-address}:${server.port} #向注册中心注册ID
    lease-renewal-interval-in-seconds: 5 #发送心跳间隔
    lease-expiration-duration-in-seconds: 10 #续约到期时间

自我保护机制

Eureka服务端会检查最近15分钟内所有Eureka 实例正常心跳占比,如果低于85%就会触发自我保护机制。触发了保护机制,Eureka将暂时把这些失效的服务保护起来,不让其过期,但这些服务也并不是永远不会过期。Eureka在启动完成后,每隔60秒会检查一次服务健康状态,如果这些被保护起来失效的服务过一段时间后(默认90秒)还是没有恢复,就会把这些服务剔除。如果在此期间服务恢复了并且实例心跳占比高于85%时,就会自动关闭自我保护机制。

eureka:
  server:
    #服务端是否开启自我保护机制 (默认true)
    enable-self-preservation: false
    #扫描失效服务的间隔时间(单位毫秒,默认是60*1000)即60秒
    eviction-interval-timer-in-ms: 2000