【Spring Cloud系列】-Eureka服务端高可用详解

【Spring Cloud系列】-Eureka服务端高可用详解

文章目录

  • 【Spring Cloud系列】-Eureka服务端高可用详解
      • 一. 序言
      • 二. 什么是高可用性
      • 三. 什么是CAP
          • 一致性(Consistency)
          • 可用性(Availability)
          • 分区容错(Partition-tolerance)
          • AP
          • CP
          • CA
      • 四. Eureka集群部署原理
      • 四、Eureka集群部署案例实现
      • 五、Eureka集群测试效果
      • 六、Eureka 的数据同步方式
        • 6.1. 复制方式
          • 主从复制
          • 对等复制
        • 6.2. 同步过程
      • 七、Eureka中元数据
          • 标准元数据
          • 自定义元数据
        • 元数据在程序中的应用
      • 八、Eureka自我保护
          • 什么是自我保护
          • 为什么会有自我保护机制
      • 九、Eureka中常用注解
      • @EnableEurekaClient与@EnableDiscoveryClient
      • @EnableEurekaServer
      • 十、Eureka总结

上一篇《Eureka使用详解》一文中我们详细介绍了什么是Spring Cloud微服务。Spring Cloud中Service注册中心及其Client如何实现并如何完成服务注册的。这一篇我们将介绍Eureka注册中心的高可用如何实现及其使用中的注意事项。

一. 序言

微服务就是开发一组小型服务的方式来完成对系统整个开发。其中每个小微服务都独立运行在自己的进程中,这些服务是围绕业务功能构建一个小微服务集群。其最终的目的就是:高容错可扩展易部署。但当我们在Eureka只采用单台注册服务中心时,如果注册中心服务崩溃,就会造成整个服务瘫痪。为解决这种风险。Eureka提供高可用的技术方案,下面将具体演示如果实现Eureka注册中心的高可用。

二. 什么是高可用性

高可用(High Availability)指通过尽量缩短因日常维护操作和突发的系统崩溃所导致的停机时间,以提高系统和应用的可用性。这也是和不间断操作的容错技术不同。高可用是为了防止核心计算机应用系统因故障突然停机的一种可靠的手段。

三. 什么是CAP

CAP原则又称CAP定理,指的是一个分布式中,一致性(Consistency)、可用性(Availability)、分区容错(Partition-tolerance).一般在一个分布式系统中三个要素不可同是具有,只能选择其中两个,具体如图

在这里插入图片描述

一个分布式系统里面,节点组成的网络本来应该是连通。然而可能因为一些故障,使得有些节点之间不连通,整个网络就分成了几块区域。数据就散布在了这些不连通的区域中。这就叫分区。

四. Eureka集群部署原理

  • 原理
    1. Eureka Client内置一个 使用轮询负载算法的负载均衡器。服务启动后,Eureka Client将会向Eureka Server发送心跳更新服务,如果Eureka Server在多个心跳周期内没有接收到某个服务的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。
    2. Eureka Server是基于netflix设计出来的,其服务注册表中将会存储所有可用服务节点的信息,支持region和availabilityZone的概念,采用peer to peer的架构模式,也可以通过配置remoteRegionUrlsWithName来支持拉取远程的region实例,如果当前的region挂了,会自动fallback到远程的region获取数据,同时服务端采用renew租约和定时心跳的方式保护注册信息(self preservation机制)。

四、Eureka集群部署案例实现

  1. Eureka单机服务部署已在【Spring Cloud系列】- Eureka知识详解中讲解如何使用,在这基础上我们构建另外两个服务:Server-node-01、Server-node-02

  2. 更新配置文件(application.yml)

    1. eureka.client.register-with-eureka :表示是否将自己注册到Eureka Server,默认为true。
    2. eureka.client.fetch-registry :表示是否从Eureka Server获取注册信息,默认为true
    3. eureka.client.serviceUrl.defaultZone :设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:30000/eureka ;多个地址可使用 , 分隔。
    • Server-node-01配置文件
      在这里插入图片描述

    • Server-node-02配置文件

      在这里插入图片描述

  3. 更新Hosts文件


    在这里插入图片描述

  4. 更新eureka-client配置

    在生产中我们可能需要三台或者大于三台的注册中心来保证服务的稳定性,配置的原理其实都一样,将注册中心分别指向其它的注册中心。这里只介绍三台集群的配置情况,其实和双节点的注册中心类似,每台注册中心分别又指向其它两个节点即可,使用application.yml来配置。

  5. 启动eureka-client服务轮询注册到服务端配置

    在这里插入图片描述

