JAVA开发(Eureka基本原理)

news2024/11/26 18:18:27

Eureka基本原理。

 

通过上图我们可以看出,服务提供者在启动的时候需要向注册中心注册自己的信息,而注册中心把向自己注册的服务提供者都保存下来,以便服务消费者获取用来发起请求,而服务消费者需要从注册中心获取服务提供者列表,然后向服务提供者发起调用。 

基本流程:

  • 客户端发起服务注册
  • 服务端保存注册信息到注册表
  • 客户端定时发生心跳检测
  • 服务端服务剔除及自我保护
  • 客户端发起服务下线
  • 客户端或者服务端注册信息到本地内存
  • 客户端整合服务发现

 开源代码很简单,从git上下载就行,目录大概是这样。

pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>cn.mhyr</groupId>
    <artifactId>mhyr-eureka</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>mhyr-eureka</name>
    <description>注册中心</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2021.0.1</spring-cloud.version>
        <apollo.version>1.9.0</apollo.version>
    </properties>

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

        <!-- 集成apollo -->
        <dependency>
            <groupId>com.ctrip.framework.apollo</groupId>
            <artifactId>apollo-client</artifactId>
            <version>${apollo.version}</version>
        </dependency>

        <dependency>
            <groupId>com.ctrip.framework.apollo</groupId>
            <artifactId>apollo-core</artifactId>
            <version>${apollo.version}</version>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <finalName>mhyr-eureka</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

 yml文件配置:

#服务端口
server:
  port: 8961
#服务ID
app:
  id: mhyr-member-plat
#服务名称
spring:
  application:
    name: mhyr-eureka
#--------------------------单机模式--------------------------#
#eureka:
#  instance:
#    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
#    prefer-ip-address: true
#    ip-address: localhost
#    #服务续约(renew)的间隔,默认为30秒
#    lease-renewal-interval-in-seconds: 30
#    #服务失效时间
#    lease-expiration-duration-in-seconds: 90
#  server:
#    # 设置eureka是否启动自我保护   true指开启eureka的自我保护   false指关闭eureka的自我保护
#    # 如果关闭eureka的自我保护,则不可用的服务会被及时剔除掉
#    enable-self-preservation: false
#    # 剔除服务的时间间隔毫秒数(单位:毫秒)  扫描失效服务的时间间隔(默认是60*1000 即60秒)
#    eviction-interval-timer-in-ms: 5000
#
#  client:
#    register-with-eureka: false # 表示是否向Eureka注册中心注册自己
#    fetch-registry: false # 如果为false 则表示自己为注册中心
#    service-url:
#      defaultZone: http://localhost:8762/eureka/

#--------------------------集群模式--------------------------#
eureka:
  instance:
    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
    prefer-ip-address: true
    ip-address: 127.0.0.1
    #服务续约(renew)的间隔,默认为30秒
    lease-renewal-interval-in-seconds: 30
    #服务失效时间
    lease-expiration-duration-in-seconds: 60
  server:
    # 设置eureka是否启动自我保护   true指开启eureka的自我保护   false指关闭eureka的自我保护
    # 如果关闭eureka的自我保护,则不可用的服务会被及时剔除掉
    enable-self-preservation: false
    # 剔除服务的时间间隔毫秒数(单位:毫秒)  扫描失效服务的时间间隔(默认是60*1000 即60秒)
    eviction-interval-timer-in-ms: 5000

  client:
    register-with-eureka: true # 表示是否向Eureka注册中心注册自己
    fetch-registry: true # false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      defaultZone: ${app.eureka.defaultZone} #注册的注册中心集群配置

#集成apollo配置
apollo:
  bootstrap:
    enabled: false
    namespaces: application
    eagerLoad:
      enabled:
  meta: http://mhyr-config:8080 #apollo访问地址

注册中心维护页面

 几种注册中心比较:

 

服务注册

服务注册的原理主要涉及到eureka server的存储结构,采用一个三层缓存的结构。具体内部的实现逻辑参考二中的图。

层级名称实现方式更新方式数据变更
第一层readOnlyCacheMap(只读)ConcurrentHashMap定时更新(默认30s)定时拉取readWriteCacheMap
第二层readWriteCacheMap(读写)guava实时更新guava的load机制
第三层register(注册表)双层ConcurrentHashMap实时更新客户端的注册、续约、下线

服务续约

当服务提供者完成服务信息注册后,会维持一个心跳,定时向eureka server 发送rest请求,告诉其还活着。默认心跳间隔30s。

服务获取

eureka client会定期(默认30s)向eureka server获取获取注册的服务信息,这个获取分为全量获取增量获取。默认配置下,当客户端首次启动后,会向服务端发起一次全量获取并缓存本地信息,之后每隔30s发起一次增量获取,更新本地缓存

