[菜鸟SpringCloud入门]第三章:将Eureka改造为高可用集群

在这里插入图片描述

前言

欢迎来到菜鸟SpringCloud入门实战系列(SpringCloudForNoob),该系列通过层层递进的实战视角,来一步步学习和理解SpringCloud。

本系列适合有一定Java以及SpringBoot基础的同学阅读。

每篇文章末尾都附有本文对应的Github源代码,方便同学调试。

Github仓库地址:

https://github.com/qqxx6661/springcloud_for_noob

菜鸟SpringCloud入门实战系列

你还可以通过以下两种途径查看菜鸟SpringCloud入门实战系列

实战版本

  • SpringBoot:2.0.3.RELEASE
  • SpringCloud:Finchley.RELEASE

-----正文开始-----

将Eureka改造为高可用集群

单机Eureka Server的致命缺陷

简单的服务注册中心Eureka Server与服务提供者Eureka Client的网络拓扑图

在这里插入图片描述

这种配置方式有以下致命缺陷:

  • 当成千上万的服务提供者都向它单节点的服务注册中心进行注册时,它的负载是非常高的。
  • 一旦这个单节点的服务注册中心挂掉,则所有服务提供者的注册信息都将变得不可用。

创建eureka-ha子模块(high available的缩写)

为了方便学习集群eureka,我们创建单独的子模块eureka-ha

修改其application.yml

---
# 高可用节点1的配置
server:
  port: 8771
spring:
  # 节点1的标签
  profiles: peer1
  # 服务名保持一致
  application:
    name: eureka-ha
eureka:
  instance:
    hostname: peer1
  client:
    # 进行注册(高可用配置、默认配置)
    # registerWithEureka: true
    # 获取注册信息(高可用配置、默认配置)
    # fetchRegistry: true
    serviceUrl:
      # 节点1向节点2/3进行服务注册
      defaultZone: http://localhost:8772/eureka/,http://localhost:8773/eureka/

---
# 高可用节点2的配置
server:
  port: 8772
spring:
  # 节点2的标签
  profiles: peer2
  # 服务名保持一致
  application:
    name: eureka-ha
eureka:
  instance:
    hostname: peer2
  client:
    # 进行注册(高可用配置、默认配置)
    # registerWithEureka: true
    # 获取注册信息(高可用配置、默认配置)
    # fetchRegistry: true
    serviceUrl:
      # 节点2向节点1/3进行服务注册
      defaultZone: http://localhost:8771/eureka/,http://localhost:8773/eureka/

---
# 高可用节点3的配置
server:
  port: 8773
spring:
  # 节点3的标签
  profiles: peer3
  # 服务名保持一致
  application:
    name: eureka-ha
eureka:
  instance:
    hostname: peer3
  client:
    # 进行注册(高可用配置、默认配置)
    # registerWithEureka: true
    # 获取注册信息(高可用配置、默认配置)
    # fetchRegistry: true
    serviceUrl:
      # 节点3向节点1/2进行服务注册
      defaultZone: http://localhost:8771/eureka/,http://localhost:8772/eureka/

代码重点:

  • 在yml文件中,通过---来区分多个文件,减少配置文件个数。
  • 高可用配置中的节点,每个节点的端口号不同
  • 高可用配置中的节点,所有节点的服务名相同,即spring.application.name相同
  • 高可用配置中的节点,默认情况下,registerWithEureka: true、fetchRegistry: true
  • 高可用配置中的节点,需要向除自己之外的节点进行服务注册
  • 高可用配置中,设置了每个节点的标签spring.profiles,通过此标签来区分到底启动哪个配置页。

修改EurekaHaApplication启动类

和eureka一养,添加@EnableEurekaServer

启动三节点Eureka

因为是集群,所以要启动三个端口不同的实例,端口已经在yml文件中进行了设置。

在Run configuration里自行设置三个运行配置,分别对应三个配置文件,注意图中箭头的设置。

在这里插入图片描述

你也可以使用复制配置按钮:

在这里插入图片描述

如果你发现Run configuration里没有eureka-ha,请手动添加:

在这里插入图片描述

最后,分别运行三个eureka-ha:

在这里插入图片描述