五、Eureka集群测试效果

  • Serve-30000服务

    在这里插入图片描述

  • Serve-30001服务

    在这里插入图片描述

  • Serve-30002服务

    在这里插入图片描述

六、Eureka 的数据同步方式

6.1. 复制方式

分布式系统的数据在多个副本之间的复制方式,主要有主从复制对等复制

6.2. 同步过程

Eureka Server 本身依赖了 Eureka Client,也就是每个 Eureka Server 是作为其他 Eureka Server 的 Client。

Eureka Server 启动后,会通过 Eureka Client 请求其他 Eureka Server 节点中的一个节点,获取注册的服务信息,然后复制到其他 peer 节点。

Eureka Server 每当自己的信息变更后,例如 Client 向自己发起注册、续约、注销请求, 就会把自己的最新信息通知给其他 Eureka Server,保持数据同步。

如果自己的信息变更是另一个Eureka Server同步过来的,这是再同步回去的话就出现数据同步死循环了。

Eureka Server 在执行复制操作的时候,使用 HEADER_REPLICATION 这个 http header 来区分普通应用实例的正常请求,说明这是一个复制请求,这样其他 peer 节点收到请求时,就不会再对其进行复制操作,从而避免死循环。

还有一个问题,就是数据冲突,比如 server A 向 server B 发起同步请求,如果 A 的数据比 B 的还旧,B 不可能接受 A 的数据,那么 B 是如何知道 A 的数据是旧的呢?这时 A 又应该怎么办呢?

数据的新旧一般是通过版本号来定义的,Eureka 是通过 lastDirtyTimestamp 这个类似版本号的属性来实现【lastDirtyTimestamp是注册中心里面服务实例的一个属性,表示此服务实例最近一次变更时间】

比如 Eureka Server A 向 Eureka Server B 复制数据,数据冲突有2种情况:

  1. A 的数据比 B 的新,B 返回 404,A 重新把这个应用实例注册到 B。
  2. A 的数据比 B 的旧,B 返回 409,要求 A 同步 B 的数据。

还有一个重要的机制:hearbeat 心跳,即续约操作,来进行数据的最终修复,因为节点间的复制可能会出错,通过心跳就可以发现错误,进行弥补。

七、Eureka中元数据

Eureka的元数据有两种:标准元数据和自定义元数据

元数据在程序中的应用

  • application中配置

    eureka:
      instance:
        #标准元数据
        preferIpAddress: true
        ipAddress: 127.0.0.1
        #自定义元数据信息
        metadata-map:
          name-serve:goyeer-serve 
          serve-code: v202306
    
    
  • 程序代码获取Eureka配置的元数据

    @Autowired
    DiscoveryClient discoveryClient;
    
    @RequestMapping("testDiscovery")
    public String testDiscovery() {
        List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("cloud-provider");
        // 获取第一个微服务实例的元数据信息
        ServiceInstance serviceInstance = serviceInstanceList.get(0);
        //打印微服务实例的元数据信息
        System.out.println(serviceInstance);
        return "testDiscovery";
    }
    

八、Eureka自我保护

九、Eureka中常用注解

  • @EnableEurekaClient与@EnableDiscoveryClient

    • 相同点

      @EnableDiscoveryClient@EnableEurekaClient 共同点就是:都是能够让注册中心能够发现,扫描到改服务;

    • 不同点

      @EnableEurekaClient只适用于Eureka作为注册中心

      @EnableDiscoveryClient可以是其他注册中心如Zookeeper

  • @EnableEurekaServer

    开启 eureka server 服务端,可以接受其他服务注册进来

