【Spring Cloud系列】- Eureka使用详解

news2024/10/7 6:50:22

【Spring Cloud系列】- Eureka使用详解

文章目录

  • 【Spring Cloud系列】- Eureka使用详解
    • 一、概述
    • 二、Eureka简介
    • 三、Eureka结构与作用
        • Eureka结构图
        • Eureka采用CS(Client/Server,客户端/服务器)架构,它包括以下两大组件
    • 四、Eureka集群及与应用关系
          • Eureka关系图
        • Eureka 实现服务注册与发现的流程
    • 五、Eureka注册中心实现
        • pom.xml添加依赖
        • 创建Eureka服务主类
        • 添加application配置信息
    • 六、Eureka客户端
        • pom.xml添加依赖
        • 创建Eureka服务主类
        • 添加application配置信息
    • 七、自我保护机制
          • Eureka重要两个变量:
    • 八、总结

一、概述

Eureka2.0版本已经停止维护,为什么要写这篇博客重复已停止更新的中间件,其目的主要是:

  1. 认识微服务注册中心:虽然Eureka已经停止维护,但微服务架构在当今非常流程,学习Eureka可以更好的理解微服务。
  2. 便于老旧系统维护:如果使用微服务,公司一定会存在使用Eureka服务的应用系统,学习Eureka便于储备老旧系统维护的能力。

二、Eureka简介

Eureka是Netflix的一个子模块,也是核心模块之一。Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。

三、Eureka结构与作用

Eureka结构图

在这里插入图片描述

Eureka采用CS(Client/Server,客户端/服务器)架构,它包括以下两大组件

  1. Eureka Server:Eureka 服务注册中心,主要用于提供服务注册功能。当微服务启动时,会将自己的服务注册到 Eureka Server。Eureka Server 维护了一个可用服务列表,存储了所有注册到 Eureka Server 的可用服务的信息,这些可用服务可以在 Eureka Server 的管理界面中直观看到。
  2. Eureka Client:Eureka 客户端,通常指的是微服务系统中各个微服务,主要用于和 Eureka Server 进行交互。在微服务应用启动后,Eureka Client 会向 Eureka Server 发送心跳(默认周期为 30 秒)。若 Eureka Server 在多个心跳周期内没有接收到某个 Eureka Client 的心跳,Eureka Server 将它从可用服务列表中移除(默认 90 秒)。

"心跳"是一段定时发送的自定义信息,让对方知道自己"存活",以确保连接有效性,大部分CS架构的应用程序都采用心跳机制,服务端和客户端都可以发送心跳。通常情况下客户端发送请求心跳包给服务器端。服务器端判断客户端是否存活在线。

四、Eureka集群及与应用关系

  • Eureka关系图

在这里插入图片描述

  • Eureka 实现服务注册与发现的流程

    1. 服务提供者(Eureka Client Provider)启动时,把当前服务器信息以服务名(spring.application.name)的方式注册到注册中心。
    2. 服务器消费者(Eureka Client Consumer)启动时,也会注册自己的服务名到注册中心。
    3. 服务消费者(Consumer)注册的同时会获取一份可用的服务器列表。该列表中包含了所有注册到服务注册中心的服务信息(包含服务器提供者和自身服务信息)。
    4. 在获得可用服务列表后,服务消费者通过HTTP或消息中间件远程调用服务者提供服务。

服务中心(Eureka Server)是个十分重要的角色,他是服务提供者(Provider)和服务消费者(Consumer)之间的桥梁。服务提供者只有将自己的服务注册到服务注册中心才可能被服务消费者调用。而服务消费者也只有通过服务注册中心获取可用服务列表后,才能调用所需的服务。为保证应用的高可用型;使用多个注册中心,相互注册保证任何一台注册中心故障不影响整个服务器中心向外提供服务。

