SpringCloud-Eureka服务注册中心测试实践

5. Eureka服务注册中心

5.1 什么是Eureka

  • Netflix在涉及Eureka时,遵循的就是API原则.
  • Eureka是Netflix的有个子模块,也是核心模块之一。Eureka是基于REST的服务用于定位服务,以实现云端中间件层服务发现和故障转移,服务注册与发现对于微服务来说是非常重要的,有了服务注册与发现,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了,功能类似于Dubbo的注册中心,比如Zookeeper.

5.2 原理理解

  • Eureka基本的架构

Springcloud 封装了Netflix公司开发的Eureka模块来实现服务注册与发现 (对比Zookeeper).

Eureka采用了C-S的架构设计,EurekaServer作为服务注册功能的服务器,他是服务注册中心.

而系统中的其他微服务,使用Eureka的客户端连接到EurekaServer并维持心跳连接。这样系统的维护人员就可以通过EurekaServer来监控系统中各个微服务是否正常运行Springcloud 的一些其他模块 (比如Zuul) 就可以通过EurekaServer来发现系统中的其他微服务,并执行相关的逻辑.

在这里插入图片描述

和Dubbo架构对比.

在这里插入图片描述

  • Eureka 包含两个组件:Eureka Server 和 Eureka Client.

  • Eureka Server 提供服务注册,各个节点启动后,回在EurekaServer中进行注册,这样Eureka Server中的服务注册表中将会储存所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到.

  • Eureka Client 是一个Java客户端,用于简化EurekaServer的交互,客户端同时也具备一个内置的,使用轮询负载算法的负载均衡器。在应用启动后,将会向EurekaServer发送心跳 (默认周期为30秒) 。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除掉 (默认周期为90s).

  • 三大角色

  • Eureka Server:提供服务的注册与发现

  • Service Provider:服务生产方,将自身服务注册到Eureka中,从而使服务消费方能够找到

  • Service Consumer:服务消费方,从Eureka中获取注册服务列表,从而找到消费服务

5.3 构建步骤

配置功能的基本方式

在这里插入图片描述

1. eureka-server

1.springcloud-eureka-7001 模块建立

2.pom.xml 配置

知道上网找依赖的仓库

在这里插入图片描述

在这里插入图片描述

<!--导包~-->
<dependencies><!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server --><!--导入Eureka Server依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka-server</artifactId><version>1.4.6.RELEASE</version></dependency><!--热部署工具--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency>
</dependencies>

3.application.yml

在这里插入图片描述

server:port: 7001# Eureka配置
eureka:instance:# Eureka服务端的实例名字hostname: 127.0.0.1client:# 表示是否向 Eureka 注册中心注册自己(这个模块本身是服务器,所以不需要)register-with-eureka: false# fetch-registry如果为false,则表示自己为注册中心,客户端的化为 turefetch-registry: false# Eureka监控页面~service-url:defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

源码中Eureka的默认端口以及访问路径:

在这里插入图片描述

4.主启动类

在这里插入图片描述

5.测试效果

注意访问地址

在这里插入图片描述

2. eureka-client

使用之前创建的服务提供者的8001端口的模块 springlouc-provider-dept-8001

①导入Eureka依赖

在这里插入图片描述

<!--Eureka依赖-->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId><version>1.4.6.RELEASE</version>
</dependency>

②application中新增Eureka配置

在这里插入图片描述

# Eureka配置:配置服务注册中心地址
eureka:client:service-url:defaultZone: http://localhost:7001/eureka/

③为启动类添加@EnableEurekaCliet注解

在这里插入图片描述

@SpringBootApplication
// @EnableEurekaClient 开启Eureka客户端注解,在服务启动后自动向注册中心注册服务
@EnableEurekaClient
public class DeptProvider_8001 {public static void main(String[] args) {SpringApplication.run(DeptProvider_8001.class,args);}
}

注意:先开启7001服务注册中心Eureka,再开启8001的服务提供者

④测试效果:服务成功注册

⑤修改eureka上的默认描述信息

在这里插入图片描述

成功修改:

在这里插入图片描述

⑥停掉8001的服务提供者的服务,查看服务注册中心Eureka的变化,

自我保护机制的触发

在这里插入图片描述

⑦配置服务加载的监控信息info

在这里插入图片描述
在这里插入图片描述

