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

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. UITextField的总结
  2. JavaScript实现k-nearest算法(附完整源码)
  3. TCP/IP协议的TCP握手协议
  4. Linux配置SSH无密码登录
  5. 是否应该立即将网站升级到Drupal 8?
  6. 利用spring注解创建bean
  7. 2G,3G ,4G 到 5G 变了什么 ?
  8. 业务 T+1 T+2
  9. mysql导出excel出乱码_Mysql中文乱码以及导出为sql语句和Excel问题解决方法[图文]...
  10. python为什么叫爬虫-总算领会python为什么叫爬虫
  11. 软件工程 speedsnail 冲刺8
  12. 如何让测试RFC2544更便捷——RFC2544测试实操
  13. php-fpm 开机启动,mac系统,php-fpm加入开机启动项
  14. C语言拍皮球双重循环,山东理工大学ACM平台题答案关于C语言 1184 C语言实验——拍皮球...
  15. python植物大战僵尸辅助_GitHub又放大招,Python版本的植物大战僵尸还能作弊玩!...
  16. java gwt开发_GWT项目和开发总结
  17. iMac (Retina 5K, 27-inch, Late 2015) 在内置硬盘及外置移动硬盘上安装 macOS Monterey/Windows11 22H2 双系统
  18. 【云原生kubernetes】coredns解析集群外部域名
  19. 为什么一个盘里的文件夹都不见了,里面一片空白,但那些文件所占的内存却还在的,但好像没被删除
  20. mysql插入记录时违反唯一索引的处理

热门文章

  1. 磁珠 符号_史上最全面的磁珠知识大全
  2. excel筛选查询函数
  3. 如何对CPU过载进行排查
  4. 缩写(三)——网络语言和缩写词
  5. 重磅宣布|强强联合,腾讯云携手Veeam提供云上数据存储服务
  6. 创建mysql视图索引_mysql 创建索引和视图
  7. 三防数据存储: 3U Open VPX 存储模块
  8. Ubuntu Vmware虚拟机网络配置(二)
  9. Ubuntu 下安装Skype聊天工具
  10. 人到中年,沉默寡言(深度好文)