前言

欢迎来到菜鸟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的网络拓扑图,可以总结如下:

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

本章代码

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

参考

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

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

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

关注我

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

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

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

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