先上配置文件了,刚开始是直接指定两个配置中心地址,发现两个中心要按一定顺序放,这就有点坑了,我们根本不知道哪个先放前面,尝试几次只有最后一个服务注册中心有交,然后就想到改变一种方法实现

eureka:client:prefer-same-zone-eureka: trueregisterWithEureka: truefetch-registry: true# 假设指定region为上海region: shavailability-zones:#假设上海下面有两个regionsh: pudong,xuhuiserviceUrl:
#      defaultZone: http://user:password@192.168.11.45:8761/eureka/pudong: http://user:password@192.168.11.45:8761/eureka/xuhui: http://user:password@192.168.11.46:8761/eureka/instance:prefer-ip-address: true     #在eureka里显示IP,下一行是显示地址信息的格式instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}ip-address: 192.168.11.126secure-port: 5888metadata-map:zone: xuhui

serviceUrl是真正的属性,service-url的配置内容是map,map的内容是可以自己发挥的,只要是key: value格式就行(注意有个空格)。有很多map类型的配置,比如availabilityZones,metadata-map都是的,内容虽然是key: value格式,但是都是可以自由发挥。其中metadata-map比较特殊,里面有个zone的属性,会被eureka client解析,当成客户端默认指向的zone来处理。

注册中心选择逻辑
1. 如果prefer-same-zone-eureka为false,按照service-url下的 list取第一个注册中心来注册,并和其维持心跳检测。不会再向list内的其它的注册中心注册和维持心跳。只有在第一个注册失败的情况下,才会依次向其它的注册中心注册,总共重试3次,如果3个service-url都没有注册成功,则注册失败。每隔一个心跳时间,会再次尝试。
2. 如果prefer-same-zone-eureka为true,先通过region取availability-zones内的第一个zone,然后通过这个zone取service-url下的list,并向list内的第一个注册中心进行注册和维持心跳,不会再向list内的其它的注册中心注册和维持心跳。只有在第一个注册失败的情况下,才会依次向其它的注册中心注册,总共重试3次,如果3个service-url都没有注册成功,则注册失败。每隔一个心跳时间,会再次尝试。

所以说,为了保证服务注册到同一个zone的注册中心,一定要注意availability-zones的顺序,必须把同一zone写在前面

2. 服务调用的配置文件

eureka:instance:metadata-map:zone: pudong

服务消费者和服务提供者分别属于哪个zone,均是通过eureka.instance.metadata-map.zone来判定的。
服务消费者会先通过ribbon去注册中心拉取一份服务提供者的列表,然后通过eureka.instance.metadata-map.zone指定的zone进行过滤,过滤之后如果同一个zone内的服务提供者有多个实例,则会轮流调用。
只有在同一个zone内的所有服务提供者都不可用时,才会调用其它zone内的服务提供者。

再看源码 getAvailabilityZones()和getEurekaServerServiceUrls()两个方法的实现。现在向两个服务注册中心添加地址的时候,为什么不能用空格了吧,并且其它符号更不行,

// 根据region,从availabilityZones这个Map中获取key值对应的配置。
// availabilityZones是通过eureka.client.availability-zones配置的,// 可以配置多个availabilityZones,key表示region,value表region对应的zones
// 假设有多个zones,用逗号隔开。
// region通过eureka.client.region来设置,假设不设置,默认为"us-east-1c"。
public String[] getAvailabilityZones(String region) {String value = (String)this.availabilityZones.get(region);if (value == null) {value = "defaultZone";}return value.split(",");
}// 根据zone来获取serviceUrls,假设用逗号隔开会拆分成数组。
public List<String> getEurekaServerServiceUrls(String myZone) {String serviceUrls = (String)this.serviceUrl.get(myZone);if (serviceUrls == null || serviceUrls.isEmpty()) {serviceUrls = (String)this.serviceUrl.get("defaultZone");}if (!StringUtils.isEmpty(serviceUrls)) {String[] serviceUrlsSplit = StringUtils.commaDelimitedListToStringArray(serviceUrls);List<String> eurekaServiceUrls = new ArrayList(serviceUrlsSplit.length);String[] var5 = serviceUrlsSplit;int var6 = serviceUrlsSplit.length;for(int var7 = 0; var7 < var6; ++var7) {String eurekaServiceUrl = var5[var7];if (!this.endsWithSlash(eurekaServiceUrl)) {eurekaServiceUrl = eurekaServiceUrl + "/";}eurekaServiceUrls.add(eurekaServiceUrl.trim());}return eurekaServiceUrls;} else {return new ArrayList();}
}