<1>导入依赖

在这里插入图片描述

<!--actuator完善监控信息-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<2>application.yml中添加配置

在这里插入图片描述

# info配置
info:
# 项目的名称
app.name: kdz-springcloud
# 公司的名称
company.name: LBJ烹饪公司 

测试结果:

在这里插入图片描述

3. EureKa自我保护机制:好死不如赖活着

一句话总结就是:某时刻某一个微服务不可用,eureka不会立即清理,依旧会对该微服务的信息进行保存!

  • 默认情况下,当eureka server在一定时间内没有收到实例的心跳,便会把该实例从注册表中删除(默认是90秒),但是,如果短时间内丢失大量的实例心跳,便会触发eureka server的自我保护机制,比如在开发测试时,需要频繁地重启微服务实例,但是我们很少会把eureka server一起重启(因为在开发过程中不会修改eureka注册中心),当一分钟内收到的心跳数大量减少时,会触发该保护机制。可以在eureka管理界面看到Renews threshold和Renews(last min),当后者(最后一分钟收到的心跳数)小于前者(心跳阈值)的时候,触发保护机制,会出现红色的警告:EMERGENCY!EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT.RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEGING EXPIRED JUST TO BE SAFE.从警告中可以看到,eureka认为虽然收不到实例的心跳,但它认为实例还是健康的,eureka会保护这些实例,不会把它们从注册表中删掉

  • 该保护机制的目的是避免网络连接故障,在发生网络故障时,微服务和注册中心之间无法正常通信,但服务本身是健康的,不应该注销该服务,如果eureka因网络故障而把微服务误删了,那即使网络恢复了,该微服务也不会重新注册到eureka server了,因为只有在微服务启动的时候才会发起注册请求,后面只会发送心跳和服务列表请求,这样的话,该实例虽然是运行着,但永远不会被其它服务所感知。所以,**eureka server在短时间内丢失过多的客户端心跳时,会进入自我保护模式,**该模式下,eureka会保护注册表中的信息,不在注销任何微服务,当网络故障恢复后,eureka会自动退出保护模式。自我保护模式可以让集群更加健壮

  • 但是我们在开发测试阶段,需要频繁地重启发布,如果触发了保护机制,则旧的服务实例没有被删除,这时请求有可能跑到旧的实例中,而该实例已经关闭了,这就导致请求错误,影响开发测试。所以,在开发测试阶段,我们可以把自我保护模式关闭,只需在eureka server配置文件中加上如下配置即可:eureka.server.enable-self-preservation=false【不推荐关闭自我保护机制】

4. 注册进来的微服务,获取一些消息(团队开发会用到)

①从源码中找到discovery的接口,同时也要查看的它的实现方法

在这里插入图片描述

②DeptController增加方法

在这里插入图片描述

/*** DiscoveryClient 可以用来获取一些配置的信息,得到具体的微服务!*/
@Autowired
private DiscoveryClient client;/*** 获取一些注册进来的微服务的信息~,** @return*/
@GetMapping("/dept/discovery")
public Object discovery() {// 获取微服务列表的清单List<String> services = client.getServices();System.out.println("discovery=>services:" + services);// 得到一个具体的微服务信息,通过具体的微服务id,applicaioinName;List<ServiceInstance> instances = client.getInstances("SPRINGCLOUD-PROVIDER-DEPT");for (ServiceInstance instance : instances) {System.out.println(instance.getHost() + "\t" + // 主机名称instance.getPort() + "\t" + // 端口号instance.getUri() + "\t" + // uriinstance.getServiceId() // 服务id);}return this.client;
}

在这里插入图片描述

getInstances()方法里面的参数是服务的id名

③源码getInstances()方法中可以配置的属性

在这里插入图片描述

只有get方法,没有set方法

④配置监控信息

在这里插入图片描述

⑤启动类上新增注解@EnableDiscoveryClient

在这里插入图片描述

⑥启动单一模块服务即可,不要全部重新启动,千万不要老是服务注册中心Euraka反复启动

在这里插入图片描述

⑦测试效果:

一开始服务没有被服务中心监控到,虽然重启了,但是也是需要时间的,所以获得的消息是空白的

在这里插入图片描述

成功获得监控信息

在这里插入图片描述

5.4 Eureka:集群环境配置

在这里插入图片描述

1.初始化工作

