返回顶部
首页 > 资讯 > 前端开发 > node.js >SpringColud Eureka服务注册与发现的示例分析
  • 200
分享到

SpringColud Eureka服务注册与发现的示例分析

2024-04-02 19:04:59 200人浏览 薄情痞子
摘要

本篇文章为大家展示了springColud Eureka服务注册与发现的示例分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、Eureka简介本文中所有代码都会

本篇文章为大家展示了springColud Eureka服务注册与发现的示例分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

SpringColud Eureka服务注册与发现的示例分析

一、Eureka简介

本文中所有代码都会上传到git上,请放心浏览项目git地址:https://GitHub.com/839022478/Spring-Cloud

在传统应用中,组件之间的调用,通过有规范的约束的接口来实现,从而实现不同模块间良好的协作。但是被拆分成微服务后,每个微服务实例的网络地址都可能动态变化,数量也会变化,使得原来硬编码的地址失去了作用。需要一个中心化的组件来进行服务的登记和管理,为了解决上面的问题,于是出现了服务治理,就是管理所有的服务信息和状态,也就是我们所说的注册中心

1.1 注册中心

  • 比如我们去做火车或者汽车,需要去买票乘车,只看我们有没有票(有没有服务),有就去买票(获取注册列表),然后乘车(调用),不用关心到底有多少车在运行

流程图:

SpringColud Eureka服务注册与发现的示例分析

使用注册中心,我们不需要关心有多少提供方,只管去调用就可以了,那么注册中心有哪些呢?

注册中心:Eureka,Nacos,Consul,Zookeeper

本文中讲解的是比较火热的Spring  Cloud微服务下的Eureka,Eureka是Netflix开发的服务发现框架,是一个RESTful风格的服务,是一个用于服务发现和注册的基础组件,是搭建Spring  Cloud微服务的前提之一,它屏蔽了Server和client的交互细节,使得开发者将精力放到业务上。

服务注册与发现主要包括两个部分:服务端(EurekaServer)和客户端(EurekaClient)

服务端(Eureka Server):  一个公共服务,为Client提供服务注册和发现的功能,维护注册到自身的Client的相关信息,同时提供接口给Client获取注册表中其他服务的信息,使得动态变化的Client能够进行服务间的相互调用。

客户端(Eureka Client):  Client将自己的服务信息通过一定的方式登记到Server上,并在正常范围内维护自己信息一致性,方便其他服务发现自己,同时可以通过Server获取到自己依赖的其他服务信息,完成服务调用,还内置了负载均衡器,用来进行基本的负载均衡

Eureka GIt官网:Https://github.com/Netflix/Eureka

1.2 服务注册与发现

服务注册与发现关系图:

SpringColud Eureka服务注册与发现的示例分析

1.3 client功能和server功能

1.3.1 client功能

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 注册:每个微服务启动时,将自己的网络地址等信息注册到注册中心,注册中心会存储(内存中)这些信息。

  3. 获取服务注册表:服务消费者从注册中心,查询服务提供者的网络地址,并使用该地址调用服务提供者,为了避免每次都查注册表信息,所以client会定时去server拉取注册表信息到缓存到client本地。

  4. 心跳:各个微服务与注册中心通过某种机制(心跳)通信,若注册中心长时间和服务间没有通信,就会注销该实例。

  5. 调用:实际的服务调用,通过注册表,解析服务名和具体地址的对应关系,找到具体服务的地址,进行实际调用。

1.3.2 server注册中心功能

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 服务注册表:记录各个微服务信息,例如服务名称,ip,端口等。注册表提供 查询api(查询可用的微服务实例)和管理API(用于服务的注册和注销)。

  3. 服务注册与发现:注册:将微服务信息注册到注册中心。发现:查询可用微服务列表及其网络地址。

  4. 服务检查:定时检测已注册的服务,如发现某实例长时间无法访问,就从注册表中移除。

二、Eureka单节点搭建

2.1 pom.xml

在有的教程中,会引入 spring-boot-starter-WEB,这个依赖其实不用,因为  spring-cloud-starter-netflix-eureka-server的依赖已经包含了它,在pom依赖进去,就可以了

<dependency>   <groupId>org.springframework.cloud</groupId>   <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>

2.2 application.yml

server:   port: 8500 eureka:   client:     #是否将自己注册到Eureka Server,默认为true,由于当前就是server,故而设置成false,表明该服务不会向eureka注册自己的信息     reGISter-with-eureka: false     #是否从eureka server获取注册信息,由于单节点,不需要同步其他节点数据,用false     fetch-registry: false     #设置服务注册中心的URL,用于client和server端交流     service-url:       defaultZone: http://localhost:8080/eureka/

2.3 服务端启动类

启动类上添加此注解标识该服务为配置中心@EnableEurekaServer

