Springcloud中的region和zone的使用实例

一、背景

用户量比较大或者用户地理位置分布范围很广的项目,一般都会有多个机房。这个时候如果上线springCloud服务的话,我们希望一个机房内的服务优先调用同一个机房内的服务

,当同一个机房的服务不可用的时候,再去调用其它机房的服务,以达到减少延时的作用。

二、概念

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

(1)region:可以简单理解为地理上的分区,比如亚洲地区,或者华北地区,再或者北京等等,没有具体大小的限制。根据项目具体的情况,可以自行合理划分region。

(2)zone:可以简单理解为region内的具体机房,比如说region划分为北京,然后北京有两个机房,就可以在此region之下划分出zone1,zone2两个zone。

三、分区服务的部署架构图

如上图所示,有一个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:

spring:
 application:
  name: Server-1
server:
 port: 30000
eureka:
 instance:
  prefer-ip-address: true
  status-page-url-path: /actuator/info
  health-check-url-path: /actuator/health
  hostname: localhost
 client:
  register-with-eureka: true
  fetch-registry: true
  prefer-same-zone-eureka: true
  #地区
  region: beijing
  availability-zones:
   beijing: zone-1,zone-2
  service-url:
   zone-1: http://localhost:30000/eureka/
   zone-2: http://localhost:30001/eureka/

(2)Eureka Server-2:

spring:
 application:
  name: Server-2
server:
 port: 30001
eureka:
 instance:
  prefer-ip-address: true
  status-page-url-path: /actuator/info
  health-check-url-path: /actuator/health
  hostname: localhost
 client:
  register-with-eureka: true
  fetch-registry: true
  prefer-same-zone-eureka: true
  #地区
  region: beijing
  availability-zones:
   beijing: zone-2,zone-1
  service-url:
   zone-1: http://localhost:30000/eureka/
   zone-2: http://localhost:30001/eureka/

(3)Service1

测试代码

@RestController
public class HiController {
  @Value("${zone.name}")
  private String zoneName;

  @RequestMapping(value = "/hi", method = RequestMethod.GET)
  public String hi() {
    return zoneName;
  }
}

配置文件

spring:
 application:
  name: service
server:
 port: 30010
eureka:
 instance:
  prefer-ip-address: true
  status-page-url-path: /actuator/info
  health-check-url-path: /actuator/health
  metadata-map:
   zone: zone-1
 client:
  register-with-eureka: true
  fetch-registry: true
  prefer-same-zone-eureka: true
  #地区
  region: beijing
  availability-zones:
   beijing: zone-1,zone-2
  service-url:
   zone-1: http://localhost:30000/eureka/
   zone-2: http://localhost:30001/eureka/

(4)Service2

spring:
 application:
  name: service
server:
 port: 30011
eureka:
 instance:
  prefer-ip-address: true
  status-page-url-path: /actuator/info
  health-check-url-path: /actuator/health
  metadata-map:
   zone: zone-2
 client:
  register-with-eureka: true
  fetch-registry: true
  prefer-same-zone-eureka: true
  #地区
  region: beijing
  availability-zones:
   beijing: zone-2,zone-1
  service-url:
   zone-1: http://localhost:30000/eureka/
   zone-2: http://localhost:30001/eureka/

zone.name: zone-2
(5)Consumer-1

测试代码

@RestController
public class HiController {
  @Autowired
  private RestTemplate restTemplate;

  @RequestMapping(value="/consumer")
  public String hi() {
    return restTemplate.getForObject("http://service/hi", String.class);
  }
}

配置文件

spring:
 application:
  name: consumer
server:
 port: 30030
eureka:
 instance:
  prefer-ip-address: true
  status-page-url-path: /actuator/info
  health-check-url-path: /actuator/health
  metadata-map:
   zone: zone-1
 client:
  register-with-eureka: true
  fetch-registry: true
  prefer-same-zone-eureka: true
  #地区
  region: beijing
  availability-zones:
   beijing: zone-1,zone-2
  service-url:
   zone-1: http://localhost:30000/eureka/
   zone-2: http://localhost:30001/eureka/

五、配置文件详解

整个分区分为两步:

(1)服务注册:要保证服务注册到同一个zone内的注册中心,因为如果注册到别zone的注册中心的话,网络延时比较大,心跳检测很可能出问题。

(2)服务调用:要保证优先调用同一个zone内的服务,只有在同一个zone内的服务不可用时,才去调用别zone的服务。

1、服务注册的配置文件

eureka:
 client:
  prefer-same-zone-eureka: true
  #地区
  region: beijing
  availability-zones:
   beijing: zone-1,zone-2
  service-url:
   zone-1: http://localhost:30000/eureka/
   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、服务调用的配置文件

eureka:
 instance:
  metadata-map:
   zone: zone-1

服务消费者和服务提供者分别属于哪个zone,均是通过eureka.instance.metadata-map.zone来判定的。服务消费者会先通过ribbon去注册中心拉取一份服务提供者的列表,然后通

