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

news2024/12/24 19:27:45

【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 自动进入自我保护机制, 就会关闭服务续约失效剔除的机制

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2.8 基于DPDK的UDP用户态协议栈实现

目录 一、网络协议栈1、**网络通信过程**2、**dpdk** 二、dpdk环境1、dpdk环境开启2、Windowe下配置IP和MAC地址的映射 三、实现用户态协议栈ustack1、UDP协议2、代码 四、dpdk一些基本函数接口rte_eal_init()rte_pktmbuf_pool_create()rte_socket_id()rte_eth_dev_configure()…

Java连接MySQL对数据实现增删改查

在实现好的窗口实现 添加修改删除查询数据的方法 以如下数据实验 statement自带的函数使用说明execute &#xff08;SQL&#xff09;执行给定的SQL语句返回一个或多个结果结果集 execute方法应该仅在语句能返回多个ResultSet对象、多个更新计数或ResultSet对象与更新计数的组…

Verilog | 基4 booth乘法器

上接乘法器介绍 原理 跟基2的算法一样&#xff0c;假设A和B是乘数和被乘数&#xff0c;且有&#xff1a; A ( a 2 n 1 a 2 n ) a 2 n − 1 a 2 n − 2 … a 1 a 0 ( a − 1 ) B b 2 n − 1 b 2 n − 2 … b 1 b 0 \begin{align}A&(a_{2n1}a_{2n})a_{2n−1}a_{2n−2}……

安卓期末考试知识总结(3)

文章目录 第五章 数据存储文件存储(非重点)内部存储获取或者打开目录操作文件 外部存储区 SharedPreferences存储写入Shared Preferences读取数据 SQLite数据库SQLite数据库的创建操作数据库数据Curosr数据库的事务 第五章 数据存储 简述Android数据存储的方式 Android平台提供…

FreeRTOS:任务通知

目录 一、任务通知简介二、发送任务通知2.1 函数xTaskNotify()2.2函数xTaskNotifyFromISR()2.3函数xTaskNotifyGive()2.4函数vTaskNotifyGiveFromISR()2.5函数xTaskNotifyAndQuery()2.6函数xTaskNotifyAndQueryFromISR() 三、获取任务通知3.1函数ulTaskNotifyTake()3.2函数xTas…

[进阶]Java:打印流、Properties、common-io框架

打印流&#xff1a; 作用&#xff1a;打印流可以实现方便、高效的打印数据到文件中去。打印流一般是&#xff1a;PrintStream&#xff0c;PrintWriter两个类。可以实现打印什么数据就是什么数据&#xff0c;例如打印整数97写出去就是97&#xff0c;打印boolean的true&#xff…

chatgpt赋能python:Python截取某段文字的方法

Python截取某段文字的方法 在处理文本数据时&#xff0c;截取某段文字是常见需求。Python作为一门优秀的脚本语言&#xff0c;提供了多种方法来完成这个任务。本篇文章将介绍Python截取某段文字的几种方便易用的方法。 方法一&#xff1a;使用切片 Python中的切片操作可以方…

JavaScript的一些编程题分享

将字符串abc-def-ghi转换为驼峰格式 这里我们的思路是利用字符串方法和正则表达式 const str abc-def-ghi;const camelCaseStr str.replace(/[-_][^-_]/g, match > match.charAt(1).toUpperCase());console.log(camelCaseStr); // abcDefGhi 这里使用了 replace 方法&a…

haproxy

haproxy haproxy一&#xff1a;常见的Web集群调度器1.软件2.硬件3.LVS &#xff0c;Nginx &#xff0c;Haproxy 的区别&#xff1a; 二&#xff1a;Haproxy应用分析1.HAProxy的主要特性有&#xff1a;2.HAProxy负载均衡策略非常多&#xff0c;常见的有如下8种&#xff1a; 三&a…

MySQL8.0数据库开窗函数

简介 数据库开窗函数是一种在SQL中使用的函数&#xff0c;它可以用来对结果集中的数据进行分组和排序&#xff0c;以便更好地分析和处理数据。开窗函数与聚合函数不同&#xff0c;它不会将多行数据聚合成一行&#xff0c;而是保留每一行数据&#xff0c;并对其进行分组和排序。…