五、Eureka注册中心实现

  • pom.xml添加依赖

    1. 添加spring-boot-starter-parent依赖

      <parent>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-parent</artifactId>
          <version>2.3.6.RELEASE</version>
          <relativePath/>
      </parent>
      
    2. 添加依赖dependencyManagement

      <dependencyManagement>
        <dependencies>
           <dependency>
               <groupId>org.springframework.cloud</groupId>
               <artifactId>spring-cloud-dependencies</artifactId>
               <version>Hoxton.SR12</version>
               <type>pom</type>
               <scope>import</scope>
            </dependency>
         </dependencies>
      </dependencyManagement>
      
    3. 添加相关依赖

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-devtools</artifactId>
         <scope>runtime</scope>
         <optional>true</optional>
      </dependency>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <version>3.0.5</version>
          <scope>test</scope>
      </dependency>
      
  • 创建Eureka服务主类

    package com.goyeer;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    //Eureka注册中心注解
    @EnableEurekaServer
    @SpringBootApplication
    public class EurekaService {
        public static void main(String[] args){
            SpringApplication.run(EurekaService.class,args);
        }
    }
    
  • 添加application配置信息

    server:
      port: 30009
    eureka:
      instance:
        #服务注册中心实例的主机名
        hostname: localhost
      client:
        #实例是否在eureka服务器上注册自己的信息以供其他服务发现,默认为true
        register-with-eureka: false
        #此客户端是否获取eureka服务器注册表上的注册信息,默认为true
        fetch-registry: false
        service-url:
          #与Eureka注册服务中心的通信zone和url地址
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
          registerWithEureka: false
          fetchRegistry: false
      server:
        enable-self-preservation: false
        eviction-interval-timer-in-ms: 5000
    

在这里插入图片描述

六、Eureka客户端

  • pom.xml添加依赖

    pom文件可用直接使用Eureka服务端pom文件,只需要把spring-cloud-starter-netflix-eureka-server替换为spring-cloud-netflix-eureka-client

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-netflix-eureka-client</artifactId>
    </dependency>
    
  • 创建Eureka服务主类

    package com.awinic;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    
    @EnableEurekaClient
    @SpringBootApplication
    public class EurekaProviderClientApp {
       public static void main(String[] args){
           SpringApplication.run(EurekaProviderClientApp.class,args);
       }
    }
    
  • 添加application配置信息

    server:
      port: 30001
    eureka:
      instance:
        hostname: localhost
      client:
        #实例是否在eureka服务器上注册自己的信息以供其他服务发现,默认为true
        register-with-eureka: true
        fetch-registry: false
        service-url:
          defaultZone: http://${eureka.instance.hostname}:30000/eureka/
          registerWithEureka: false
          fetchRegistry: false
    

七、自我保护机制

Eureka在CAP理论当中是属于AP , 也就说当产生网络分区时,Eureka保证系统的可用性,但不保证系统里面数据的一致性,当发生网络分区的时候,Eureka-Server和Client端的通讯被终止,Eureka Server端接收不到Eureka Client续约请求,此时,如果直接将没有收到心跳Eureka Client端自动剔除,那么就可能误把正常的Eureka Client端给剔除。这个不符合AP理论,所有Eureka-Server会保留可能已宕机的Eureka Server端。从而保证了Eureka Server的健壮性,符合AP理论。

Eureka重要两个变量:
this.expectedNumberOfRenewsPerMin = count * 2;
this.numberOfRenewsPerMinThreshold =(int) (this.expectedNumberOfRenewsPerMin * serverConfig.getRenewalPercentThreshold());

expectedNumberOfRenewsPerMin :每分钟最大的续约数量,由于客户端是每30秒续约一次,一分钟就是续约2次, count代表的是客户端数量。

所以这个变量的计算公式 : 客户端数量*2

numberOfRenewsPerMinThreshold : 每分钟最小续约数量, 使用expectedNumberOfRenewsPerMin * serverConfig.getRenewalPercentThreshold()。
serverConfig.getRenewalPercentThreshold()的默认值为0.85 , 也就是说每分钟的续约数量要大于85% 。
Eureka的自我保护机制,都是围绕以上两个变量实现的,如果每分钟的续约数量小于numberOfRenewsPerMinThreshold,此时就会开启自动保护机制。

在此期间,Eureka Server不会主动剔除任何一个客户端。

八、总结

Eureka 是Spring Cloud核心它提供一下几个主要的服务:

  1. 服务注册和发现:eureka 分客户端(Eureka Client)和服务端(Eureka Server),服务端即为注册中心,提供服务注册和发现的功能。所有客户端将自己注册到注册中心上,服务端使用 Map 结构基于内存保存所有客户端信息(IP、端口、续约等信息)。客户端定时从注册中心拉取注册表到本地,就可以通过负载均衡的方式进行服务间的调用。
  2. 服务注册(Register):Eureka Client 启动时向 Eureka Server 注册,并提供自身的元数据、IP地址、端口、状态等信息。
  3. 服务续约(Renew):Eureka Client 默认每隔30秒向 Eureka Server 发送一次心跳进行服务续约,通过续约告知 Eureka Server 自己是正常的。如果 Eureka Server 180秒没有收到客户端的续约,就会认为客户端故障,并将其剔除。
  4. 抓取注册表(Fetch Registry):Eureka Client 启动时会向 Eureka Server 全量抓取一次注册表到本地,之后会每隔30秒增量抓取注册表合并到本地注册表。如果合并后的本地注册表与 Eureka Server 端的注册表不一致(hash 比对),就全量抓取注册表覆盖本地的注册表。
  5. 服务下线(Cancel):Eureka Client 程序正常关闭时,会向 Eureka Server 发送下线请求,之后 Eureka Server 将这个实例从注册表中剔除。
  6. 故障剔除(Eviction):默认情况下,Eureka Client 连续180秒没有向 Eureka Server 发送续约请求,就会被认为实例故障,然后从注册表剔除。
  7. Eureka Server 集群:Eureka Server 采用对等复制模式(Peer to Peer)来进行副本之间的数据同步,集群中每个 Server 节点都可以接收写操作和读操作。Server 节点接收到写操作后(注册、续约、下线、状态更新)会通过后台任务打包成批量任务发送到集群其它 Server 节点进行数据同步。Eureka Server 集群副本之间的数据会有短暂的不一致性,它是满足 CAP 中的 AP,即 高可用性和分区容错性

