最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

世界资讯:Eureka高可用集群服务端和客户端配置

来源:博客园

微服务应用中,生产环境一般都需要保障服务注册中心的高可用!高可用也分好几个等级,例如:同数据中心或区(Zone)高可用——》同地区(Region)跨数据中心或区(Zone)高可用——》全国跨地区(Region)跨数据中心或区(Zone)高可用——全球跨地区(Region)跨数据中心或区(Zone)高可用,常规应用基本上中间两种就能满足了!当然也会有国际型应用要用到全球部署的。不同的要求如果是自己搭建部署环境,那么服务器的选购就要做好规划。下面的截图是阿里云ECS的选购界面,切它出来不是为了打广告,是跟我们今天的主角Eureka高可用集群部署有关系:

从阿里云的服务器选购界面我们可以看到:有点实力的服务器供应商一般都会从全球范围内建设数据中心(机房)。但打包这些服务器供用户选择购买时,使用两级标签就能唯一确定服务器的位置——地域(region)和可用区(zone),这个分配标准是与国际接轨的!

我们在Spring官网Eureka主题下高可用一节也看到了region和zone的概念,另外,在Eureka的Github仓库Eureka架构图上也看到区(zone)的概念,为了防止连接失效,我把相关内容截图过来了:


(相关资料图)

Eureka的高可用部署架构图官方已经给出来了,而且跟阿里云上可用区(zone)的划分是一样的,那么该怎么来配置和使用呢?接下来我们就来实操一下!

首先用IDEA创建好Eureka工程,我这里采用Maven多模块(module)的结构,将EurekaServer和EurekaClient端放在一个主工程下了:

这里要用到IDEA多实例运行的功能来模拟多区(zone)部署的情况(用端口的不同来模拟分区),该功能默认是关闭的,按下面截图方法打开它:

然后我们在相应应用的主配置文件application.yml里修改spring:profiles:active: <目标配置>并启动应用就可以了,每个目标配置里的端口不一样,用于模拟多机器的情况(真实环境是端口一样,IP不一样),先看一下效果截图,然后我会在后面贴出所有配置文件,配置文件里会有详细的说明,就不在正文说怎么配置了:

EurekaServer端配置文件的编写说明:

#Eureka Server的application.yml内容spring:  application:    name: EurekaServer  profiles:  #多实例启动就改下这里active: eureka1
#Eureka Server的application-eureka1.yml内容server:  port: 8761#Eureka专用配置Begineureka:  instance:    metadata-map:      #声明自己所属的区      zone: zoneA#自己是zoneA区的Eureka Server节点(取个容易识别的hostname)    hostname: eureka1.zonea.cn-shenzhen#自己的IP,多块网卡时最好指定,多网卡自动绑定很容易出错(例如装了VMWare虚拟机的情况)    ip-address: 127.0.0.1    #优先使用IP    prefer-ip-address: true  client:    serviceUrl:      #其实只需要Peer住其他两个区zoneB和zoneC的Eureka Server节点(我按官网写了三个)      defaultZone: http://eureka1.zonea.cn-shenzhen:8761/eureka/,http://eureka1.zoneb.cn-shenzhen:8762/eureka/,http://eureka1.zonec.cn-shenzhen:8763/eureka/    #自己作为服务端的客户端不需要像普通客户端一样去fetch服务列表,也不需要向任何服务端注册自己    fetch-registry: false    register-with-eureka: false
#Eureka Server的application-eureka2.yml内容server:  port: 8762#Eureka专用配置Begineureka:  instance:    metadata-map:      #声明自己所属的区      zone: zoneB#自己是zoneB区的Eureka Server节点(取个容易识别的hostname)    hostname: eureka1.zoneb.cn-shenzhen#自己的IP,多块网卡时最好指定,多网卡自动绑定很容易出错(例如装了VMWare虚拟机的情况)    ip-address: 127.0.0.1    #优先使用IP    prefer-ip-address: true  client:    serviceUrl:      #其实只需要Peer住其他两个区zoneA和zoneC的Eureka Server节点(我按官网写了三个)      defaultZone: http://eureka1.zonea.cn-shenzhen:8761/eureka/,http://eureka1.zoneb.cn-shenzhen:8762/eureka/,http://eureka1.zonec.cn-shenzhen:8763/eureka/    #自己作为服务端的客户端不需要像普通客户端一样去fetch服务列表,也不需要向任何服务端注册自己    fetch-registry: false    register-with-eureka: false
#Eureka Server的application-eureka3.yml内容server:  port: 8763#Eureka专用配置Begineureka:  instance:    metadata-map:      #声明自己所属的区      zone: zoneC    #自己是zoneC区的Eureka Server节点(取个容易识别的hostname)    hostname: eureka1.zonec.cn-shenzhen#自己的IP,多块网卡时最好指定,多网卡自动绑定很容易出错(例如装了VMWare虚拟机的情况)    ip-address: 127.0.0.1    #优先使用IP    prefer-ip-address: true  client:    serviceUrl:      #其实只需要Peer住其他两个区zoneA和zoneB的Eureka Server节点(我按官网写了三个)      defaultZone: http://eureka1.zonea.cn-shenzhen:8761/eureka/,http://eureka1.zoneb.cn-shenzhen:8762/eureka/,http://eureka1.zonec.cn-shenzhen:8763/eureka/    #自己作为服务端的客户端不需要像普通客户端一样去fetch服务列表,也不需要向任何服务端注册自己    fetch-registry: false    register-with-eureka: false

