Spring Cloud Eureka: 指定Zone方式

 更新时间:2022年03月04日 09:04:20   作者:司青  
这篇文章主要介绍了Spring Cloud Eureka: 指定Zone方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Eureka如何指定Zone

有坑。

先说结论:如果想给当前服务指定属于哪个zone, 使用

eureka.instance.metadata-map.zone=myzone

属性是无效的,而应该使用:

eureka.client.availabilityZones.beijing=myzone # beijing是region

同时指定region:

eureka.client.region=beijing

至于原因,可以在EurekaClientConfigBean的源码中找到:

@Override
    public String[] getAvailabilityZones(String region) {
        String value = this.availabilityZones.get(region);
        if (value == null) {
            value = DEFAULT_ZONE;
        }
        return value.split(",");
    }

也就是说在判断当前服务属于哪个zone时,先从availabilityZone这个Map中查找,查找用的key是region名。

如果找不到,就使用默认值,即我们熟知的defaultZone。

Eureka中的region和Zone

像亚马逊这种大型的跨境电商平台,会有很多个机房。这时如果上线一个服务的话,我们希望一个机房内的服务优先调用同一个机房内的服务,当同一个机房的服务不可用的时候,再去调用其它机房的服务,以达到减少延时的作用。

于是亚马逊的 AWS 提供了 region 和 zone 两个概念

概念

  • region:可以简单理解为地理上的分区。比如亚洲地区,或者华北地区,再或者北京地区等等,没有具体大小的限制,根据项目具体的情况,可以自行划分region。
  • zone:可以简单理解为 region 内的具体机房,比如说 region 划分为华北地区,然后华北地区有两个机房,就可以在此 region 之下划分出 zone1、zone2 两个 zone

eureka 也借用了 region 和 zone 的概念

分区服务架构图

如图所示,有一个 region:华北地区,下面有两个机房,机房A 和机房B

每个机房内有一个 Eureka Server 集群 和两个服务提供者 ServiceA 和 ServerB

现在假设 serverA 需要调用 ServerB 服务,按照就近原则,serverA 会优先调用同一个 zone 内的 ServiceB,当 ServiceB 不可用时,才会去调用另一个 zone 内的 ServiceB

Eureka中Regin和 Zone的相关配置

  • 服务注册:要保证服务注册到同一个zone内的注册中心,因为如果注册到别zone的注册中心的话,网络延时比较大,心跳检测很可能出问题。
  • 服务调用:要保证优先调用同一个zone内的服务,只有在同一个zone内的服务不可用时,才去调用别zone的服务。

服务注册相关

eureka:
  client:
    # 尽量向同一区域的 eureka 注册,默认为true
    prefer-same-zone-eureka: true
    #地区
    region: huabei
    availability-zones:
      huabei: zone-1,zone-2
    service-url:
      zone-1: http://localhost:30000/eureka/
      zone-2: http://localhost:30001/eureka/

当存在多个注册中心时,选择逻辑为

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

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

服务调用

eureka:
  instance:
    # 服务和注册中心的心跳间隔时间,默认为30s
    lease-renewal-interval-in-seconds: 30
    # 服务和注册中心的心跳超时时间,默认为90s
    lease-expiration-duration-in-seconds: 90
    metadata-map:
      # 当前服务所属的 zone
      zone: zone1
 

服务消费者和服务提供者分别属于哪个zone,均是通过 eureka.instance.metadata-map.zone 来判定的。

服务消费者会先通过 ribbon 去注册中心拉取一份服务提供者的列表,然后通过 eureka.instance.metadata-map.zone 指定的 zone 进行过滤,过滤之后如果同一个 zone 内的服务提供者有多个实例,则会轮流调用。

只有在同一个 zone 内的所有服务提供者都不可用时,才会调用其它zone内的服务提供者。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 解决java转义json出现\u0000 等乱码的问题

    解决java转义json出现\u0000 等乱码的问题

    这篇文章主要介绍了解决java转义json出现\u0000 等乱码的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • 通过Feign进行调用@FeignClient 找不到的解决方案

    通过Feign进行调用@FeignClient 找不到的解决方案

    这篇文章主要介绍了通过Feign进行调用@FeignClient 找不到的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 深入了解Java I/O 之File类

    深入了解Java I/O 之File类

    这篇文章主要介绍了Java I/O深入学习之File和RandomAccessFile, I/O系统即输入/输出系统,对于一门程序语言来说,创建一个好的输入/输出系统并非易事。需要的朋友可以参考下
    2021-08-08
  • spring boot前后端交互之数据格式转换问题

    spring boot前后端交互之数据格式转换问题

    这篇文章主要介绍了spring boot前后端交互之数据格式转换,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • 一文带你深入了解Java的数据结构

    一文带你深入了解Java的数据结构

    Java工具包提供了强大的数据结构。这篇文章主要为大家详细介绍了Java数据结构中常用的几种接口和类,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-05-05
  • java list中包含某个字符串的两种方法实现

    java list中包含某个字符串的两种方法实现

    在Java开发中,经常需要判断一个List中是否包含特定的字符串,包括使用contains()方法和循环遍历判断,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Java多线程循环栅栏CyclicBarrier正确使用方法

    Java多线程循环栅栏CyclicBarrier正确使用方法

    这篇文章主要介绍了Java多线程循环栅栏CyclicBarrier正确使用方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Spring概述和快速构建的方式

    Spring概述和快速构建的方式

    Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架),Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情,本文给大家介绍spring概述和快速构建方式,一起看看吧
    2021-06-06
  • 浅谈java获取UUID与UUID的校验

    浅谈java获取UUID与UUID的校验

    这篇文章主要介绍了java获取UUID与UUID的校验,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 一篇文章带你了解Spring AOP 的注解

    一篇文章带你了解Spring AOP 的注解

    这篇文章主要为大家介绍了vue组件通信的几种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01

最新评论