后面将陆续介绍Eureka配置项、Eureka服务集群、Eureka源码解析…

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

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

相关文章

梁宁:为什么中国没有像 ChatGPT 和 Vision Pro 这样的创新产品?

6 月 10 日&#xff0c;产品战略专家梁宁和图灵联合创始人刘江围绕“ ChatGPT 真需求”主题进行直播对谈。 梁宁&#xff0c;产品战略专家&#xff0c;曾任湖畔大学产品模块学术主任&#xff0c;联想、腾讯高管&#xff0c;CNET集团副总裁。 工作经历横跨 BAT&#xff0c;与美团…

第14届蓝桥杯Scratch(中级)国赛真题解析2023.5.28

第14届蓝桥杯Scratch(中级)国赛真题解析2023.5.28 一:选择题(50分)第 1 题 单选题(10分) 运行以下程序后,角色说出的数是 ( C )。 *选择题严禁使用程序验证,选择题不答或答错都不扣分 A.150 B.200 C.300 D.600第 2 题 单选题(10分) 对以下程序效果描述完全正确的是 …

【JUC进阶】01. Synchroized实现原理

目录 1、前言 2、Synchronized使用 2.1、对象锁&#xff08;Instance Lock&#xff09; 2.2、类锁&#xff08;Class Lock&#xff09; 2.3、方法锁&#xff08;Method Lock&#xff09; 3、原理分析 3.1、monitor对象 3.2、monitorenter 3.3、monitorexit 3.4、对象…

库克和马斯克之后,比尔盖茨访华,美企认识到中国市场不可替代

微软创始人比尔盖茨已到达了中国&#xff0c;这是美国苹果CEO库克、特斯拉CEO马斯克之后访华的又一位美国重要企业家&#xff0c;那么美国企业家陆续访华是为了什么呢&#xff1f; 一、美企连遭挫折 苹果一季度的业绩显示营收、利润均下滑了个位数&#xff0c;但是苹果看到了隐…

AIGC 加持 Cocos,游戏开发需要几步?

近日&#xff0c;游戏行业知名的 B2B 大会 WN 2023 大会于土耳其首都伊斯坦布尔顺利举办。本次大会邀请了来自全球的游戏开发商、媒体、发行商、分发平台等行业决策者&#xff0c;共同探讨游戏行业未来发展态势&#xff0c;进一步拓展业务&#xff0c;并在世界范围内寻找新的合…

【力扣刷题 | 第十天】347.前k个高频元素 227 简单计算器

前言&#xff1a; 本篇将是最后一篇我们利用栈与队列来解决力扣问题&#xff0c;在下文我们将进入到数这一章&#xff0c;相对应的【夜深人静讲数据结构与算法】专栏中树也会及时更新。 347. 前 K 个高频元素 - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 nums 和…

【JS】1714- 重学 JavaScript API - Geolocation API

❝ 前期回顾&#xff1a; 1. Page Visibility API 2. Broadcast Channel API 3. Beacon API 4. Resize Observer API 5. Clipboard API 6. Fetch API 7. Performance API 8. WebStorage API 9. WebSockets API 10. Fullscreen API ❞ 本文将深入探讨 Geolocation API 的概念、使…

华为OD机试真题 JavaScript 实现【关联子串】【2023Q1 100分】,附详细解题思路

一、题目描述 给定两个字符串str1和str2&#xff0c;str1进行排列组合只要有一个为str2的子串则认为str1是str2的关联子串&#xff0c;请返回子串在str2的起始位置&#xff0c;若不是关联子串则返回-1。 二、输入描述 qwe dsgfasgfwe 三、输出描述 -1 四、解题思路 读取…

