前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[菜鸟SpringCloud入门]第三章:将Eureka改造为高可用集群

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

作者头像
Rude3Knife的公众号
发布2019-08-07 14:58:21
5410
发布2019-08-07 14:58:21
举报
文章被收录于专栏:后端技术漫谈后端技术漫谈

题图

前言

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

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

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

Github仓库地址:

https://github.com/qqxx6661/springcloud_for_noob

菜鸟SpringCloud入门实战系列

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

  • 关注我的公众号:Rude3Knife 点击公众号下方:技术推文——SpringCloud
  • 菜鸟SpringCloud实战专栏导航页(CSDN)

前文回顾:

实战版本

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

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

将Eureka改造为高可用集群

单机Eureka Server的致命缺陷

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

在这里插入图片描述

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

  • 当成千上万的服务提供者都向它单节点的服务注册中心进行注册时,它的负载是非常高的。
  • 一旦这个单节点的服务注册中心挂掉,则所有服务提供者的注册信息都将变得不可用。
创建eureka-ha子模块(high available的缩写)

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

修改其application.yml

代码语言:javascript
复制
---
# 高可用节点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文件下添加三行:

代码语言:javascript
复制
127.0.0.1    peer1
127.0.0.1    peer2
127.0.0.1    peer3

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

在这里插入图片描述

高可用服务测试

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

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

代码语言:javascript
复制
# 服务地址
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的网络拓扑图,可以总结如下:

在这里插入图片描述

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

本章代码

https://github.com/qqxx6661/springcloud_for_noob/tree/master/03-eureka-ha-eureka-hi-h

参考

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

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

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

  • 关注我的公众号:Rude3Knife 点击公众号下方:技术推文——SpringCloud
  • 菜鸟SpringCloud实战专栏(CSDN)

关注我

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

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

来微信和我聊聊: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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端技术漫谈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 菜鸟SpringCloud入门实战系列
  • 实战版本
  • -----正文开始-----
    • 将Eureka改造为高可用集群
      • 本章代码
        • 参考
        • -----正文结束-----
        • 关注我
          • 原创博客主要内容
            • 个人公众号:Rude3Knife
            相关产品与服务
            微服务引擎 TSE
            微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档