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

这篇具有很好参考价值的文章主要介绍了【Spring Cloud系列】- Eureka使用详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

一、概述

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

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

二、Eureka简介

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

三、Eureka结构与作用

Eureka结构图

【Spring Cloud系列】- 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关系图

【Spring Cloud系列】- 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
    

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

六、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源码解析…文章来源地址https://www.toymoban.com/news/detail-488659.html

到了这里,关于【Spring Cloud系列】- Eureka使用详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Cloud(Finchley版本)系列教程(一) 服务注册与发现(eureka)

    Spring Cloud(Finchley版本)系列教程(一) 服务注册与发现(eureka) 为了更好的浏览体验,欢迎光顾勤奋的凯尔森同学个人博客http://www.huerpu.cc:7000 如有错误恳请大家批评指正,与大家共同学习、一起成长,万分感谢。 一、构建环境 Spring Cloud 的构建工具可以使用 Maven 或 Gradle ,但 Ma

    2024年02月09日
    浏览(37)
  • 微服务系列-基于Spring Cloud Eureka进行服务的注册与消费

    公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。 使用 RestTemplate 的 Spring Boot 微服务通信示例 使用 WebClient 的 Spring Boot 微服务通信示例 使用 Spring Cloud Open Feign 的 Spring Boot 微服务通信示例 在本教程中,我们将学习如何在Spring boot微服务项

    2024年02月05日
    浏览(83)
  • 特别详细的Spring Cloud 系列教程1:服务注册中心Eureka的启动

    Eureka已经被Spring Cloud继承在其子项目spring-cloud-netflix中,搭建Eureka Server的方式还是非常简单的。只需要通过一个独立的maven工程即可搭建Eureka Server。  我们引入spring cloud的依赖和eureka的依赖。 注意spring cloud和springboot的版本要对应,不然容易出现各种奇怪的错误。 不知道spr

    2024年04月08日
    浏览(52)
  • Spring Cloud - Eureka原理、注册、搭建、应用(全过程详解)

    目录 一、Eureka 注册原理 1.1、为什么要使用 Eureka 1.2、Eureka 的工作流程及原理 1.3、eureka 的作用 二、具体实现 2.1、搭建注册中心 2.2、服务注册和部署 2.2.1、user-service 服务注册 2.2.2、服务部署 2.2.3、order-service 服务注册 2.2.4、验证服务 2.3、服务发现 2.3.1、在order-service完成服务

    2024年02月11日
    浏览(28)
  • 【Spring Cloud系列】Spring Cloud-网关Zuul详解与实战

    Spring Cloud Zuul 是 Spring Cloud Netflix 子项目的核心组件之一,是netflix开源的一个API Gateway服务器,本质上有一个Web Servlet应用,可以作为微服务架构中的 API 网关使用,支持动态路由与过滤功能;网关为微服务提供统一的访问入口;网关的定义类似设计模式中的门面模式,相当于

    2024年02月08日
    浏览(30)
  • 【Spring Cloud系列】Hystrix应用详解

    在一个分布式系统中,每个服务都可能会调用其它的服务器,服务之间是相互调用相互依赖。假如微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务。这就是构成所谓“扇出”。 如果扇出的链路上某个微服务的调用响应的时间过长或者不可用,对微服A的调

    2024年02月16日
    浏览(42)
  • 【Spring Cloud系列】- Ribbon详解与实战

    在前面的文章 Eureka详解与实战、Eureka Client应用、RestTemplate详解及其负载均衡几篇文章中,已经介绍了Spring Cloud基本应用,本文将从讲解在进程层面的负载均衡,在Spring Cloud中如何使用Ribbon做系统应用层面的负载均衡使用。 Ribbon 是netflix 公司开源的基于客户端的负载均衡组件

    2024年02月15日
    浏览(34)
  • 【Spring Cloud系列】Feign详解与实战

    在前一章介绍了Ribbon的用法,在使用Ribbon是通过RestTemplate调用其他服务的API时,所有参数必须在请求的URL中进行拼接。如果参数过多,拼接请求字符串会导致效率下降。Spring Cloud提供另外一种调用API的解决方案,既使用 Spring Cloud Feign 。 Feign是一种负载均衡的HTTP客户端,它封

    2024年02月07日
    浏览(29)
  • 实战系列(一)| Dubbo和Spring Cloud的区别,包含代码详解

    Dubbo 和 Spring Cloud 都是微服务架构中的重要框架,但它们的定位和关注点不同。Dubbo 是阿里巴巴开源的一个高性能、轻量级的 RPC 框架,主要用于构建微服务之间的服务治理。而 Spring Cloud 是基于 Spring Boot 的一个微服务架构开发工具,它提供了一系列的开发工具和服务,帮助开

    2024年02月10日
    浏览(30)
  • Spring Cloud Eureka面试题

    序号 内容 链接地址 1 Java面试题 https://blog.csdn.net/golove666/article/details/137360180 2 JVM面试题 https://blog.csdn.net/golove666/article/details/137245795 3 Servlet面试题 https://blog.csdn.net/golove666/article/details/137395779 4 Maven面试题 https://blog.csdn.net/golove666/article/details/137365977 5 Git面试题 https://blog.csdn.n

    2024年04月27日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包