新建springcloud-eureka-7002、springcloud-eureka-7003 模块

①3个模块的pom文件都添加依赖

在这里插入图片描述

<!--导包~-->
<dependencies><!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server --><!--导入Eureka Server依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka-server</artifactId><version>1.4.6.RELEASE</version></dependency><!--热部署工具--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency>
</dependencies>

②3个模块的application.yml配置一样(除了端口号)

在这里插入图片描述

server:port: 7003# Eureka配置
eureka:instance:hostname: localhost # Eureka服务端的实例名字client:register-with-eureka: false # 表示是否向 Eureka 注册中心注册自己(这个模块本身是服务器,所以不需要)fetch-registry: false # fetch-registry如果为false,则表示自己为注册中心service-url: # 监控页面~# 重写Eureka的默认端口以及访问路径 --->http://localhost:7001/eureka/defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

③启动类都是一样的(除了名字)

在这里插入图片描述

@SpringBootApplication
// @EnableEurekaServer 服务端的启动类,可以接受别人注册进来~
public class EurekaServer_7003 {public static void main(String[] args) {SpringApplication.run(EurekaServer_7003.class,args);}
}
2.集群互相关联

①配置IP和域名的映射,为了让一台电脑看起来像3台电脑

在这里插入图片描述

注意路径

在这里插入图片描述

② 修改application.yml的配置,如图为springcloud-eureka-7002配置,springcloud-eureka-7001/springcloud-eureka-7003同样分别修改为其对应的名称即可3个服务注册中心集群都关联一下,修改application.yml中的defaultZone属性,例如:http://eureka7001.com:7001/eureka/ 的形式,3个都互相关联一下

在这里插入图片描述

server:port: 7001#Eureka配置
eureka:instance:hostname: eureka7001.com #Eureka服务端的实例名字client:register-with-eureka: false #表示是否向 Eureka 注册中心注册自己(这个模块本身是服务器,所以不需要)fetch-registry: false #fetch-registry如果为false,则表示自己为注册中心service-url: #监控页面~#重写Eureka的默认端口以及访问路径 --->http://localhost:7001/eureka/# 单机: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/# 集群(关联):7001关联7002、7003defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

③设置8001服务提供者的服务都分别注册提供到这3个服务注册中心里面,分别输入3个服务注册中心的访问的url链接就可以了,注意格式

在这里插入图片描述

# Eureka配置:配置服务注册中心地址
eureka:client:service-url:# 注册中心地址7001-7003defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/instance:instance-id: springcloud-provider-dept-8001 #修改Eureka上的默认描述信息

修改Eureka配置:配置服务注册中心地址

④分别开启7001、7002、7003端口的集群

在这里插入图片描述

分别访问对应的IP和域名的映射

注册服务

在这里插入图片描述

最后,这样一个项目就会被挂载在3个服务注册中心的集群上面了,无论哪一个宕机掉,另外的服务注册中心都可以正常工作

5.5 对比和Zookeeper区别

1. 回顾CAP原则

RDBMS (MySQL\Oracle\sqlServer) ===> ACID

NoSQL (Redis\MongoDB) ===> CAP

2. ACID是什么?

  • A (Atomicity) 原子性
  • C (Consistency) 一致性
  • I (Isolation) 隔离性
  • D (Durability) 持久性

3. CAP是什么?

  • C (Consistency) 强一致性
  • A (Availability) 可用性
  • P (Partition tolerance) 分区容错性

CAP的三进二:CA、AP、CP

4. CAP理论的核心

  • 一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求
  • 根据CAP原理,将NoSQL数据库分成了满足CA原则,满足CP原则和满足AP原则三大类

​ CA:单点集群,满足一致性,可用性的系统,通常可扩展性较差

​ CP:满足一致性,分区容错的系统,通常性能不是特别高

​ AP:满足可用性,分区容错的系统,通常可能对一致性要求低一些

5. 作为分布式服务注册中心,Eureka比Zookeeper好在哪里?

著名的CAP理论指出,一个分布式系统不可能同时满足C (一致性) 、A (可用性) 、P (容错性),由于分区容错性P再分布式系统中是必须要保证的,因此我们只能再A和C之间进行权衡。

  • Zookeeper 保证的是 CP —> 满足一致性,分区容错的系统,通常性能不是特别高
  • Eureka 保证的是 AP —> 满足可用性,分区容错的系统,通常可能对一致性要求低一