服务调用

通常服务间调用使用组件feign,发起rest请求;其内集成了ribbon,ribbon默认使用了轮训的负载策略,会将eureka client拉取的注册信息拉取到自己这,实现负载。

关于feign和ribbon会在后续学习中具体讲解。

服务下线

表示要从注册中心删除该服务的注册信息,使该服务不能被调用。

服务下线的方式:

方式实现效果
直接停服务直接kill服务90s内注册中心检测到服务无续约,才删除,无法立即下线
通过注册中心接口强制下线向eureka 注册中心发送delete默认30s的心跳机制,如果在这段时间没有停掉服务,那么会让该服务再次上线
客户端主动下线@GetMapping("/offline")
public void offline(){
DiscoveryManager.getInstance().shutdownComponent();
}
优雅的下线服务

失效剔除

在eureka server中有一个定时任务Evict,该任务默认每60s执行一次,其作用域在readWriteCacheMap和register上。

当有服务提供者在默认90s时间内,没有进行服务续约,当Evict执行时,会对这样失效的注册信息进行剔除。通常是宕机的服务或者强制kill的服务。

eureka 的自我保护机制

当服务提供者向注册中心注册完自己的信息之后,服务提供者会定期的续约(服务提供者和注册中⼼通信),假如服务提供者和注册中⼼之间的⽹络有点问题,不代表服务提供者不可⽤,不代表服务消费者⽆法访问服务提供者。如果在15分钟内超过85%的客户端节点都没有正常的⼼跳,那么Eureka就认为客户端与注册中⼼出现了⽹络故障,Eureka Server⾃动进⼊⾃我保护机制。

当处于⾃我保护模式时eureka server不会剔除任何服务实例(可能是服务提供者和EurekaServer之间⽹络问题),保证了⼤多数服务依然可⽤;Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可⽤,当⽹络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。

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

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

相关文章

网络层:IP协议

目录 基本概念 IP报头 IP报文分片 为什么要分片&#xff1f; 如何分片&#xff1f; 分片的报文如何组装&#xff1f; 分片策略如何&#xff1f; 网段划分 IP地址被分成了五类IP&#xff1a; CIDR 特殊的IP地址&#xff1a; 私有IP和公网IP 路由 如何转发数据包&a…

「ABAP」一文带你入门OPEN SQL中的SELECT查询(附超详细案例解析)

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

阿里云服务器价格,阿里云轻量应用服务器最新价格表

阿里云服务器从地域上来区分可分为ECS云服务器和轻量应用服务器&#xff0c;从活动内容来区分又可分为秒杀云服务器和新用户特惠云服务器&#xff0c;下面是截止目前&#xff0c;阿里云服务器最新的秒杀及新用户特惠购买价格&#xff0c;以表格形式形式展示出来以供参考。 阿里…

​ICLR 2023 | 图数据分布外检测:从能量模型出发

©PaperWeekly 原创 作者 | 吴齐天单位 | 上海交通大学博士生研究方向 | 机器学习与图深度学习继续探索 Graph OOD 的相关问题&#xff0c;与以往工作不同的是&#xff0c;这篇工作避开了复杂的数学推导和琐碎的数据生成过程&#xff0c;直接从简单有效的判别模型入手研究…

【Spring】掌握 Spring Validation 数据校验

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Spring Validation 数据校验一、什么是 Spring…

RAN-in-the-Cloud:为 5G RAN 提供云经济性

RAN-in-the-Cloud&#xff1a;为 5G RAN 提供云经济性 5G 部署在全球范围内一直在加速。 许多电信运营商已经推出了5G服务并正在快速扩张。 除了电信运营商之外&#xff0c;企业也对使用 5G 建立私有网络产生了浓厚的兴趣&#xff0c;这些私有网络利用了更高的带宽、更低的延迟…

【编程基础之Python】8、Python复合数据类型

【编程基础之Python】8、Python复合数据类型Python复合数据类型列表&#xff08;List&#xff09;创建列表访问元素内置方法列表操作元组&#xff08;Tuple&#xff09;创建元组访问元素集合&#xff08;Set&#xff09;创建集合基本操作其他操作字典&#xff08;Dictionary&am…

4.ffmpeg命令转码规则、过滤器介绍、手动流map选项

在上章我们学习了ffmpeg命令行帮助以及选项查找 本章我们来深入学习ffmpeg命令转码规则、过滤器介绍、手动流map选项 参考链接: 1.ffmpeg命令行转码流程 ffmpeg命令行转码流程如下图所示: 对应中文则是: 步骤如下所示: ffmpeg调用libavformat库(包含解复用器)来读取输入文件…

Linux -- 查看进程 PS 命令 详解

