前言
欢迎来到菜鸟 SpringCloud 入门实战系列 (SpringCloudForNoob), 该系列通过层层递进的实战视角, 来一步步学习和理解 SpringCloud.
本系列适合有一定 Java 以及 SpringBoot 基础的同学阅读.
每篇文章末尾都附有本文对应的 GitHub 源代码, 方便同学调试.
GitHub 仓库地址:
https://github.com/qqxx6661/springcloud_for_noob
菜鸟 SpringCloud 入门实战系列
你还可以通过以下两种途径查看菜鸟 SpringCloud 入门实战系列:
关注我的公众号: Rude3Knife 点击公众号下方: 技术推文 --SpringCloud
菜鸟 SpringCloud 实战专栏导航页 (CSDN) https://blog.csdn.net/qqxx6661
实战版本
- SpringBoot:2.0.3.RELEASE
- SpringCloud:Finchley.RELEASE
----- 正文开始 -----
将 Eureka 改造为高可用集群
单机 Eureka Server 的致命缺陷
简单的服务注册中心 Eureka Server 与服务提供者 Eureka Client 的网络拓扑图
这种配置方式有以下致命缺陷:
当成千上万的服务提供者都向它单节点的服务注册中心进行注册时, 它的负载是非常高的.
一旦这个单节点的服务注册中心挂掉, 则所有服务提供者的注册信息都将变得不可用.
创建 eureka-ha 子模块 (high available 的缩写)
为了方便学习集群 eureka, 我们创建单独的子模块 eureka-ha
修改其 application.YAML
- ---
- # 高可用节点 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/
代码重点:
在 YAML 文件中, 通过 --- 来区分多个文件, 减少配置文件个数.
高可用配置中的节点, 每个节点的端口号不同
高可用配置中的节点, 所有节点的服务名相同, 即 spring.application.name 相同
高可用配置中的节点, 默认情况下, registerWithEureka: true,fetchRegistry: true
高可用配置中的节点, 需要向除自己之外的节点进行服务注册
高可用配置中, 设置了每个节点的标签 spring.profiles, 通过此标签来区分到底启动哪个配置页.
修改 EurekaHaApplication 启动类
和 eureka 一养, 添加 @EnableEurekaServer
启动三节点 Eureka
因为是集群, 所以要启动三个端口不同的实例, 端口已经在 YAML 文件中进行了设置.
在 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 解析请自行配置.
由于我们在 YAML 文件里设置了类似 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.YAML, 设置为 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
----- 正文结束 -----
全复习手册文章导航: 通过以下两种途径查看
关注我的公众号: Rude3Knife 点击公众号下方: 技术推文 --SpringCloud
菜鸟 SpringCloud 实战专栏 (CSDN) https://blog.csdn.net/qqxx6661
菜鸟 SpringCloud 实战专栏
[菜鸟 SpringCloud 入门] 第一章: 构建多模块的 Maven 项目 + 创建注册中心 Eureka 子模块
[菜鸟 SpringCloud 入门] 第二章: 创建服务提供者并在 Eureka 进行注册
... 更多文章请查看上方: 菜鸟 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. 掘金
juejin.im/user/5b4801...
4. 简书
https://www.jianshu.com/u/b5f225ca2376
个人公众号: Rude3Knife
如果文章对你有帮助, 不妨收藏起来并转发给您的朋友们~
来源: https://juejin.im/post/5c8619b0e51d4510a06d3fe5