过eureka.instance.metadata-map.zone指定的zone进行过滤,过滤之后如果同一个zone内的服务提供者有多个实例,则会轮流调用。只有在同一个zone内的所有服务提供者都不

可用时,才会调用其它zone内的服务提供者。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解spring cloud如何使用spring-test进行单元测试

    上篇和大家学习了spring cloud 如何整合reids,在测试时借用了web形式的restful接口进行的.那还有没有别的方式可以对spring boot和spring cloud编写的代码进行单元测试呢?答案:肯定是有的.这篇讲解一下如何使用 spring-boot-starter-test进行单元测试 1.新建项目sc-test,对应的pom.xml文件如下 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns

  • springboot2.0和springcloud Finchley版项目搭建(包含eureka,gateWay,Freign,Hystrix)

    前段时间spring boot 2.0发布了,与之对应的spring cloud Finchley版本也随之而来了,两者之间的关系和版本对应详见我这边文章:spring boot和spring cloud对应的版本关系 项目地址:spring-cloud-demo spring boot 1.x和spring cloud Dalston和Edgware版本搭建的微服务项目现在已经很流行了,现在很多企业都已经在用了,这里就不多说了. 使用版本说明: spring boot 2.0.x spring

  • springcloud config配置读取优先级过程详解

    情景描述 最近在修复Eureka的静态页面加载不出的缺陷时,最终发现是远程GIT仓库将静态资源访问方式配置给禁用了(spring.resources.add-mappings=false).虽然最后直接修改远程GIT仓库的此配置项给解决了(spring.resources.add-mappings=true),但是从中牵涉出的配置读取优先级我们必须好好的再回顾下 springcloud config读取仓库配置 通过config client模块来读取远程的仓库配置,只需要在boostrap.p

  • SpringBoot+SpringCloud用户信息微服务传递实现解析

    这篇文章主要介绍了SpringBoot+SpringCloud实现登录用户信息在微服务之间的传递,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 实现思路: 1:准备一个ThreadLocal变量,供线程之间共享. 2:每个微服务对所有过来的Feign调用进行过滤,然后从请求头中获取User用户信息,并存在ThreadLocal变量中. 3:每个微服务在使用FeignClient调用别的微服务时,先从ThreadLocal里面取出user信息,并

  • 简单了解SpringCloud运行原理

    这篇文章主要介绍了简单了解SpringCloud运行原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 SpringCloud是基于SpringBoot这一高度自动化的应用开发框架,将各类业界比较知名的.得到过实践反馈的开元服务治理相关的技术框架进行优化整合的框架,是一种开发方式的优化和组合,,是一组框架的统称,基于SpringBoot的starter定制,实现开箱即用的目标,通过简单的声明式注解,就能实现服务的调用.负载均衡.限流.熔断等机制

  • Spring Cloud 网关服务 zuul 动态路由的实现方法

    zuul动态路由 网关服务是流量的唯一入口.不能随便停服务.所以动态路由就显得尤为必要. 数据库动态路由基于事件刷新机制热修改zuul的路由属性. DiscoveryClientRouteLocator 可以看到DiscoveryClientRouteLocator 是默认的刷新的核心处理类. //重新加载路由信息方法 protected方法.需要子方法重新方法. protected LinkedHashMap<String, ZuulRoute> locateRoutes() //触发刷新的

  • 详解springcloud 基于feign的服务接口的统一hystrix降级处理

    springcloud开发微服务时,基于feign来做声明式服务接口,当启用hystrix服务熔断降级时,项目服务众多,每个Feign服务接口都得写一些重复问的服务降级处理代码,势必显得枯燥无味: Feign服务接口: @FeignClient(name="springcloud-nacos-producer", qualifier="productApiService", contextId="productApiService", fallb

  • Springcloud-nacos实现配置和注册中心的方法

    最近,阿里开源的nacos比较火,可以和springcloud和dubbo共用,对dubbo升级到springcloud非常的方便.这里学习一下他的配置和注册中心.我主要记录一下它的使用方式和踩得坑. nacos简单介绍 Nacos 致力于帮助您发现.配置和管理微服务.Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现.服务配置.服务元数据及流量管理. Nacos 帮助您更敏捷和容易地构建.交付和管理微服务平台. Nacos 是构建以"服务"为中心的现代应用架构 (例如

  • Springcloud中的region和zone的使用实例

    一.背景 用户量比较大或者用户地理位置分布范围很广的项目,一般都会有多个机房.这个时候如果上线springCloud服务的话,我们希望一个机房内的服务优先调用同一个机房内的服务 ,当同一个机房的服务不可用的时候,再去调用其它机房的服务,以达到减少延时的作用. 二.概念 eureka提供了region和zone两个概念来进行分区,这两个概念均来自于亚马逊的AWS: (1)region:可以简单理解为地理上的分区,比如亚洲地区,或者华北地区,再或者北京等等,没有具体大小的限制.根据项目具体的情况,可

  • springcloud 中 zuul 修改请求参数信息的方法

    Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器. Zuul功能: 认证 压力测试 金丝雀测试 动态路由 负载削减 安全 静态响应处理 主动/主动交换管理 Zuul的规则引擎允许通过任何JVM语言来编写规则和过滤器, 支持基于Java和Groovy的构建. 配置属性 zuul.max.host.connections 已经被两个新的配置属性替代, zuul.host.maxTotalConnections (总连接数)和 zuul.host.maxPerRouteConnec

  • SpringCloud 中使用 Ribbon的方法详解

    在前两章已经给大家讲解了Ribbon负载均衡的规则 以及 如何搭建Ribbon并调用服务,那么在这一章呢 将会给大家说一说如何在SpringCloud中去使用Ribbon.在搭建之前 我们需要做一些准备工作. 1. 搭建Eureka服务器:springCloud-ribbon-server(项目名称) 2. 服务提供者:springCloud-ribbon-police(项目名称) 3. 服务调用者:springCloud-ribbon-person(项目名称) 搭建Eureka服务器 配置 p

  • SpringCloud中的断路器(Hystrix)和断路器监控(Dashboard)

    前言 本篇主要介绍的是SpringCloud中的断路器(Hystrix)和断路器指标看板(Dashboard)的相关使用知识. SpringCloud Hystrix Hystrix 介绍 Netflix创建了一个名为Hystrix的库,它实现了断路器模式.主要的目的是为了解决服务雪崩效应的一个组件,是保护服务高可用的最后一道防线. 开发准备 开发环境 •JDK:1.8 •SpringBoot:2.1.1.RELEASE •SpringCloud:Finchley 注:不一定非要用上述的版本,可

  • seata-1.4.0安装及在springcloud中使用详解

    seata-1.4.0安装及使用 1.简介 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata 将为用户提供了 AT.TCC.SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案. 详见官方文档:https://seata.io/zh-cn/docs/overview/what-is-seata.html 网上的多是0.9.0版本的安装方式,这里记录安装seata-1.4.0版本的方式,在win10环境下安装,centos7与此相同. 下

  • springboot集成springCloud中gateway时启动报错的解决

    在项目中引入springcloud中的gateway时报以下错误 Description: Parameter 0 of method modifyRequestBodyGatewayFilterFactory in org.springframework.cloud.gateway.config.GatewayAutoConfiguration required a bean of type 'org.springframework.http.codec.ServerCodecConfigur

  • SpringCloud中Gateway实现鉴权的方法

    目录 一.JWT 实现微服务鉴权 1 什么是微服务鉴权 2.代码实现 一.JWT 实现微服务鉴权 JWT一般用于实现单点登录.单点登录:如腾讯下的游戏有很多,包括lol,飞车等,在qq游戏对战平台上登录一次,然后这些不同的平台都可以直接登陆进去了,这就是单点登录的使用场景.JWT就是实现单点登录的一种技术,其他的还有oath2等. 1 什么是微服务鉴权 我们之前已经搭建过了网关,使用网关在网关系统中比较适合进行权限校验. 那么我们可以采用JWT的方式来实现鉴权校验. 2.代码实现 思路分析 1.

  • 聊聊SpringCloud中的Ribbon进行服务调用的问题

    目录 1.Robbon 1.1.Ribbon概述 1.2.Ribbon负载均衡演示 1.3.Ribbon核心组件IRule 1.4.Ribbon负载均衡算法 1.4.1.轮询算法原理 负载均衡算法: 1.4.2.RoundRobinRule 源码 1.4.3.手写轮询算法 前置内容(1).微服务理论入门和手把手带你进行微服务环境搭建及支付.订单业务编写(2).SpringCloud之Eureka服务注册与发现(3).SpringCloud之Zookeeper进行服务注册与发现(4).Spring

  • SpringCloud中使用Sentinel实现限流的实战

    目录 前言 正文 Sentinel Sentinel的限流原理 第一步:部署sentinel-dashboard 第二步:在项目中整合sentinel 前言 在分布式的项目中经常会遇到那种高并发的场景,为了保证系统不会被突然激增的请求导致宕机,我们常常会使用一种服务降级的手段来保护我们的系统,本篇博客将介绍如何使用SpringCloud中使用Sentinel实现限流,从而达到服务降级的目的. 正文 Sentinel Sentinel 是面向微服务的轻量级流量控制框架,从流量控制.熔断降级.系统负

  • WPF框架Prism中区域Region用法介绍

    什么是区域(Region)? 在理解这个之前, 首先需要了解一下, 在最常见的开发模式当中, 我们去设计某个页面的时候, 实际上界面元素在设计的时候已经被固定. 举个简单的例子,当我们去设计如下页面, 它包含Header.Menu.Content内容. 因此我们可以为这个页面设计一些元素, 例如: 1.Menu 可以放置ListBox 2.Content 可以放置一个ContentControl 3.Header 可以放置一些ToolBar 注:为了演示需要, 对应区域的控件均采用TextBlo

随机推荐