【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: trueipAddress: 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.hqwc.cn/news/4158.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes-Ingress、Ingress Controller、Ingress Class

概念 1.Ingress 是对K8S集群中服务的外部访问进行管理的 API 对象。Ingress 公开从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。 2.Ingress Controller 通常负责通过负载均衡器来实现 Ingress。 3.必须拥有一个 Ingress Controller…

vue(typescript)项目在vs中打开出现的各种问题

目录 vue3 报错解决&#xff1a;找不到模块或其相应的类型声明。&#xff08;Vue 3 can not find module&#xff09; (TS) 未知的编译器选项“allowImportingTsExtensions”。 TS6046 (TS) “--moduleResolution”选项的参数必须为 node, classic, node16, nodenext。…

使用 Sigstore 签名的 Elastic Stack 容器镜像!

作者&#xff1a;Maxime Greau 软件供应链攻击不断增加。 这就是为什么这个主题是安全领导者的首要任务。 在这方面&#xff0c;这篇博文重点介绍了使用 Sigstore 对 Elastic Stack 容器镜像进行签名的新功能&#xff0c;以便&#xff1a; 保护 Elastic 软件供应链工作流程为…

6月份读书学习好文记录

看看CHATGPT在最近几个月的发展趋势 https://blog.csdn.net/csdnnews/article/details/130878125?spm1000.2115.3001.5927 这是属于 AI 开发者的好时代&#xff0c;有什么理由不多去做一些尝试呢。 北大教授陈钟谈 AI 未来&#xff1a;逼近 AGI、融进元宇宙&#xff0c;开源…

Nginx(4)nginx的反向代理

反向代理 正向代理反向代理的常用指令反向代理实战 Nginx的安全控制使用SSL对流量进行加密nginx添加SSL的支持Nginx的SSL相关指令生成证书 反向代理系统调优 正向代理代理的对象是客户端&#xff0c;反向代理代理的是服务端&#xff0c;这是两者之间最大的区别。Nginx即可以实现…

Java应用在线debug--bistoury介绍

Bistoury介绍 Bistoury 是去哪儿网开源的一个对应用透明&#xff0c;无侵入的java应用诊断工具&#xff0c;用于提升开发人员的诊断效率和能力&#xff0c;可以让开发人员无需登录机器或修改系统&#xff0c;就可以从日志、内存、线程、类信息、调试、机器和系统属性等各个方面…

采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台

文章目录 1. 实验节点规划表2. 安装Prometheus3. 安装node_exporter4. 配置prometheus.yml文件5. 安装Grafana6. 安装Altermanager监控告警 采用 "PrometheusGrafana"的开源监控系统&#xff0c;安装部署K8S集群监控平台。 并使用Altermanager告警插件&#xff0c;配…

CentOS Linux的替代品(四)_openEuler 22.03-LTS基础安装教程

文章目录 1 openEuler 22.03-LTS简介1.1 系统安装1.1.1 发布件1.1.2 最小硬件要求1.1.3 硬件兼容性 1.2 关键特性1.2.1 openEuler 22.03-LTS基于 Linux Kernel 5.10内核构建, 在进程调度、内存管理等方面带来10余处创新1.2.2 新介质文件系统1.2.3 内存分级扩展1.2.4 用户态协议…

LLM - 第2版 ChatGLM2-6B (General Language Model) 的工程配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131445696 ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本&#xff0c;在保留了初代模型对话流畅、部署门槛较低等众多优…

Scrapy框架之下载中间件(详解)

目录 Scrapy中下载中间件 概念 方法 process_request(self, request, spider) 参数: process_response(self, request, response, spider) 参数 基本步骤 示例代码 注意 Scrapy 中 Downloader 设置UA 开发UserAgent下载中间件 代码 三方模块 配置模块到Settin…

GeneGPT:用领域工具增强大型语言模型,以改善对生物医学信息的访问

文章目录 一、论文关键信息二、主要内容1. Motivations2. 解决方案关键3. 实验和结果 三、总结与讨论 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、论文关键信息 论文标题&#xff1a;GeneGPT: Augmenting Large Language Models with Domain …

Python3 标准库概览 | 菜鸟教程(十八)

目录 一、Python3 标准库中的模块 &#xff08;一&#xff09;os 模块 &#xff08;二&#xff09;sys 模块 &#xff08;三&#xff09;time 模块 &#xff08;四&#xff09;datetime 模块 &#xff08;五&#xff09;random 模块 &#xff08;六&#xff09;math 模块…