这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战
当我们完成了一个简单的微服务架构之后我们观察的结构图,发现了一个问题,就是我们Eureka Server占据了我们整个服务重要的一环,如果我们的Eureka Server出现了问题,那么真个服务就会处于瘫痪状态
为了能够解决这个问题,我们可以搞两个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/
这是我们两个服务的配置,他们只有小小的区别,为了就是相互注册
服务启动时要注意,就是我们使用的是一个模块,我们先启动一个,然后我们右键
复制配置,新起一个服务,我们再去修改我们的配置文件,去启动另一个服务,我们在先启动一个服务的时候会发生报错,问题是,我们先启动的服务,找不到我们的另一个服务(原因:我们还没来得及去启动)当我们启动另一个服务的时候就好了。
在浏览器查看
在这之前,我们的服务就只在一个服务中心进行了注册,那我们还需要同时在两个注册中心上注册吗?答案是不需要,一旦我们的两个注册中心相互注册,那么两个注册中心的信息是同步的。只需要注册一个就可以
这时候问题又来了,我们如果只注册一个,如果被注册那个注册中心发生错误,那我们的服务就不好使了,为了保证我们服务的安全性,我们还是需要把我们的服务注册到多个注册中心,来确保我们的服务能够安全稳定的运行。
一些小问题
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谁就修改配置文件
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