import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;  @EnableEurekaServer @SpringBootApplication public class EurekaServerApplication {      public static void main(String[] args) {         SpringApplication.run(EurekaServerApplication.class, args);     } }

2.4 启动

我们启动 EurekaDemoApplication,然后在浏览器中输入地址 http://localhost:8500/,就可以启动我们的 Eureka  了,我们来看下效果,出现了这个画面,就说明我们已经成功启动~,只是此时我们的服务中是还没有客户端进行注册

SpringColud Eureka服务注册与发现的示例分析

三、服务注册

注意:在客户端pom里面我们需要加上 spring-boot-starter-web,否则服务是无法正常启动的

3.1 pom.xml

<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-client</artifactId>  </dependency>

3.2 application.yml

#注册中心 eureka:   client:     #设置服务注册中心的URL     service-url:       defaultZone: http://localhost:8500/eureka/   #服务名   instance:     appname: mxn

3.3 客户端启动类

在客户端启动类中我们需要加上 @EnableDiscoveryClient

import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;  @EnableDiscoveryClient @SpringBootApplication public class EurekaClientApplication {      public static void main(String[] args) {         SpringApplication.run(EurekaClientApplication.class, args);     } }

3.4 查看效果

工程启动后,刷新 http://localhost:8500/页面,我们可以发现服务注册成功了

SpringColud Eureka服务注册与发现的示例分析

并且我们可以在idea日志打印中看到

DiscoveryClient_MXN/DESKTOP-5BQ3UK8-registration status:204

说明就是注册成功了 Eureka Server与Eureka Client之间的联系主要通过心跳的方式实现。心跳(Heartbeat)即Eureka  Client定时向Eureka Server汇报本服务实例当前的状态,维护本服务实例在注册表中租约的有效性。

Eureka Client将定时从Eureka Server中拉取注册表中的信息,并将这些信息缓存到本地,用于服务发现

四、Eureka 端点

官网地址:https://github.com/Netflix/eureka/wiki/Eureka-REST-operations

Eureka服务器还提供了一个端点 (eureka/apps/{applicaitonName})可以查看所注册的服务详细信息  。applicaitonName就是微服务的名称,比如这里我们访问 http://localhost:8500/eureka/apps/mxn

SpringColud Eureka服务注册与发现的示例分析

五、Eureka 原理

5.1 本质

存储了每个客户端的注册信息。EurekaClient从EurekaServer同步获取服务注册列表。通过一定的规则选择一个服务进行调用

5.2 Eureka架构

SpringColud Eureka服务注册与发现的示例分析
  • 服务提供者: 是一个eureka client,向Eureka Server注册和更新自己的信息,同时能从Eureka  Server注册表中获取到其他服务的信息。

  • 服务注册中心: 提供服务注册和发现的功能。每个Eureka Cient向Eureka Server注册自己的信息,也可以通过Eureka  Server获取到其他服务的信息达到发现和调用其他服务的目的。

  • 服务消费者: 是一个eureka client,通过Eureka  Server获取注册到其上其他服务的信息,从而根据信息找到所需的服务发起远程调用。

  • 同步复制: Eureka Server之间注册表信息的同步复制,使Eureka Server集群中不同注册表中服务实例信息保持一致。

  • 远程调用: 服务客户端之间的远程调用。

  • 注册: Client端向Server端注册自身的元数据以供服务发现。

  • 续约:  通过发送心跳到Server以维持和更新注册表中服务实例元数据的有效性。当在一定时长内,Server没有收到Client的心跳信息,将默认服务下线,会把服务实例的信息从注册表中删除。

  • 下线: Client在关闭时主动向Server注销服务实例元数据,这时Client的服务实例数据将从Server的注册表中删除。

  • 获取注册表: Client向Server请求注册表信息,用于服务发现,从而发起服务间远程调用。

5.3 Eureka自我保护

有时候我们会看到这样的提示信息:

EMERGENCY!EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

这是因为默认情况下,Eureka  Server在一定时间内,没有接收到某个微服务心跳,会将某个微服务注销(90S)。但是当网络故障时,微服务与Server之间无法正常通信,上述行为就非常危险,因为微服务正常,不应该注销,它的指导思想就是  宁可保留健康的和不健康的,也不盲目注销任何健康的服务我们也可以通过命令去关闭自我保护的功能:

eureka:   server:      enable-self-preservation: false

那么自我保护是如何触发的呢?

自我保护机制的触发条件是: 当每分钟心跳次数( renewsLastMin) 小于 numberOfRenewsPerMinThreshold时, 并且开启自动保护模式开关( eureka.server.enable-self-preservation=true) 时 触发自我保护机制,不再自动过期租约 上面我们所有的小于 numberOfRenewsPerMinThreshold,到底是怎么计算的呢, 我们在eureka源码中可以得知: numberOfRenewsPerMinThreshold = expectedNumberOfRenewsPerMin * 续租百分比(默认为0.85) expectedNumberOfRenewsPerMin  = 当前注册的应用实例数 x 2 当前注册的应用实例数 x 2 是因为,在默认情况下,注册的应用实例每半分钟续租一次,那么一分钟心跳两次,因此 x 2