009、体系架构之HTAP

HTAP HTAP技术传统的HTAP解决方案HATP的要求TiDB的HTAP架构TiDB的HTAP特性使用场景 MPP HTAP技术 传统的HTAP解决方案 HATP的要求 可扩展性 分布式事务分布式存储 同时支持OLTP与OLAP 同时支持行存和列存OLTP与OLAP业务隔离 实时性 行存与列存数据实时同步 TiDB的HTAP架构 …

Committer 迎新!这次是来自阿里云的同学

点击蓝字 关注我们 迎新&#xff01; 截至今天&#xff0c;Apache DolphinScheduler 项目在 GitHub 上的 Star 数已突破 10.6K&#xff0c;贡献者人数也突破了 470 人。社区的不断壮大&#xff0c;离不开每位 Contributor 的支持。 最近&#xff0c;Apache DolphinScheduler 又…

AI模型部署实战:利用CV-CUDA加速视觉模型部署流程

本文首发于公众号【DeepDriving】&#xff0c;欢迎关注。 CV-CUDA简介 随着深度学习技术在计算机视觉领域的发展&#xff0c;越来越多的AI算法模型被用于目标检测、图像分割、图像生成等任务中&#xff0c;如何高效地在云端或者边缘设备上部署这些模型是工程师迫切需要解决的问…

Android 13(T) - 智能指针

Android有一套自己的智能指针管理办法&#xff0c;并且将其运用在源码的各个角落&#xff0c;所以学习Media框架之前&#xff0c;我们有必要先了解下Android智能指针。 本节代码源自于Android 13(T)&#xff0c;参考 (aospxref.com) 1 概述 与智能指针相关的总共有5个类&#…

某小厂面试加答案(6.15)

看 Java 面试题就去 www.javacn.site 磊哥新推出《企业面经和答案》栏目&#xff0c;最近会持续更新&#xff0c;欢迎大家订阅此账号查看&#xff0c;或访问 www.javacn.site 查看。 面经来源于牛客&#xff0c;如下图所示&#xff1a; https://www.nowcoder.com/feed/main/det…

OpenAI的创始人World Coin项目介绍

&#x1f3af; 在一个崇高的目标支持下&#xff0c;不停地工作&#xff0c;即使慢&#xff0c;也一定会获得成功。—— 爱因斯坦 如果你对项目感兴趣请联系v&#xff1a;weixin605405145 一、项目速览 项目背景 Worldcoin由OpenAI的创始人Sam Altman于2019年创立&#xff0c;就…

【C++】的继承

继承的概念及定义 继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象程序设计的层次结构…

010、体系架构之TiFlash

TiFlash TiFlash 功能架构异步复制一致性读取场景选择是选择TiKV还是TiFLash TiFlash 功能 异步复制一致性读取(写虽然是异步&#xff0c;但读可以做到一致性)引擎智能选择计算加速 架构 TiFLASH 也是通过raft 算法进行同步&#xff0c;但它不怎么消耗资源&#xff0c;因为它…

ProGuard 进阶系列(二)配置解析

书接上文&#xff0c;从开源库中把代码下载到本地后&#xff0c;就可以在 IDE 中进行运行了。从 main 方法入手&#xff0c;可以看到 ProGuard 执行的第一步就是去解析参数。本文的内容主要分析源码中我们配置的规则解析的实现。 在上一篇文章末尾&#xff0c;在 IDE 中&#x…

Vue Router4

后端路由 客户端请求不同的URL服务器匹配URL并给一个Controller处理Controller处理完返回渲染好的HTML页面或数据给前端 优点&#xff1a; 不需要单独加载js和css&#xff0c;直角交给浏览器展示&#xff0c;有利于SEO优化 缺点&#xff1a; 页面有后端人员编写或由前端人员…

告别里程焦虑:深蓝S7超级增程打造超长续航

提起新能源汽车&#xff0c;估计许多人第一时间都会想要查看它的续航里程。 虽然如今的新能源汽车在续航里程上较过去已经有了很大改进&#xff0c;但是稀缺的充电桩和漫长的充电时间&#xff0c;仍然无法让需要长途出行的用户摆脱里程焦虑。 那么问题就来了&#xff1a;有没有…

基于协同过滤算法的外贸出口电子电器产品的推荐系统的设计与实现源码+文档

博主介绍&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 项目名称 基于协同过滤算法的外贸出口电子电器产品的推荐系统的设计与实现源码文档 视频演示 https://www.bilibili.com/video/BV1HW4y197Fe/ 系统介绍 摘 要 …