Zookeeper保证的是CP

当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接收服务直接down掉不可用。也就是说,服务注册功能对可用性的要求要高于一致性。但zookeeper会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行leader选举。问题在于,选举leader的时间太长,30-120s,且选举期间整个zookeeper集群是不可用的,这就导致在选举期间注册服务瘫痪。在云部署的环境下,因为网络问题使得zookeeper集群失去master节点是较大概率发生的事件,虽然服务最终能够恢复,但是,漫长的选举时间导致注册长期不可用,是不可容忍的。

Eureka保证的是AP

Eureka看明白了这一点,因此在设计时就优先保证可用性Eureka各个节点都是平等的几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册时,如果发现连接失败,则会自动切换至其他节点,只要有一台Eureka还在,就能保住注册服务的可用性,只不过查到的信息可能不是最新的,除此之外,Eureka还有之中自我保护机制,如果在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时会出现以下几种情况:

  • Eureka不在从注册列表中移除因为长时间没收到心跳而应该过期的服务
  • Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其他节点上 (即保证当前节点依然可用)
  • 当网络稳定时,当前实例新的注册信息会被同步到其他节点中

因此,Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像zookeeper那样使整个注册服务瘫痪

SpringCloud-Eureka服务注册中心测试实践 到此完结,笔者归纳、创作不易,大佬们给个3连再起飞吧

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

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

相关文章

Linux:开源世界的王者

在科技世界中&#xff0c;Linux犹如一位低调的王者&#xff0c;统治着开源世界的半壁江山。对于许多技术爱好者、系统管理员和开发者来说&#xff0c;Linux不仅仅是一个操作系统&#xff0c;更是一种信仰、一种哲学。 一、开源的魅力 Linux的最大魅力在于其开源性质。与封闭的…

curl 命令-接口测试

curl 命令-接口测试 JUST DO IT 温暖春日 在linux/Unix 为代表的os上, 对后端进行测试, 模拟连接请求都会书写脚本 场景: 在Linux 上接口测试工具有ab, restClient, postman等, 最常用的方法是curl进行简单测试 curl是非常方便的Rest 客户端, 可以很方便的完成 Rest API测…

leetcode142. 环形链表 II

leetcode142. 环形链表 II 题目 思路 集合法 将节点存入set&#xff0c;若重复出现则说明是环 快慢指针法 分别定义 fast 和 slow 指针&#xff0c;从头结点出发&#xff0c;fast指针每次移动两个节点&#xff0c;slow指针每次移动一个节点&#xff0c;如果 fast 和 slow指…

【成长记录】第一次写博客入csdn榜单了 还是第一.....

庆祝一下第一次拿综合榜榜一 Java内容榜第二 总之谢谢大家支持 小苏会继续努力的 可以看看我的新作 嘻嘻&#x1f601;&#x1f924;&#x1f449;&#x1f3fb;&#x1f448;&#x1f3fb; 谢谢大家

Linux之多线程

目录 一、进程与线程 1.1 进程的概念 1.2 线程的概念 1.3 线程的优点 1.4 线程的缺点 1.5 线程异常 1.6 线程用途 二、线程控制 2.1 POSIX线程库 2.2 创建一个新的线程 2.3 线程ID及进程地址空间布局 2.4 线程终止 2.5 线程等待 2.6 线程分离 一、进程与线程 在…

代码随想录算法训练营29期|day50 任务以及具体任务

第九章 动态规划part07 70. 爬楼梯 &#xff08;进阶&#xff09;import java.util.Scanner; class climbStairs{public static void main(String [] args){Scanner sc new Scanner(System.in);int m, n;while (sc.hasNextInt()) {// 从键盘输入参数&#xff0c;中间用空格隔开…