十、Eureka总结

  1. AP: 非强一致, 要求客户端支持负载均衡及失败重试

  2. 对等复制:每个节点都接受写操作, 节点之间相互同步数据,当数据冲突时,通过比较节点数据的版本号 lastDirtyTimestamp 来同步最新的数据

  3. Zone, Region :默认数据同步只会发生在 Region 下面的多个 Zone 之间, 跨 Region 不会同步

  4. self preservation:eureka server 收不到服务心跳有两种情况:

    一种是个别服务挂了,就走服务续约失效剔除的机制;如果 Eureka Server 默认90秒没有接收到某个微服务实例的心跳,Eureka Server 将会剔除该实例。

    另一种情况就是微服务实例正常,但由于网络分区故障没收到心跳,这种情况就不应该剔除服务,所以就有了自我保护机制,如果在 15 分钟内超过 85% 的客户端节点都没有正常的心跳,Eureka Server 自动进入自我保护机制, 就会关闭服务续约失效剔除的机制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/32623.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Lowe‘s EDI 项目数据库方案开源介绍

近期为了帮助广大用户更好地使用 EDI 系统&#xff0c;我们根据以往的项目实施经验&#xff0c;将成熟的 EDI 项目进行开源。用户安装好知行之桥EDI系统之后&#xff0c;只需要下载我们整理好的示例代码&#xff0c;并放置在知行之桥指定的工作区中&#xff0c;即可开始使用。 …

使用cloc软件对项目的代码行数进行统计

1、下载cloc https://github.com/AlDanial/cloc/releases 进入之后选择exe进行下载。 2、下载之后随意放在任意文件夹下&#xff0c;并修改命名为cloc.exe 3、然后设置该目录为环境变量 4、在需要统计代码行数的目录&#xff0c;shift右键&#xff0c;打开Powershell窗口 5、输…

多元回归预测 | Matlab麻雀算法(SSA)优化极限学习机ELM回归,SSA-ELM回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab麻雀算法(SSA)优化极限学习机ELM回归,SSA-ELM回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% 清空环境变…

认识 SpringCloud 核心组件

✅作者简介&#xff1a;大家好&#xff0c;我是Cisyam&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Cisyam-Shark的博客 &#x1f49e;当前专栏&#xff1a; 微服务探索之旅 ✨特色专…

Spring Resources资源操作

文章目录 1、Spring Resources概述2、Resource接口3、Resource的实现类3.1、UrlResource访问网络资源3.2、ClassPathResource 访问类路径下资源3.3、FileSystemResource 访问文件系统资源3.4、ServletContextResource3.5、InputStreamResource3.6、ByteArrayResource 4、Resour…

PyGame游戏编程

Python非常受欢迎的一个原因是它的应用领域非常广泛&#xff0c;其中就包括游戏开发。而是用Python进行游戏开发的首选模块就是PyGame。 1. 初识Pygame PyGame是跨平台Python模块&#xff0c;专为电子游戏设计&#xff0c;包含图像、声音等&#xff0c;创建在SDL&#xff08;…

DAY31——贪心

1.分发饼干 class Solution {public int findContentChildren(int[] g, int[] s) {Arrays.sort(g);Arrays.sort(s);int start 0;int count 0;for (int i 0; i < s.length && start < g.length; i) {if (s[i] > g[start]) {start;count;}}return count;} } …

本地离线安装SeleniumIDE(Chrome)

一、插件下载 现需要准备一台可以连接外网的电脑&#xff0c;由于受到chrome的限制&#xff0c;我们可以选择搭梯子进行直接安装相应插件&#xff0c;但考虑到部分新手不会翻墙&#xff0c;本次提供一个不需翻墙的方法。 进入https://www.crx4chrome.com/crx/181591/网页内&…

SpringBoot项目-双人对战五子棋实验报告

简单五子棋Web项目报告 课 程 Web应用程序设计 项目名称 简单双人五子棋对战 成绩 专业班级 XXX 组别 无 学号 XXX 指导教师 XXX 姓 名 XXX 同组人姓名 无 完成日期 XXX 功能描述 1.用户的注册及登录功能 玩家可以在完成游戏账户的注册&#xff0c…