例如:我们有10个服务,期望每分钟续约数:10 * 2=20,期望阈值:20*0.85=17,当少于17时,就会触发自我保护机制

SpringColud Eureka服务注册与发现的示例分析

5.4 健康检查

由于server和client通过心跳保持 服务状态,而只有状态为UP的服务才能被访问。看eureka界面中的status。

SpringColud Eureka服务注册与发现的示例分析

比如心跳一直正常,服务一直UP,但是此服务DB(数据库)连不上了,无法正常提供服务。

此时,我们需要将  微服务的健康状态也同步到server。只需要启动eureka的健康检查就行。这样微服务就会将自己的健康状态同步到eureka。配置如下即可。

在client端配置:将自己的健康状态传播到server。

eureka:   client:     healthcheck:       enabled: true

5.5 Eureka监听事件

import com.netflix.appinfo.InstanceInfo; import org.springframework.cloud.netflix.eureka.server.event.*; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component;  import java.time.LocalDateTime;  @Component public class CustomEvent {      @EventListener     public void listen(EurekaInstanceCanceledEvent event ) {         System.out.println(LocalDateTime.now()+"服务下线事件:"+event.getAppName()+"---"+event.getServerId()); //发钉钉     }      @EventListener     public void listen(EurekaInstanceRegisteredEvent event) {         InstanceInfo instanceInfo = event.getInstanceInfo();         System.out.println(LocalDateTime.now()+"服务上线事件:"+instanceInfo.getAppName()+"---"+instanceInfo.getInstanceId());     }      @EventListener     public void listen(EurekaInstanceRenewedEvent event) {         System.out.println(LocalDateTime.now()+"服务续约/心跳上报事件:"+event.getAppName()+"---"+event.getServerId());      }      @EventListener     public void listen(EurekaRegistryAvailableEvent event) {         System.out.println(LocalDateTime.now()+"注册中心可用事件");     }      @EventListener     public void listen(EurekaServerStartedEvent event) {         System.out.println(LocalDateTime.now()+"注册中心启动事件");      } }

5.6 Renew: 服务续约

Eureka Client 会每隔 30 秒发送一次心跳来续约。通过续约来告知 Eureka Server 该 Eureka Client  运行正常,没有出现问题。默认情况下,如果 Eureka Server 在 90 秒内没有收到 Eureka Client 的续约,Server  端会将实例从其注册表中删除,此时间可配置,一般情况不建议更改。

5.6 服务剔除

如果Eureka  Client在注册后,既没有续约,也没有下线(服务崩溃或者网络异常等原因),那么服务的状态就处于不可知的状态,不能保证能够从该服务实例中获取到回馈,所以需要服务剔除此方法定时清理这些不稳定的服务,该方法会批量将注册表中所有过期租约剔除,剔除是定时任务,默认60秒执行一次。延时60秒,间隔60秒

剔除的限制:1.自我保护期间不清除。2.分批次清除。

六、Eureka缺陷

由于集群间的同步复制是通过HTTP的方式进行,基于网络的不可靠性,集群中的Eureka  Server间的注册表信息难免存在不同步的时间节点,不满足CAP中的C(数据一致性)

七、总结

中间我们讲解了eureka的节点搭建,以及原理,对于现在很火热的微服务,我们对Eureka是非常有必要进行了解的。

上述内容就是SprinGColud Eureka服务注册与发现的示例分析,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网node.js频道。

--结束END--

本文标题: SpringColud Eureka服务注册与发现的示例分析

本文链接: https://lsjlt.com/news/81724.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringColud Eureka服务注册与发现的示例分析
    本篇文章为大家展示了SpringColud Eureka服务注册与发现的示例分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、Eureka简介本文中所有代码都会...
    99+
    2024-04-02
  • Spring Cloud中服务注册与发现Eureka的示例分析
    这篇文章将为大家详细讲解有关Spring Cloud中服务注册与发现Eureka的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、spring cloud简介spring cloud 为开发人员...
    99+
    2023-06-19
  • Eureka服务注册与发现
    ✨ Eureka服务注册与发现 微服务的注册中心注册中心的基本介绍注册中心的主要作用注册中心基本原理常见的注册中心 Eureka基本介绍服务治理服务注册Eureka 两大组件 搭建EurekaEureka端服务...
    99+
    2023-08-25
    eureka java 微服务 服务注册中心
  • SpringCloud实现Eureka服务注册与发现
    目录一、Eureka概述 1、Eureka特点 2、Eureka两大组件 3、Eureka三大角色 二、Eureka Server服务注册中心 1、pom.xml2、applicat...
    99+
    2024-04-02
  • 微服务的服务注册与发现实践示例分析
    本文小编为大家详细介绍“微服务的服务注册与发现实践示例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“微服务的服务注册与发现实践示例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1 服务注册中心前面我们对...
    99+
    2023-06-29
  • SpringCloud服务注册和发现组件Eureka
    目录一、Eureka简介:1.1 什么是eureka1.2 eureka的功能1.3 eureka服务注册与服务发现二、springcloud-eureka-server配置三、sp...
    99+
    2024-04-02
  • SpringCloud Eureka服务注册中心应用入门实例分析
    这篇文章主要介绍“SpringCloud Eureka服务注册中心应用入门实例分析”,在日常操作中,相信很多人在SpringCloud Eureka服务注册中心应用入门实例分析问题上存在疑惑,小编查阅了各式资料,整理出简...
    99+
    2023-07-02
  • SpringCloud Eureka服务治理之服务注册服务发现
    目录什么是EurekaEureka核心概念服务注册和服务发现服务注册服务发现Eureka实战Eureka服务端单节点构建Eureka服务端集群构建Eureka客户端构建什么是Eure...
    99+
    2022-11-13
    SpringCloud Eureka服务治理 SpringCloud Eureka服务注册发现
  • ActivityManagerService广播注册与发送示例解析
    目录引言注册广播接收器发送广播结束引言 最近,帮同事解决了两个问题,一个问题是 app 接收开机广播的速度太慢,另一个问题是app有时无法接收到广播。同事不知道如何解决这个问题,是...
    99+
    2023-03-02
    ActivityManagerService广播注册发送 ActivityManagerService 广播
  • Spring Cloud Eureka服务注册中心入门流程分析
    目录项目搭建客户端注册聚合层处理Eureka架构集群搭建多区域配置自我保护开关心跳机制Eureka实例信息存储项目地址在学习Ribbon使用的时候,我们是直接在配置文件中写死服务地址...
    99+
    2024-04-02
  • Spring Cloud Eureka:注册中心揭秘,服务发现的利器
    Spring Cloud Eureka 是一个服务发现框架,用于在分布式系统中管理和发现服务。它在微服务架构中扮演着至关重要的角色,提供了一种机制,使服务能够互相识别并与之通信。 Eureka 的架构 Eureka 采用客户端-服务器架...
    99+
    2024-03-07
    Spring Cloud Eureka 注册中心 服务发现 微服务
  • 5分钟搭建SpringCloud Eureka服务注册中心的实现
    创建父级项目 只需保留pom.xml文件 这里只需搭建一个微服务 其他操作并无 <?xml version="1.0" encoding="UTF-8"?...
    99+
    2024-04-02
  • 微服务架构之服务注册与发现实践示例详解
    目录1 服务注册中心4种注册中心技术对比2 Spring Cloud 框架下实现2.1 Spring Cloud Eureka2.1.1 创建注册中心2.1.2 创建客户端2.2 S...
    99+
    2024-04-02
  • 怎么用Spring Cloud的Eureka实现服务注册
    今天小编给大家分享一下怎么用Spring Cloud的Eureka实现服务注册的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有...
    99+
    2024-04-02
  • vue中登录注册的示例分析
    这篇文章主要介绍了vue中登录注册的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。步骤一1.安装脚手架:npm install vu...
    99+
    2024-04-02
  • ASP.Net Core MVC中服务注册和管道的示例分析
    这篇文章给大家分享的是有关ASP.Net Core MVC中服务注册和管道的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。DI容器呢, 依赖接口, 所以我们先新建一个接口, 就叫 IW...
    99+
    2023-06-29
  • VB.NET注册表组织结构的示例分析
    这篇文章将为大家详细讲解有关VB.NET注册表组织结构的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。VB.NET注册表的组织结构存取注册表以前, 必须先了解注册表的组织结构, 而了解注册表的组织...
    99+
    2023-06-17
  • 微信小程序+云开发实现欢迎登录注册的示例分析
    这篇文章将为大家详细讲解有关微信小程序+云开发实现欢迎登录注册的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。因为是学生党,而且并没有很大的需要,所以选择了微信小...
    99+
    2024-04-02
  • SpringCloud服务的发现与调用实例分析
    这篇文章主要介绍“SpringCloud服务的发现与调用实例分析”,在日常操作中,相信很多人在SpringCloud服务的发现与调用实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringCloud...
    99+
    2023-07-02
  • Netty分布式NioSocketChannel注册到selector方法的示例分析
    这篇文章给大家分享的是有关Netty分布式NioSocketChannel注册到selector方法的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。我们回到最初的NioMessageUnsafe的read...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作