[C#] 如何调用Python脚本程序

为什么需要C#调用python&#xff1f; 有以下几个原因需要C#调用Python&#xff1a; Python拥有丰富的生态系统&#xff1a;Python有很多强大的第三方库和工具&#xff0c;可以用于数据科学、机器学习、自然语言处理等领域。通过C#调用Python&#xff0c;可以利用Python的生态系…

【从Python基础到深度学习】4. Linux常用命令(进阶)

接上篇 【从Python基础到深度学习】4. Linux 常用命令-CSDN博客 1.文件查找 - find 命令 find [搜索路径] [搜索条件] [操作]1.1 常用选项和参数 -name&#xff1a;按文件名搜索。 find 命令的 -name 选项可以接受通配符来匹配文件名。通配符可以帮助你更灵活地搜索文件名&a…

fluent脱硝SCR相对标准偏差、氨氮比、截面速度计算

# -*- coding: utf-8 -*- """ Created on Wed Sep 20 20:40:30 2023 联系QQ:3123575367&#xff0c;专业SCR脱硝仿真。 该程序用来处理fluent通过export-solution-ASCII-Space导出的数据&#xff0c;可计算标准偏差SD、相对标准偏差RSD,适用于求解平面的相对均匀…

【MATLAB源码-第135期】基于matlab的变色龙群优化算法CSA)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 变色龙群优化算法&#xff08;Chameleon Swarm Algorithm&#xff0c;CSA&#xff09;是一种新颖的群体智能优化算法&#xff0c;受到自然界中变色龙捕食和社交行为的启发。变色龙以其独特的适应能力而著称&#xff0c;能够根…

猫头虎分享:localhost和127.0.0.1的区别是什么?

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

Visual studio Code 配置用户代码片段---Vue为例

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

【JavaEE进阶】 图书管理系统开发日记——陆

文章目录 &#x1f38b;前言&#x1f343;删除图书&#x1f6a9;约定前后端交互接口&#x1f6a9;完善前端代码&#x1f6a9;接口测试 &#x1f38d;批量删除&#x1f6a9;约定前后端交互接口&#x1f6a9;实现后端服务器代码&#x1f388;控制层&#x1f388;业务层&#x1f3…

【双指针】【C++算法】1537. 最大得分

作者推荐 【深度优先搜索】【树】【图论】2973. 树中每个节点放置的金币数目 本文涉及知识点 双指针 LeetCoce 1537. 最大得分 你有两个 有序 且数组内元素互不相同的数组 nums1 和 nums2 。 一条 合法路径 定义如下&#xff1a; 选择数组 nums1 或者 nums2 开始遍历&…

celery异步框架的使用

文章目录 celery的介绍celery的架构celery的快速使用celery 包结构celery 定时 异步 延迟任务django使用celery celery的介绍 celery是什么&#xff1f; -翻译过来是芹菜 -官网&#xff1a;https://docs.celeryq.dev/en/stable/ -吉祥物&#xff1a;芹菜 -分布式的异步任务框架…

详解汉诺塔:递归树与纯函数编程

1. 汉诺塔问题为什么有解 相信只要接触过编程就会知道什么是汉诺塔问题&#xff1a; 有三根柱子&#xff0c;分别标记为A、B和C。初始时&#xff0c;在柱子A上按从大到小的顺序堆叠着若干个圆盘。目标是将所有的圆盘从柱子A移动到柱子C。在移动过程中可以借助柱子B作为辅助&a…

文件上传-第三方服务阿里云OSS

JAVA后端实现文件上传,比如图片上床功能,有很多实现方案,可以将图片保存到服务器的硬盘上。也可以建立分布式集群,专门的微服务来存储文件常见的技术比如Minio。对于中小型公司&#xff0c;并且上传文件私密性不高的话可以使用第三方的存储服务&#xff0c;比如阿里云、华为云等…

Mysql中关于on,in,as,where的区别

目录 Mysql on,in,as,where的区别 Mysql语句问题解决 1、left join数据筛选问题 2、相同数据重复筛选使用问题 3、根据某个字段排序取每个类别最后三条数据或前三条数据 4、业务逻辑书写位置问题 5、查找另一表内和本表相关字段的数量 6、关于union的使用 7、limit的巧…

波奇学Linux:文件缓冲区

问题导入 文件流输出直接向显示器和重定向文件有不一样的表现 分别向显示器文件输出四个语句&#xff0c;最后fork创建子进程。 当程序运行时和程序重定向到文件中&#xff0c;输出的内容不一样。 重定向时c库函数&#xff08;printf,fprintf,fwrite&#xff09;调用了两次&…

掌握C语言文件操作:从入门到精通的完整指南!

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C语言学习 贝蒂的主页&#xff1a;Betty‘s blog 1. 什么是文件 文件其实是指一组相关数据的有序集合。这个数据集有一个名称&a…