Eureka的高可用与实战
Eureka高可用原理
由于Eureka是基于部署在Amazon的背景下设计的,因此其原生支持了Amazon的Region和AvailabilityZone
- Region
默认情况下资源在Region之间是不会复制的,不过Eureka Client提供了 fetch-remote-regions-registry配置,
这个配置在dataCenterInfo是Amazon时生效
作用是拉取远程的Region的注册信息到本地
- AvailabilityZone
默认Eureka Client的eureka.client.prefer-same-zone-eureka配置为true
表示在拉取serviceUrl的时候,优先选取与实例处于同一Zone的Eureka Server列表
eureka:
client:
register-with-eureka: true
fetch-registry: true
region: region-east
service-url:
zone1: http://localhost:10086/eureka/
zone2: http://localhost:10010/eureka/
availability-zones:
region-east: zone1,zone2
instance:
metadataMap.Zone: zone1
比如以上配置中,client端配置了一个region,该region下面有两个zone,而该应用实例中的metadataMap信息中zone为zone1,即该应用实例会选取service-url.zone这个server列表来进行注册及查询等操作,如果eureka.client.prefer-same-zone-eureka配置为false,则默认返回的ZoneOffset为0,即取availZones的第一个
client端的高可用
- 在client启动之前,如果没有EurekaServer,则可以通过配置eureka.client.backup-registry-impl从备份registry读取关键服务的信息
- 在client端启动之后,若运行时出现Eureka Server全部挂掉的情况,本地内存有localRegion之前获取的数据,在EurekaServer都不可用的情况下,从Server端定时拉取注册信息的操作会失败,本地的localRegion信息不回被更新
- client启动之后,出现Eureka Server部分挂掉,可以通过配置文件剔除挂掉的Eureka Server地址,但是一般不这么做
Server端的高可用
由于Eureka Server采用的peer to peer架构模式,所以也就没什么server端的高可用了,主要的高可用都在client端处理
不过Server端也支持了跨region基本的高可用,通过配置remoteRegionUrlsWithNames来支持拉取远程region的实例信息,如果档期region要访问的实例都挂了,那么server端就会fallback到远程的region的该服务实例
另外就是 Server的自我保护模式,前面已经说过
Eureka故障
Eureka Server全部不可用
- 应用服务启动前不可用
如果Eureka Server在服务启动前挂掉或者没有启动,可以启动,但是会报错,ClientHandlerException,
由于连不上Eureka Server,自然访问不了注册信息,不能和其他服务交互,这时候就用上了前面提到的eureka.client.backup-registry-impl,在EurekaServer访问不到的时候,从这个back registry读取服务注册信息
简单实例
在原有的eureka注册中心我们新建两个配置文件分别是application-peer1.yml和application-peer2.yml,内容如下
关于这两个配置文件
第一个配置,应用的名称,既然是简单的高可用注册中心对外肯定保持一致
然后把两个注册中心相互注册
- 打包项目
- 进入项目根目录,运行mvn clean compile
- 完成之后,在运行mvn clean package
- 打包完成,生成的jar包
- 接下来,通过命令行分别以两个配置文件启动实例
- 然后我们访问localhost:10086和localhost:10010
可以看到双方互相注册了,这里要注意的是需要在本地域名解析的hosts文件中加上
127.0.0.1 peer1 127.0.0.1 peer2
- 接下来我们把前面的server1启动,启动前需要修改配置文件在两个Server节点上注册服务
- 进入项目根目录,运行mvn clean compile
spring:
application:
name: service-one
eureka:
client:
service-url:
defaultZone: http://peer1:10086/eureka,http://peer2:10010/eureka
可以看到service-1也注册上来了
接下来我们模拟故障,停掉其中一个节点
可以看到另一节点仍然可用,依然可以进行服务注册与发现,这样就实现了建议的高可用注册中心
如果配置更多节点的Server 集群,只需要在其他的注册中心注册自己,原理是一样的
总结
本章的源码在springcloud源码,点击获取,欢迎讨论
当然演示中的打包可以使用idea工具的打包,更为方便
如果不想使用主机名进行访问注册中心,也可以使用ip 但是需要先添加一条配置,该值默认false
eureka.instance.prefer-ip-address=true
值得注意的是在实际生产中最好是用ip注册,不然会有无法鉴别的问题