下面是重点,EurekaClient端的配置说明

#Eureka Client的application.yml内容spring:  application:    name: EurekaClient  profiles:    #多实例启动就改下这里active: clientA  main:    banner-mode: console#配置SpringBoot Actuatormanagement:  endpoints:    web:      exposure:        include: "*"  endpoint:    health:      show-details: always    shutdown:      enabled: true
#Eureka Client的application-clientA.yml内容server:  port: 8081#Eureka专用配置Begineureka:  instance:    metadata-map:      #声明自己所属的区Zone      zone: zoneAclient:    #声明自己所属的地区Region    region: cn-shenzhen#列明可能的区Zone(注意顺序)    availability-zones:      cn-shenzhen: zoneA,zoneB,zoneCservice-url:      #设置可用区Zone地址      zoneA: http://eureka1.zonea.cn-shenzhen:8761/eureka/      zoneB: http://eureka1.zoneb.cn-shenzhen:8762/eureka/      zoneC: http://eureka1.zonec.cn-shenzhen:8763/eureka/    #显示设置优先考虑请求同区Zone注册中心prefer-same-zone-eureka: true
#Eureka Client的application-clientB.yml内容server:  port: 8082#Eureka专用配置Begineureka:  instance:    metadata-map:      #声明自己所属的区Zone      zone:zoneBclient:    #声明自己所属的地区Region    region: cn-shenzhen    #列明可能的区Zone(注意顺序)    availability-zones:      cn-shenzhen: zoneB,zoneA,zoneCservice-url:      #设置可用区Zone地址      zoneA: http://eureka1.zonea.cn-shenzhen:8761/eureka/      zoneB: http://eureka1.zoneb.cn-shenzhen:8762/eureka/      zoneC: http://eureka1.zonec.cn-shenzhen:8763/eureka/    #显示设置优先考虑请求同区Zone注册中心prefer-same-zone-eureka: true
#Eureka Client的application-clientC.yml内容server:  port: 8083#Eureka专用配置Begineureka:  instance:    metadata-map:      #声明自己所属的区Zone      zone: zoneCclient:    #声明自己所属的地区Region    region: cn-shenzhen    #列明可能的区Zone(注意顺序)    availability-zones:      cn-shenzhen: zoneC,zoneA,zoneBservice-url:      #设置可用区Zone地址      zoneA: http://eureka1.zonea.cn-shenzhen:8761/eureka/      zoneB: http://eureka1.zoneb.cn-shenzhen:8762/eureka/      zoneC: http://eureka1.zonec.cn-shenzhen:8763/eureka/    #显示设置优先考虑请求同区Zone注册中心prefer-same-zone-eureka: true

客户端配置availability-zones时一定要注意顺序,要优先将自己所属的区(zone)排在前面,这样EurekaClient在发起续约(Renew)请求时,从所有可用区(zone)里第一个拿到的就是自己所在区(zone)的目标EurekaServer,否则就成在其他服务器上续约,会导至自己区(zone)里的EurekaServer的Renews (last min)值永远达不到要求而报出以下错误(这个错误是由于前来本EurekaServer续约的服务低于指定的自我保证阈值(默认85%)了,触发了Eureka自我保护机制,EurekaServer不再剔除服务注册表里的条目):

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY"RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

附上两张我自己画的EurekaServer常用部署架构图:

自己想一下最后这张图服务端和客户端要怎么配!!!

关键词: 数据中心 配置文件 显示设置