下面这一行配置要注意注册中心的顺序, 否则只有一例生效或者报错,原因就是后面的循环拿值没对应上,分析如下:

serviceUrl:
      defaultZone: http://user:pass@192.168.11.46:8761/eureka/,http://user:pass@192.168.11.45:8761/eureka/

Eureka会先获取region,如果我们没有设置region,region默认值为"us-east-1c",然后会根据这个region去获取对应的availabilityZones。

然后循环availabilityZones的值,使用每个zone来调用getEurekaServerServiceUrls,获取serviceUrl,最终形成一个zone为key,serviceUrls(因为可能一个zone有多个serviceUrl)列表为value的map。

在使用serviceUrl的时候,使用两重循环:

会按照顺序,逐个取availabilityZones的zone,从map中获取serviceUrls,在逐个循环serviceUrls,来判断是否可达,如果任意serviceUrl可达则停止,否则一致尝试到最后。

如果availabilityZones为空,或者根据它的值取不到serviceUrls,则会返回key为defaultZone的serviceUrls。如果我们也指定了defaultZone对应的serviceUrls,会覆盖原来的defaultZone,否则使用默认的http:// localhost:8761/eureka。

如果想用自己的zone,该如何设置。
首先要设置region,不设置也可以,不设置就按照"us-east-lc"来组织后面的设置。并且根据region一定要能获取availabilityZones的zone值,如果没有就会默认使用defaultZone。我们假设自己设置region为china。然后需要设值availabilityZones,假设有两个sh:pudong,xuhui。然后在serviceUrls中设置pudong: xxxx 换行xuhui: xxxx,分别指向两个服务,

坑:注意getAvailabilityZones这个方法不会trim(),所以逗号后面不要有空格,不然用带空格的key会找不到serviceUrl,这个实现实在有点掉价。而getEurekaServerServiceUrls方法是加了trim()方法的 ,逗号后面可以有空格。

然后启动之后就会把服务注册到两个服务中心,互不影响的两个服务中心,当然如果是集成高可用的服务注册中心,注册中心又是互相注册同步过,那么服务只需要注册任意一个中心,两个服务中心都是可以看到这个服务的。

配置这种事情,简单也可以用,复杂点也能很好发挥作用。有时间就应该慢慢深入研究。

