首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

eureka分区的深入讲解,region和zone的使用

  • 25-03-02 14:21
  • 3677
  • 5518
blog.csdn.net

https://segmentfault.com/a/1190000014107639

https://www.cnblogs.com/junjiang3/p/9061867.html

背景

用户量比较大或者用户地理位置分布范围很广的项目,一般都会有多个机房。这个时候如果上线springCloud服务的话,我们希望一个机房内的服务优先调用同一个机房内的服务,当同一个机房的服务不可用的时候,再去调用其它机房的服务,以达到减少延时的作用。

概念

eureka提供了region和zone两个概念来进行分区,这两个概念均来自于亚马逊的AWS:

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

分区服务架构图

clipboard.png

如图所示,有一个region:beijing,下面有zone-1和zone-2两个分区,每个分区内有一个注册中心Eureka Server和一个服务提供者Service。
我们在zone-1内创建一个Consumer-1服务消费者的话,其会优先调用同一个zone内的Service-1,当Service-1不可用时,才会去调用zone-2内的Service-2。

配置

  1. Eureka Server-1:

    1. spring:
    2. application:
    3. name: Server-1
    4. server:
    5. port: 30000
    6. eureka:
    7. instance:
    8. prefer-ip-address: true
    9. status-page-url-path: /actuator/info
    10. health-check-url-path: /actuator/health
    11. hostname: localhost
    12. client:
    13. register-with-eureka: true
    14. fetch-registry: true
    15. prefer-same-zone-eureka: true
    16. #地区
    17. region: beijing
    18. availability-zones:
    19. beijing: zone-1,zone-2
    20. service-url:
    21. zone-1: http://localhost:30000/eureka/
    22. zone-2: http://localhost:30001/eureka/
  2. Eureka Server-2:

    1. spring:
    2. application:
    3. name: Server-2
    4. server:
    5. port: 30001
    6. eureka:
    7. instance:
    8. prefer-ip-address: true
    9. status-page-url-path: /actuator/info
    10. health-check-url-path: /actuator/health
    11. hostname: localhost
    12. client:
    13. register-with-eureka: true
    14. fetch-registry: true
    15. prefer-same-zone-eureka: true
    16. #地区
    17. region: beijing
    18. availability-zones:
    19. beijing: zone-2,zone-1
    20. service-url:
    21. zone-1: http://localhost:30000/eureka/
    22. zone-2: http://localhost:30001/eureka/
  3. Service-1:

    测试代码:

    1. @RestController
    2. public class HiController {
    3. @Value("${zone.name}")
    4. private String zoneName;
    5. @RequestMapping(value = "/hi", method = RequestMethod.GET)
    6. public String hi() {
    7. return zoneName;
    8. }
    9. }

    配置文件:

    1. spring:
    2. application:
    3. name: service
    4. server:
    5. port: 30010
    6. eureka:
    7. instance:
    8. prefer-ip-address: true
    9. status-page-url-path: /actuator/info
    10. health-check-url-path: /actuator/health
    11. metadata-map:
    12. zone: zone-1
    13. client:
    14. register-with-eureka: true
    15. fetch-registry: true
    16. prefer-same-zone-eureka: true
    17. #地区
    18. region: beijing
    19. availability-zones:
    20. beijing: zone-1,zone-2
    21. service-url:
    22. zone-1: http://localhost:30000/eureka/
    23. zone-2: http://localhost:30001/eureka/
    24. zone.name: zone-1
  4. Service-2:

    1. spring:
    2. application:
    3. name: service
    4. server:
    5. port: 30011
    6. eureka:
    7. instance:
    8. prefer-ip-address: true
    9. status-page-url-path: /actuator/info
    10. health-check-url-path: /actuator/health
    11. metadata-map:
    12. zone: zone-2
    13. client:
    14. register-with-eureka: true
    15. fetch-registry: true
    16. prefer-same-zone-eureka: true
    17. #地区
    18. region: beijing
    19. availability-zones:
    20. beijing: zone-2,zone-1
    21. service-url:
    22. zone-1: http://localhost:30000/eureka/
    23. zone-2: http://localhost:30001/eureka/
    24. zone.name: zone-2
  5. Consumer-1:

    调用服务代码:

    1. @RestController
    2. public class HiController {
    3. @Autowired
    4. private RestTemplate restTemplate;
    5. @RequestMapping(value="/consumer")
    6. public String hi() {
    7. return restTemplate.getForObject("http://service/hi", String.class);
    8. }
    9. }

    配置文件:

    1. spring:
    2. application:
    3. name: consumer
    4. server:
    5. port: 30030
    6. eureka:
    7. instance:
    8. prefer-ip-address: true
    9. status-page-url-path: /actuator/info
    10. health-check-url-path: /actuator/health
    11. metadata-map:
    12. zone: zone-1
    13. client:
    14. register-with-eureka: true
    15. fetch-registry: true
    16. prefer-same-zone-eureka: true
    17. #地区
    18. region: beijing
    19. availability-zones:
    20. beijing: zone-1,zone-2
    21. service-url:
    22. zone-1: http://localhost:30000/eureka/
    23. zone-2: http://localhost:30001/eureka/

