前言
欢迎来到菜鸟SpringCloud入门实战系列(SpringCloudForNoob),该系列通过层层递进的实战视角,来一步步学习和理解SpringCloud。
本系列适合有一定Java以及SpringBoot基础的同学阅读。
每篇文章末尾都附有本文对应的Github源代码,方便同学调试。
Github仓库地址:
https://github.com/qqxx6661/springcloud_for_noob
菜鸟SpringCloud入门实战系列
你可以通过以下两种途径查看菜鸟SpringCloud入门实战系列:
- 关注我的公众号:Rude3Knife 点击公众号下方:技术推文——SpringCloud
- 菜鸟SpringCloud实战专栏导航页(CSDN)
前文回顾:
- [菜鸟SpringCloud入门]第一章:构建多模块的Maven项目+创建注册中心Eureka子模块
- [菜鸟SpringCloud入门]第二章:创建服务提供者并在Eureka进行注册
- …更多文章请查看上方:菜鸟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
-----正文结束-----
全复习手册文章导航:通过以下两种途径查看
- 关注我的公众号:Rude3Knife 点击公众号下方:技术推文——SpringCloud
- 菜鸟SpringCloud实战专栏(CSDN)
关注我
我是蛮三刀把刀,后端开发。
主要关注后端开发,数据安全,爬虫等方向。
来微信和我聊聊:yangzd1102
Github个人主页:
原创博客主要内容
- Java知识点复习全手册
- Leetcode算法题解析
- 剑指offer算法题解析
- Python爬虫相关技术实战
- 后端开发相关技术实战
- SpringCloud入门实战
同步更新公众号及以下博客
1. Csdn
拥有专栏:
- 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
如果文章对你有帮助,不妨收藏起来并转发给您的朋友们~