PADS VX 网络飞线的隐藏与关闭

如何设置隐藏和关闭网络飞线&#xff1f; 以隐藏和关闭GND网络飞线为例。网络飞线的隐藏&#xff1a;界面不会显示飞线&#xff0c;但移动器件时会显示。打开PADS layout&#xff0c;点击“查看”→“网络”&#xff08;快捷方式“CtrlAltN”&#xff09;&#xff0c;在弹出的…

POI导出Excel (满满的干货啊)

已经实现的POI导出Excel 步骤一&#xff1a;导入依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi…

k8s部署单点的minio集群

k8s部署单点的minio集群 文章目录 前言一、基础环境准备二、准备yaml文件三、执行部署四、命令行查看部署结果五、登陆页面访问总结 前言 记录一下根据minio官网的范本部署一个单节点单磁盘的minio服务端。 一、基础环境准备 准备一个k8s集群&#xff0c;配置好存储类 二、…

【从删库到跑路】MySQL数据库的查询(单表查询,多表查询,内外连接,联合查询,子查询)

&#x1f38a;专栏【MySQL】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 文章目录 &#x1f354;多表查询⭐多表关系&#x1f388;一对多&#x…

数学建模常用算法之主成分分析

数学建模常用算法之主成分分析 引言步骤实例以及代码 引言 主成分分析是一种降维算法&#xff0c;它能将多个指标转换为少数几个主成分&#xff0c;这些主成分是原始变量的线性组合&#xff0c;且彼此之间互不相关&#xff0c;且能反映出原始数据的大部分信息。 一般来说&#…

Boom 3D For Win如何进行安装、激活和换机?

Boom系列应用软件又迎来了一位新的“猛将”— 隆重升级的Boom 3D&#xff08;Windows系统&#xff09;&#xff01;这款主打3D环绕音效的软件&#xff0c;既能使用在Windows设备上&#xff0c;也能使用在MAC设备上。Boom 3D既可以让你体验到高质量的3D环绕音效&#xff0c;也能…

分布式幂等问题解决方案

目录 一 背景 二 什么是幂等 三 解决方案三部曲 第一部曲&#xff1a;识别相同请求 第二部曲&#xff1a;列出并减少副作用的分析维度 第三部曲&#xff1a;识别细粒度副作用&#xff0c;针对性设计解决方案 四 总结 一 背景 分布式系统由众多微服务组成&#xff0c;微…

基于嵌入式ARM的工控机与X86工控机的比较

基于嵌入式ARM工控机相对于X86工控机的优点&#xff1a; (1)、功耗&#xff1a;这是ARM工控机最大的优点之一&#xff0c;一般的VIA的X86主板&#xff0c;功耗都在40W左右或者以上&#xff0c;而ARM工控机的功耗极低&#xff0c;DTU系列工控机功耗整体也只有1W左右。 (2)、发热…

docker安装mysql并且进行连接

1、拉取镜像、在linux中执行命令 docker pull mysql 2、运行容器、在linux中执行命令 docker run -d --name mysql -p 3308:3306 -e MYSQL_ROOT_PASSWORD123456 mysql3、 进入容器、在linux中执行命令 docker ps -a docker exec -it 2a85f05d4090 /bin/bash 4、登录docker中的m…

uniapp 详细封装缓存定时过期方法,详细使用过程

最近在开发一个uniapp的项目&#xff0c;中间我们需要给缓存定时&#xff0c;为了解决这个问题&#xff0c;封装了一个方法用来解决这个问题&#xff0c;当时遇到这个问题是因为在项目中要给阿里的OSS上传文件&#xff0c;上传之间先要向服务端请求获取授权&#xff0c;授权我们…

4.28 poll API介绍及代码编写

4.28 poll API介绍及代码编写 #include <poll.h> struct pollfd{int fd;//委托内核检测的文件描述符short events;//委托内核检测文件描述符的什么事件short revents;//文件描述符实际发生的事件 }; int poll(struct pollfd *fds,nfds_t nfds,int timeout);-参数&#x…