我们上篇介绍了&#xff0c; Linux 中的进程等概念&#xff0c;那么&#xff0c;在Linux 中如何查看进程呢 &#xff1f;&#xff1f;我们常用到的有两个命令&#xff0c; PS 和 top 两个命令&#xff0c;今天先来介绍下 PS 命令~&#xff01;PS 命令 &#xff1a;作用 &#x…

C语言拔高知识——指针的进阶(万字大文超详细)

在之前的文章中&#xff0c;我已经讲解过了初阶指针的内容&#xff0c;今天就来讲一讲指针的进阶&#xff01; 上篇指针地址&#xff1a;保姆式指针讲解&#xff0c;超详细&#xff0c;适合初学者_指针详解_陈大大陈的博客-CSDN博客 目录 1. 字符指针 2. 指针数组 3. 数组指…

3年测试经验的人来面试,简历都没写明白,一开口就要给20K的offer?

​我最近阅读了大约15份简历&#xff0c;他们都在申请我的团队的测试工程师职位。但是没有一份表达清楚了他是如何进行测试的。 下面我摘录了一些 信息&#xff1a; 几乎所有的应聘者都罗列了成串儿的他们熟悉的“技术”&#xff08;包括但不限于….Net&#xff0c; Unix&#…

c++基础/类和对象

c基础 2.1名字空间 namespace 防止命名冲突 说明&#xff1a;名字空间可以在全局作用域或其他作用域&#xff08;另一个名字空间&#xff09;内部定义&#xff0c;但不能在函数或类的内部定义。 使用&#xff1a; #include<iostream> using namespace std; //std中包…

【C/C++ 数据结构】-八大排序之 冒泡排序快速排序

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【C/C数据结构与算法】 分享&#xff1a;那我便像你一样&#xff0c;永远躲在水面之下&#xff0c;面具之后&#xff01; ——《画江湖之不良人》 主要内容&#xff1a;八大排序选…

前端构建工具大盘点:gulp、webpack、vite、rollup、esbuild、snowpack、babel、parcel、swc、tsc

文章目录背景分类转译器打包器对比gulp VS webpackBundle vs Bundleless&#xff08;代表就是webpack VS vite&#xff09;其他比较个人理解总结官网背景 做前端也有好多年了&#xff0c;从最早的 jQuery 时代到现在的三大框架&#xff0c;这过程中用到了很多构建工具&#xf…

婴幼儿常见八大疾病及护理方法

在1岁之前&#xff0c;婴儿的体质还没有完全发育&#xff0c;很容易生病&#xff0c;大多数婴儿在1岁之后都会更好。今天&#xff0c;新的稀有婴儿育儿专家组织了一些婴儿最容易患的疾病和护理方法。1、新生儿黄疸宝宝出生后&#xff0c;你可能会注意到他的皮肤发黄。别担心&am…

Netty学习(三):Netty线程模型和代码示例

〇、前言网络编程的基本线程模型&#xff0c;详见&#xff1a;Netty学习&#xff08;二&#xff09;&#xff1a;线程模型一、工作原理简图Netty主要基于主从 Reactors 多线程模型&#xff08;如下图&#xff09; 做了一定的改进&#xff0c;其中主从Reactor 多线程模型有多个R…

11_MySQL数据处理(增删改)

1. 插入数据1.1 实际问题解决方式&#xff1a;使用 INSERT 语句向表中插入数据。1.2 方式1&#xff1a;使用VALUES使用这种语法一次只能向表中插入一条数据。情况1&#xff1a;为表的所有字段按默认顺序插入数据INSERT INTO 表名 VALUES (value1,value2,....);值列表中需要为表…

Windows安装Liberica JAVA8

在浏览器打开下载&#xff1a;Liberica JAVA。 点击链接"下载MSI"相对应的Microsoft Windows版本。 下载后完成后&#xff0c;验证的文件&#xff0c;通过比较其大小对你的驱动器和下载的页。 一个更加先进的方法来验证检验和在PowerShell&#xff1a; (Get-FileHas…

软件测试之测试环境--XAMPP

1. 测试环境 Linux下的环境搭建 LNMP: LinuxNginxMysqlphp项目 Windows下的环境搭建 WAMP: WindowsapacheMysqlphp项目 2. Xampp安装及使用 XAMPP包括Apache、MySQL、PHP、PERL&#xff0c;直接解压缩&#xff0c;没有复杂的安装过程&#xff0c;强烈推荐初学者使用。 到目前…

【C/C++基础知识点】输出n位斐波那契数列

目录 前言什么是斐波那契数列兔子的故事小知识点收尾前言 在软件行业已经有快十年,技术虽然一般般,但是足够应付额解决编程入门的相关问题! 都说十年磨一剑,积累到一定经验,是时候发挥自己的价值,给予入门的同行些许的帮助! 为什么要写收费专栏,其实原因很简单,时间就…