Eureka高可用注册中心通过defaultZone深入理解zone和serviceUrl相关推荐

  1. Spring Cloud Eureka 高可用注册中心

    参考:<<spring cloud 微服务实战>> 在微服务架构这样的分布式环境中,各个组件需要进行高可用部署. Eureka Server 高可用实际上就是将自己作为服务向其 ...

  2. SpringCloud(第 051 篇)EurekaServer集群高可用注册中心以及简单的安全认证

    SpringCloud(第 051 篇)EurekaServer集群高可用注册中心以及简单的安全认证 - 一.大致介绍 1.前面章节分析了一下 Eureka 的源码,我们是不是在里面注意到了 Peer ...

  3. 突发热点事件下微博高可用注册中心vintage的设计\u0026实践

    当前微博服务化采用公有云+私有云的混合云部署方式,承载了每天百亿级的流量,vintage 作为微博微服务的注册中心,为管理 10w 级微服务节点以及在流量激增的情况下的服务快速扩缩容,面临了极大挑战. ...

  4. 基于Eureka实现服务注册中心

    一.序言 当项目由单体结构拆分成一个个的服务,服务之间由本地调用转变成远程调用的时候,我们可以看成是通过一个个的url去获取数据.调用方和被调用方需要知道彼此的状态才可互相通信,而注册中心正是屏蔽了他 ...

  5. eureka多台注册中心_spring cloud注册中心之Eureka

    什么是注册中心? 随着微服务的盛行,越来越多的应用,开始拆成一个一个的服务,服务之间相互依赖,那么内部的服务是怎么相互调用的.例如:服务A部署在3个服务器上,3个实例有不同的ip地址.然后服务B依赖服 ...

  6. springcloud 入门 10 (eureka高可用)

    eureka高可用: 说白了,就是加一个实例作为原实例的备份,然后一起对外提供服务.这样可以保证在一台机器宕机的时候,整个系统不会死掉.保证其继续对外服务. eureka的集群化: 服务注册中心Eur ...

  7. [享学Eureka] 一、源生Eureka介绍 --- 基于注册中心的服务发现

    凡事皆有代价,一切皆是取舍. 本专栏所有文章均计划逐步重写搬迁至本人公号:Java方向盘,且免费开放!故不再建议下单购买,可关注我公号前往免费学习.交流 –> 返回Netflix OSS套件专栏 ...

  8. 搭建Eureka高可用集群

    做的快哭了已经 文章目录 Eureka可用高集群的搭建 一.Eureka的工作原理 二.Eureka中服务提供者与服务消费者的关系 三.搭建Eureka-Server和Eureka-Client 四. ...

  9. 构建eureka高可用服务

    大家有没有注意到一个点,我们这里部署的eureka是单点的,就一台,我们只有一个实例,我们之前学过eureka的高可用,那如何在rancher上部署eureka高可用呢,如何在java -jar做到高 ...

  10. Eureka高可用部署 -夜幕思年华

    Eureka 高可用 spring:application:name: EUREKA-HA --- 服务1 server:port: 8761 spring:profiles: peer1 eurek ...

最新文章

  1. Android通过JNI调用驱动程序(完全解析实例)
  2. 【已解决】如何判断处理器是大端,或小端?
  3. centos 安装rar 和 unrar
  4. HDU - 5877 Weak Pair(离散化+树状数组+dfs序)
  5. cpu频率_CPU频率被锁定到800mhz怎么办?
  6. php如何将读取到的mysql内容按发布的日期分割显示_php如何读取文件夹目录里的文件并按照日期,大小,名称排序...
  7. linux asm函数,Linux 字符设备驱动—— ioremap() 函数解析
  8. 前端每日实战:4# 视频演示如何用纯 CSS 创作一个金属光泽 3D 按钮特效
  9. 济南 章丘 科目三 资料 收集
  10. 敢问路在何方?路在脚下!
  11. linux dsi接口,RPi 树莓派 DSI 接口研究 MIPI raspberry pi
  12. php 百度地图根据经纬度获取地址,百度地图 根据经纬度获取地址
  13. python中average什么意思,Python3——numpy中mean和average的区别
  14. cosx的三次方的化简,即降次
  15. SpringCloud——服务接口(api)
  16. Vivado18.2 PCIE ip核IO协议详细介绍
  17. 计算机仿真程序设计,计算机仿真技术-MATLAB-综合实验-(8页)-原创力文档
  18. c#窗体应用计算机设计,C#应用程序设计
  19. 企业办公共享文档用哪个软件好?
  20. cvs100e_施耐德塑壳断路器CVS100ETMD3P100

热门文章

  1. 硬件工程师面试常见问题
  2. Python数据分析案例-消费者用户画像
  3. 缩写(三)——网络语言和缩写词
  4. NAT64 Technology: Connecting IPv6 and IPv4 Networks
  5. 特征点的匹配正确衡量标准与量化
  6. linux进阶-PHP加速器
  7. Windows下的Rsync(cwRsync)
  8. TTL转RS232电路设计
  9. 数学分析高等代数考研试题不断更新中
  10. FPGA + labwindows/CVI 2017 串口通信 电子钟