4-1. Eureka 注册中心高可用集群概述
在微服务架构的这种分布式系统中,我们要充分考虑各个微服务组件的高可用性问题,不能有单点故障,由于注册中心eureka本身也是一个服务,如果它只有一个节点,那么它有可能发生故障,这样我们就不能注册和查询服务了,所以我们需要一个高可用的服务注册中心,这就需要注册中心集群来解决。
eureka服务注册中心它本身也是一个服务,它可以看做是一个提供者,又可以看做是一个消费者,我们之前通过配置 eureka.client.register-with-eureka=false让注册中心不能注册自己,但是我们可以向其他的注册中心注册自己。
Eureka Server的高可用其实就是将自己作为服务向其他注册中心注册自己,这样就形成一组互相注册的服务注册中心,进而实现服务清单的互相同步,往注册中心A上注册的服务 ,可以复制同步到B注册中心上,所以任何一台注册中心上都能查到已经注册的服务,从而达到高可用的效果。
4-2. Eureka 注册中心高可用集群搭建
我们知道,eureka注册中心高可用集群是各个注册中心相互注册,所以。
-
在Eureka注册中心的项目中创建两个A的配置文件中指向B ,B的配置文件中指向A (文件格式 application-A.properties)
-
#A的文件中配置 eureka.client.service-url.defaultZone=http://B项目名:B的端口号/eureka #B的文件中配置 eureka.client.service-url.defaultZone=http://A项目名:A的端口号/eureka
-
然后在本地hosts文件中配置ip映射关系:C:\Windows\System32\drives\etc\hosts
127.0.0.1 A项目名
127.0.0.1 B项目名
- 运行时,在运行配置 Program Arguments中配置
#运行那个项目用那个项目的配置文件即可
--spring.profiles.active=A项目名
--spring.profiles.active=B项目名
4-3. Eureka 注册中心高可用集群测试
在服务者和消费者的配置文件中配置
eureka.client.service-url.defaultZone=http://A项目名:A的端口号/eureka,
http://B项目名:B的端口号/eureka
-
启动服务者 可以看到两个注册中心服务都注册成功
-
启动消费者 同个地址栏访问方法远程调用服务成功
4-4. Eureka 服务注册中心自我保护机制
自我保护机制是Eureka 注册中心的重要特性,当Eureka 注册中心进入自我保护模式时,在Eureka Server首页会出现以下提示信息
在没有Eureka 自我保护的情况下,如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销实例,但是发生网络故障时,那么微服务与Eureka Server之间将无法正常通讯,以上行为就变的非常危险了,因为微服务其实本身是正常的,此时不应该注销微服务。如果没有自我保护机制,那么Eureka Server就会将此服务给注销掉。
Eureka通过“自我保护模式”来解决这个问题, 当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络故障),那么它就会把这个微服务节点进行保护。一旦进入自我保护模式,Eureka Server就会保护服务注册表中的服务不被删除(也就是不会被注销)。当网络故障恢复后,自动退出自我保护模式。
所以自我保护模式时一种应对网络异常的安全措施,它的架构哲学就是宁可保留一切微服务,也不盲目的注销任何健康的微服务,使用自我保护模式,可以让Eureka集群更加的健壮和稳定。
当然我们也可以使用配置项:eureka.server.enable-self-preservation=false 禁用自我保护模式。
但是自我保护模式也会给我们带来一些困扰,如果在保护期内某个服务提供者刚好非正常下线时,此时服务消费者就会拿到一个无效的服务实例,此时会调用失败,对于这个问题需要服务消费者端具有一些容错机制,如重试、断路器等。
Eureka的自我保护模式还是有意义的,该模式被激活后,它不会从注册列表中剔除因长时间没收到心跳导致注册过期的服务,而是等待修复,知道心跳恢复正常之后,自动退出自我保护模式。这种模式只在避免因网络分区故障导致服务不可以的问题。
例如:两个服务客户端实例A和B,A是消费者,B是提供者,但是由于网络问题,B未能及时的向Eureka发送心跳续约,这个时候Eureka不能简单的将B从服务注册表中剔除,因为如果删除了,A就将无法从Eureka Server中获取B注册的服务了,但是B服务这个时候是可用的。
所以,Eurekas的自我保护模式最好还是开启它。
关于自我保护几个配置如下:
#服务器端配置 测试时关闭自我保护模式,保证不可用的服务及时剔除
eureka.server.enable-self-preservation=false
#客户端配置 每隔2秒向服务端发送一次心跳 保证自己还活着 默认值为30s
eureka.instance.lease-renewal-interval-in-seconds=2
#告诉服务端 如果10秒内没有发送心跳,就代表我故障了,将我剔除掉 默认值为90s
eureka.instance.lease-expiration-duration-in-seconds=10