单独的Eureka Server仍然可以保持很高的弹性
因为客户端本地也会存有一份服务的map,所以即使所有的注册中心全部挂掉,也不影响client的相互访问。并且会在注册中心可用的情况下第一时间进行通信,同步数据。即使只有一个Eureka Server,也可以让系统又比较高的弹性。
但是对于大型项目,天生就要求有多个Zone的存在。每个Zone中又会有至少一个Eureka Server。这些Eureka Server应该互为peer。peer会从所有的兄弟peer那里同步服务列表。从其它节点那里同步到的服务列表和本机的服务列表一样,也可以同步给客户端。
实现高可用的Eureka集群
我们前面已经把eureka-server和拆成了两个,但是用来演示高可用,两个是不够的。
我们假定有两个zone,nj1,nj2,假设用来演示一个zone下有多个eureka server,需要四个server,我们把server继续拆成nj1a、nj1b,nj2a,nj2b。同时把client拆成两个。
然后把Server改成不用defaultZone的配置。具体注释放在yml中,所有配置如下。
需要继续去hosts里面添加hostName
配置Eureka Client
加载配置的顺序为先加载bootstrap.yml,再加载application.yml,如果有后缀,也就是profile,则会先加载原始的,再加载带后缀的,后面的配置会覆盖前面的配置。因为我们使用了config,所以bootstrap.yml必不可少,我们在bootstrap.yml中配置config需要的信息。在application.yml中配置公共信息。在application-xxx.xml中配置各自的信息。
bootstrap.yml省略
application.yml
# 客户端应该根据所在zone,兄弟zone的顺序,列出所有的可连接service-url
nj1: http://eureka-server1:8761/eureka,http://eureka-server2:8762/eureka
nj2: http://eureka-server3:8763/eureka,http://eureka-server4:8764/eureka
application-web1.yml
application-web2.yml
配置Eureka Server
注意前俩metadateMap.zone是nj1,后俩是nj2,虽然不知道啥用,我们先按照“假设这俩是用来指定server真正属于哪个zone”的逻辑来设置
前俩是availabilityZones是js: nj1,nj2 后俩是js: nj2,nj1
hostname是eureka-server1,eurea-server2,eurea-server3,eurea-server4顺着排下去
application-nj1a.yml
spring:
# 使用默认的registerWithEureka和fetchRegistry
# 按照属于自身region的放在前面,其它region的按顺序罗列
nj1: http://eureka-server2:8762/eureka
nj2: http://eureka-server3:8763/eureka, http://eureka-server4:8764/eureka
application-nj1b.yml
# 使用默认的registerWithEureka和fetchRegistry
# 按照属于自身region的放在前面,其它region的按顺序罗列
nj1: http://eureka-server1:8761/eureka
nj2: http://eureka-server3:8763/eureka, http://eureka-server4:8764/eureka
application-nj2a.yml
# 使用默认的registerWithEureka和fetchRegistry
# 按照属于自身region的放在前面,其它region的按顺序罗列
nj2: http://eureka-server4:8764/eureka
nj1: http://eureka-server1:8761/eureka, http://eureka-server2:8762/eureka
application-nj2b.yml
# 使用默认的registerWithEureka和fetchRegistry
# 按照属于自身region的放在前面,其它region的按顺序罗列
nj2: http://eureka-server3:8763/eureka
nj1: http://eureka-server1:8761/eureka, http://eureka-server1:8762/eureka
我们启动web1和web2,server的nj1a,nj1b,nj2a,nj2b
效果应该是localhost:8761的DS Replicas是eureka-server2,eureka-server3,eureka-server4,localhost:8762的DS Replicas应该是其它三个,依次类推。然后四个Eureka Server都会显示六台服务,包括两个注册上来的服务,和4个Eureka Server自身。为节省篇幅,截前两个的图。
serviceUrl的设置规则
无论是client还是serviceUrl应该把所有的Eureka Server全部列到后面。
按照优先本Region的其它serviceUrl,然后其它Region内的serviceUrl。
虽然配置了很多,但是Eureka会逐个探测serviceUrl是否能连接,能够连接则停止。所以同一时间只会和一个发生关系。假设最优先的serviceUrl连接不上,会“暂时”连接次优先的server,一旦前面的可以连接,将会连接到前面的serviceUrl。
所以必须要全部列出来,按照优先级排列,才是高可用的最佳实践。
DS Replicas
replicas 复制品,DS不知道啥意思,这里表示的就是peer的hostname列表。