Linux中/dev/random和/dev/urandom的作用

1./dev/random和/dev/urandom介绍 在Linux环境中&#xff0c;我们会用到/dev/random和/dev/urandom&#xff0c;今天为大家讲讲/dev/random和/dev/urandom的作用以及使用场景。 1.1./dev/random介绍 /dev/random是一个特殊的字符设备文件&#xff0c;用于生成“高质量”的随…

Python面向对象编程1-面向过程的简单纸牌游戏程序 项目1.1 定义纸牌的花色和点数

总项目目标&#xff1a;用面向过程思想设计一个简单的纸牌游戏程序&#xff0c;称为"Higher or Lower"&#xff08;高还是低&#xff09;。游戏中&#xff0c;玩家需要猜测接下来的一张牌是比当前牌高还是低。根据猜测的准确性&#xff0c;玩家可以得到或失去相应的积…

Unity UGUI1——基础组件概述

一、UGUI 介绍 ​ UGUI 是 Unity 引擎内自带的 UI 系统&#xff0c;官方称之为&#xff1a;Unity UI ​ 是目前 Unity 商业游戏开发中使用最广泛的 UI 系统开发解决方案 ​ 它是基于 Unity 游戏对象的 UI 系统&#xff0c;只能用来做游戏 UI 功能 ​ 不能用于开发 Unity 编…

【MarkDown】CSDN Markdown之Git图gitGraph详解

Git图 Git图是对不同分支上的Git提交和Git操作&#xff08;命令&#xff09;的图形化表示。 这种类型的图特别适合开发人员和DevOps团队分享他们的Git分支策略。例如&#xff0c;它可以更容易地可视化git流的工作方式。 Mermaid可以呈现Git图,但是只有v10.2.3 才支持。 代码…

kubernets 笔记

kubernets 笔记 kubernets 安装 1. 环境准备 硬件要求 内存&#xff1a;2GBCPU&#xff1a;2 核硬盘&#xff1a;30GB 本次环境说明 操作系统&#xff1a;CentOS 7.9内核版本&#xff1a;3.10.0-1160.76.1.el7.x86_64k8s-m&#xff1a;192.168.222.3k8s-s01&#xff1a;192.…

安装Apache、MySQL、PHP、论坛实操

文章目录 一、安装Apache1、准备阶段2、开始安装3、浏览器访问验证 二、部署MySQL三、部署php四、部署BBS论坛 一、安装Apache 1、准备阶段 &#xff08;1&#xff09;准备源码包 httpd-2.4.29.tar.gz apr-1.6.2.tar.gz apr-util-1.6.0.tar.gz cd /opt tar xf apr-1.6.2.tar…

【Windows】创建Windows远程桌面快捷方式

【Windows】创建Windows远程桌面快捷方式 1、背景2、操作 1、背景 windows系统自带了远程连接工具&#xff0c;可以实现局域网内的远程控制&#xff0c;参考&#xff1a; 【Windows】局域网内远程桌面控制 https://blog.csdn.net/jn10010537/article/details/130926888 但是w…

【Leetcode -404.左子叶之和 -543.二叉树的直径】

Leetcode Leetcode -404.左子叶之和Leetcode -543.二叉树的直径 Leetcode -404.左子叶之和 题目&#xff1a;给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3, 9, 20, null, null, 15, 7] 输出 : 24 解释 : 在这个二叉树中&…

vue三部曲

vue初入 简介 ​ vue生于2014年 Vue等框架与jQuery的区别 ​ jQuery是基于操作dom的库 ​ Vue框架是以数据驱动和组件化开发为核心 留坑、引包、实例化、插值表达式{{}} ​ vue第一个简单案例练习图。 引包 ​ 使用cnpm install vue2下载vue2&#xff08;version下载指…

ansible的剧本

一、playbooks 概述以及实例操作 1、playbooks 的组成 playbooks 本身由以下各部分组成 &#xff08;1&#xff09;Tasks&#xff1a;任务&#xff0c;即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行 &#xff08;2&#xff09;Variables&#xff1…