打开网页,输入 http://localhost:8771/http://localhost:8772/http://localhost:8773/

可以看到,Instances里有了三个注册的实例

在这里插入图片描述

你以为大功告成了,然而,你发现有一个问题,所有的服务显示在了unavailable-replicas之下。

经过搜索,看见了如下解释,

参考:Eureka高可用,节点均出现在unavailable-replicas下:

https://www.jianshu.com/p/59c54ccc6ba6

eureka.client.serviceUrl.defaultZone配置项的地址,不能使用localhost,要使用域名,DNS解析请自行配置。

由于我们在yml文件里设置了类似defaultZone: http://localhost:8771/eureka/,http://localhost:8772/eureka/, 符合上述问题, 所以这里的注册url不能设置为localhost

看来,还是需要自己搞定DNS,对应我Windows的环境,也就是要修改host设置。

修改HOST请自行谷歌,在host文件下添加三行:

127.0.0.1   peer1
127.0.0.1   peer2
127.0.0.1   peer3

重新启动三个实例,大功告成:

在这里插入图片描述

高可用服务测试

我们新建子模块eureka-hi-ha,用来作为高可用集群下的服务提供者

修改application.yml,设置为8783端口

# 服务地址
server:
  port: 8783
# 服务名称
spring:
  application:
    name: service-hi-ha
eureka:
  client:
    serviceUrl:
      # 这里只需要执行其中一个服务注册中心节点即可
      defaultZone: http://peer1:8771/eureka/

这里只需要执行其中一个服务注册中心节点即可,其他两个eureka会自动收到来自peer1的客户端记录信息,进行同步。

启动eureka-hi-ha,同时刚才的三个eureka server 不要关闭

在这里插入图片描述

查看网页: http://localhost:8771/http://localhost:8772/http://localhost:8773/

可以看到,8773也成功显示了服务。

在这里插入图片描述

我们来实验让一个节点停机,我们关闭peer1的进程

注意:

  • peer1节点并没有立即从服务列表中消失,这是因为服务注册中心通过心跳来检测服务是否存活。
  • 服务宕机之后,服务并不会马上从服务注册中心注销。
  • 只有当超过规定时间还未检测到服务时,才会注销服务。
  • 虽然peer1节点挂掉了,但是eureka-hi-ha的注册信息在其他注册中心节点还是存在的。

高可用的服务注册中心Eureka Server与服务提供者Eureka Client的网络拓扑图,可以总结如下:

在这里插入图片描述

当前其中任意节点宕机之后,其他节点上还保存着所有的服务注册信息。

参考

springcloud(二):注册中心Eureka:

http://www.ityouknow.com/springcloud/2017/05/10/springcloud-eureka.html

Spring-Cloud笔记03:服务注册中心Eureka Server的简单配置、访问控制配置以及高可用配置

https://blog.csdn.net/hanchao5272/article/details/80561199

-----正文结束-----

全复习手册文章导航:通过以下两种途径查看

菜鸟SpringCloud实战专栏

关注我

我是蛮三刀把刀,后端开发。

主要关注后端开发,数据安全,爬虫等方向。

来微信和我聊聊:yangzd1102

Github个人主页:

https://github.com/qqxx6661

原创博客主要内容

  • Java知识点复习全手册
  • Leetcode算法题解析
  • 剑指offer算法题解析
  • Python爬虫相关技术实战
  • 后端开发相关技术实战
  • SpringCloud入门实战

同步更新公众号及以下博客

1. Csdn

http://blog.csdn.net/qqxx6661

拥有专栏:

  • Leetcode题解(Java/Python)
  • Python爬虫实战
  • Java程序员知识点复习手册
  • SpringCloud入门实战

2. 知乎

https://www.zhihu.com/people/yang-zhen-dong-1/

拥有专栏:

  • Java程序员面试复习手册
  • LeetCode算法题详解与代码实现
  • 后台开发实战

3. 掘金

https://juejin.im/user/5b48015ce51d45191462ba55

4. 简书

https://www.jianshu.com/u/b5f225ca2376

个人公众号:Rude3Knife

个人公众号:Rude3Knife

如果文章对你有帮助,不妨收藏起来并转发给您的朋友们~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容