效果演示

clipboard.png

可以看到Consumer-1优先调用的是同一个zone-1的Service-1,这个时候,无论怎么刷新,调用多少次,都只会调用Service-1,不会调用Service-2.

当我们把Service-1服务停掉,再调用的话:

clipboard.png

才会调用zone-2分区下的Service-2。

配置文件讲解

整个分区分为两步:

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

1. 服务注册的配置文件

  1. eureka:
  2. client:
  3. prefer-same-zone-eureka: true
  4. #地区
  5. region: beijing
  6. availability-zones:
  7. beijing: zone-1,zone-2
  8. service-url:
  9. zone-1: http://localhost:30000/eureka/
  10. zone-2: http://localhost:30001/eureka/

当一个服务(作为一个eureka client)向注册中心(eureka server)注册的时候,会根据eureka.client下的配置来进行注册。这里我们主要关心有多个注册中心的情况下,服务会注册到哪个注册中心,并且和哪个注册中心来维持心跳检测。
注册中心选择逻辑:
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. 服务调用的配置文件

  1. eureka:
  2. instance:
  3. metadata-map:
  4. zone: zone-1

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

扩展

eureka.instance.lease-renewal-interval-in-seconds: 30

服务和注册中心的心跳间隔时间,默认为30s

eureka.instance.lease-expiration-duration-in-seconds: 90

服务和注册中心的心跳超时时间,默认为90s

也就是说,当一个服务异常down掉后,90s之后注册中心才会知道这个服务不可用了。在此期间,依旧会把这个服务当成正常服务。ribbon调用仍会把请求转发到这个服务上。为了避免这段期间出现无法提供服务的情况,要开启ribbon的重试功能,去进行其它服务提供者的重试。

  •  
  • 新浪微博
  • 微信
  • Twitter
  • Facebook

赞  |   2收藏  |  2
赞赏支持

如果觉得我的文章对你有用,请随意赞赏

你可能感兴趣的文章

  • SpringCloud声明式服务调用Feignwqh8522springbootspringcloud
  • springCloud Finchley 微服务架构从入门到精通【四】服务消费者(feign)码蚁springcloudspring-cloudspringbootspring-boot微服务
  • Spring Cloud中如何优雅的使用Feign调用接口猿天地springbootspringcloudjava
  • Spring RestTemplate中几种常见的请求方式江南一点雨springcloud
  • springCloud Finchley 微服务架构从入门到精通【七】断路器 Hystrix(ribbon)码蚁springcloudspring-cloud微服务hystrix
  • Spring Cloud(1) - 服务治理相关技术汇总薛定饿springcloudsoa
  • springCloud Finchley 微服务架构从入门到精通【五】高可用分布式配置中心码蚁springcloudspring-cloudspring-bootspringboot微服务
  • Spring Cloud实战(二)-Spring Cloud Eurekamumubinjavaspringcloud
文章知识点与官方知识档案匹配,可进一步学习相关知识
云原生入门技能树首页概览19383 人正在系统学习中
注:本文转载自blog.csdn.net的Michaelwubo的文章"https://blog.csdn.net/Michaelwubo/article/details/81449191"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top