什么是Eureka? 单机版Eureka如何使用?

Eureka 是什么?

  • Eureka 是Spring Cloud的服务治理组件,有三个核心角色: 服务注册中心、服务提供者、服务消费者。Eureka 主管服务注册中心。 是Netflix的一个子模块,也是核心模块之一。Eureka是一个基于REST的服务,用于定位服务,以实现定位服务,以实现云端中间层服务发现和故障转移。服务注册与发现对于微服务架构来说是非常重要的,有了服务发现与注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了,功能类似于dubbo的注册中心比如Zookeeper。
  • Netflix 在设计Eureka 时遵守的就是AP原则(CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得)
  • Eureka 采用了 C-S 的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中心。
  • 系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。SpringCloud 的一些其他模块(比如Zuul)就可以通过 Eureka Server 来发现系统中的其他微服务,并执行相关的逻辑。

三大角色

服务提供者

  • “服务提供者” 在启动的时候会通过发送REST请求的方式将自己注册到EurekaServer 上, 同时带上了自身服务的一些元数据信息。Eureka Server接收到这个REST请求之后, 将元数据信息存储在一个双层结构Map中, 其中第一层的key是服务名, 第二层的key是 具体服务的实例名。(我们可以回想一下之前在实现Ribbon负载均衡的例子中, Eureka信 息面板中一个服务有多个实例的清况, 这些内容就是以这样的双层Map形式 存储的。) 在服务注册时, 需要确认一下 eureka.cli ent.register-with-eureka=true 参数是否正确, 该值默认为true。 若设置为false将不会 启动注册操作。
  • 两个服务提供者分别注册到了两个不同的服务注册中心上, 也就是说, 它们的信息分别被两个服务注册中心所维护。 此时, 由于服务注册中心之间因 互相注册为服务, 当服务提供者发送注册请求到一个服务注册中心时, 它会将该请求转发 给集群中相连的其他注册中心, 从而实现注册中心之间的服务同步 。 通过服务同步,两个 服务提供者的服务信息就可以通过这两台服务注册中心中的任意一台获取到。
  • 在注册完服务之后,服务提供者会维护一个心跳用来持续告诉Eureka Server: "我还活 着 ”, 以防止Eureka Server的 “剔除任务 ” 将该服务实例从服务列表中排除出去,我们称 该操作为服务续约(Renew)。 eureka.instance.lease-renewal-interval-in-seconds 参数用于定义服 务续约任务的调用间隔时间,默认为30秒。 eureka.instance.lease-expiration-duration-in-seconds参数用于定义服务失效的时间,默认为90秒。

服务消费者

  • 获取服务。 服务注册中心已经注册了 一个服务, 并且该服务有两个实例。 当我们启动 服务消费者的时候, 它会发送一个REST请求给服务注册中心,来获取上面注册的服务清 单 。 为了性能考虑, Eureka Server会维护一份只读的服务清单来返回给客户端,同时该缓 存清单会每隔30秒更新 一次。 获取服务是服务消费者的基础,所以必须确保eureka.client.fetch-registry= true参数没有被修改成false, 该值默认为true。若希望修改缓存清单的 更新时间,可 以通过 eureka.client.registry-fetch-interval-seconds= 30参数进行修改, 该参数默认值为30, 单位为秒。
  • 服务调用。服务消费者在 获取服务清单后,通过服务名可以获得具体提供服务的实例名和该实例 的元数据信息。 因为有这些服务实例的详细信息, 所以客户端可以根据自己的需要决定具 体调用哪个实例,在Ribbon中会默认采用轮询的方式进行调用,从而实现客户端的负载均 衡。
  • 服务下线。在系统运行过程中必然会面临关闭或重启服务的某个实例的情况, 在服务关闭期间, 我们自然不希望客户端会继续调用关闭了的实例。 所以在客户端程序中, 当服务实例进行 正常的关闭操作时, 它会触发一个服务下线的 REST请求给Eureka Server, 告诉服务注册 中心:“我要下线了” 。 服务端在接收到请求之后, 将该服务状态置为下线(DOWN), 并把 该下线事件传播出去。

服务注册中心

  • 失效剔除。 有些时候, 我们的服务实例并不一定会正常下线, 可能由于内存溢出、 网络故障等原 因使得服务不能正常工作, 而服务注册中心并未收到 “服务下线” 的请求。 为了从服务列 表中将这些无法提供服务的实例剔除, Eureka Server在启动的时候会创建一个定时任务, 默认每隔一段时间(默认为60秒) 将当前清单中超时(默认为90秒)没有续约的服务剔 除出去。
  • 自我保护。Eureka Server 在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%, 如果出现低于的情况(在 单机调试的时候很容易满足, 实际在生产环境上通常是由于网络不稳定导致), Eureka Server会将当前的实例注册信息保护起来, 让这些实例不会过期, 尽可能保护这些注册信 息。 但是, 在这段保护期间内实例若出现问题, 那么客户端很容易拿到实际已经不存在的 服务实例, 会出现调用失败的清况, 所以客户端必须要有容错机制, 比如可以使用请求重 试、 断路器等机制。 由于本地调试很容易触发注册中心的保护机制, 这会使得注册中心维护的服务实例不 那么准确。 所以, 我们在本地进行开发的时候, 可以使用 eureka.server.enable-self-preservation=false 参数来关闭保护机制,以确保注册中心可以将不可用的实例正确剔除。

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

  • Eureka Server 提供服务注册服务

    各个节点启动后,会在EurekaServer 中进行注册,这样EurekaServer 中的服务注册表建辉存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到

  • Eureka Client Java客户端

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

Eureka 自我保护机制

默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳,EurekaServer将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务与EurekaServer之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身其实是健康的,此时本不应该注销这个微服务。Eureka通过“自我保护模式”来解决这个问题——当EurekaServer节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,EurekaServer就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。

在自我保护模式中,Eureka Server会保护服务注册表中的信息,不再注销任何服务实例。当它收到的心跳数重新恢复到阈值以上时,该Eureka Server节点就会自动退出自我保护模式。它的设计哲学就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。一句话讲解:好死不如赖活着

综上,自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留),也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的健壮、稳定。

在Spring Cloud中,可以使用eureka.server.enable-self-preservation = false 禁用自我保护模式。

某时刻某一个微服务不可用了,eureka不会立刻清理,依旧会对该微服务的信息进行保存


上面主要是关于Eureka的介绍,下面Base之前构建的服务的生产者和消费者来实现单机版的Eureka

Eureka 服务注册中心模块

新建模块: springcloudDemo-Eureka-7001,具体的使用Maven构建模块的操作方法就不演示了,请查看上面的关联文章。具体项目结构:
在这里插入图片描述

POM文件

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.mike.demo</groupId><artifactId>springcloudDemo</artifactId><version>0.0.1-SNAPSHOT</version></parent><artifactId>springcloudDemo-Eureka-7001</artifactId><dependencies><!--eureka-server服务端 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka-server</artifactId></dependency><!-- 修改后立即生效,热部署 --><dependency><groupId>org.springframework</groupId><artifactId>springloaded</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency></dependencies>
</project>

application.yml 配置文件

server: port: 7001eureka:instance:hostname: eureka7001.com #eureka服务端的实例名称, C:\Windows\System32\drivers\etc 的hosts已经加入映射client:register-with-eureka: false #false表示不向注册中心注册自己。fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务service-url:#单机defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/        #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。  

配置Windows hosts文件

打开 C:\Windows\System32\drivers\etc
将域名 eureka7001.com 映射到 127.0.0.1
在这里插入图片描述
至于其他操作系统,大家可以百度一下或谷歌,由于之后会有集群所以为了方便设置了域名。

Eureka 主启动类

package com.mike.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@SpringBootApplication
@EnableEurekaServer//EurekaServer服务器端启动类,接受其它微服务注册进来
public class EurekaServer7001_App
{public static void main(String[] args){SpringApplication.run(EurekaServer7001_App.class, args);}
}

服务注册中心测试

启动 Eureka 模块
http://eureka7001.com:7001/
在这里插入图片描述
这里可以看到,没有任何服务注册进来。

修改服务提供者

服务提供者: springcloudDemo-provider-dept-8001,这个模块在之前我们已经构建完成。请查看文章开口的文章列表。

POM

pom文件添加Eureka 的依赖

   <!-- 将微服务provider侧注册进eureka --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency><!-- 监控插件--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>

父项目POM文件修改

父项目(springcloudDemo)
在POM文件中加入:

  <build><finalName>springcloudDemo</finalName><resources><resource><directory>src/main/resources</directory><filtering>true</filtering></resource></resources><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><configuration><delimiters><delimit>$</delimit></delimiters></configuration></plugin></plugins></build>

上面的修改主要是为了使 服务的提供者 设置的服务信息生效即下方的application.yml 修改中的内容:

info:app.name: atguigu-springcloudDemocompany.name: www.atguigu.combuild.artifactId: $project.artifactId$build.version: $project.version$

修改 application.yml

server:port: 8001mybatis:config-location: classpath:mybatis/mybatis.cfg.xml        # mybatis配置文件所在路径type-aliases-package: com.mike.demo.entities    # 所有Entity别名类所在包mapper-locations:- classpath:mybatis/mapper/**/*.xml                       # mapper映射文件spring:application:name: springcloudDemo-dept datasource:type: com.alibaba.druid.pool.DruidDataSource            # 当前数据源操作类型driver-class-name: org.gjt.mm.mysql.Driver              # mysql驱动包url: jdbc:mysql://XXXXXXXXXX:3306/cloudDB01              # 数据库名称username: rootpassword: XXXXdbcp2:min-idle: 5                                           # 数据库连接池的最小维持连接数initial-size: 5                                       # 初始化连接数max-total: 5                                          # 最大连接数max-wait-millis: 200                                  # 等待连接获取的最大超时时间eureka:client: #客户端注册进eureka服务列表内service-url: #单机版defaultZone: http://localhost:7001/eurekainstance: # 将服务名称修改 (页面中显示服务名称 原: localhost:springcloudDemo-dept:8001 修改为springcloudDemo-dept8001)instance-id: springcloudDemo-dept8001prefer-ip-address: true
info:app.name: atguigu-springcloudDemocompany.name: www.atguigu.combuild.artifactId: $project.artifactId$build.version: $project.version$

启动类添加Eureka的Enable

@EnableEurekaClient //本服务启动后会自动注册进eureka服务中
在这里插入图片描述

修改完毕,测试

查看服务是否注册进已经开启的Eureka服务器,首先启动Eureka服务器再启动服务的提供者(先有联通运营商后有我们这些联通用户并联网)
在这里插入图片描述
查看截图:
红框的查看已经显示了有一个服务注册进入到了Eureka服务器中,上面的红色报错,是因为Eureka自我保护机制导致,长时间没有服务注册。
下面重启所有的服务,查看错误是否消除
在这里插入图片描述
在这里插入图片描述

  • 由上图可以看到,重启Eureka和服务提供者后,Eureka由于自我保护机制出现的错误消失了
  • SPRINGCLOUDDEMO-DEPT 是由 application.yml 配置文件中定义的
    在这里插入图片描述
  • springcloudDemo-dept8001 是由 application.yml 配置文件中定义的
    在这里插入图片描述
  • 点击 springcloudDemo-dept8001 可以查看该服务节点的详细信息,这里的详细信息也是在application.yml 中配置的
info:app.name: atguigu-springcloudDemocompany.name: www.atguigu.combuild.artifactId: $project.artifactId$build.version: $project.version$

在这里插入图片描述

  • 测试服务提供者
    在这里插入图片描述

Eureka 服务发现

– 对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息

服务提供者修改Controller

  import org.springframework.cloud.client.discovery.DiscoveryClient;@Autowiredprivate DiscoveryClient client;// Eureka 服务发现测试 @RequestMapping(value = "/dept/discovery", method = RequestMethod.GET)public Object discovery(){List<String> list = client.getServices();System.out.println("**********" + list);List<ServiceInstance> srvList = client.getInstances("MICROSERVICECLOUD-DEPT");for (ServiceInstance element : srvList) {System.out.println(element.getServiceId() + "\t" + element.getHost() + "\t" + element.getPort() + "\t"+ element.getUri());}return this.client;}

启动类添加注解 @EnableDiscoveryClient

测试

重启Eureka 和 provider
输入: http://eureka7001.com:8001/dept/discovery
在这里插入图片描述


自此单节点的Eureka 如何部署并使用已经完成了。

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

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

相关文章

ntko跨浏览器插件_继泄露版后,微软全新 Chrome 内核 Edge 浏览器你都测试过了吗?...

尽管微软的 Office 和 Windows 10 势头不错&#xff0c;但像 WP 手机、XBox 等方面似乎并未获得预期的成功。而先前为了替代老旧的 IE 浏览器&#xff0c;微软倾力开发的 Edge 也未见起色。不过微软也一直在努力变得更加开放&#xff0c;比如发布 VS for Mac、Office for Mac、…

如何将单机版的Eureka服务改为集群版Eureka服务

Eureka 集群原理 基本原理 上图是来自eureka的官方架构图&#xff0c;这是基于集群配置的eureka&#xff1b; 处于不同节点的eureka通过Replicate进行数据同步Application Service为服务提供者Application Client为服务消费者Make Remote Call完成一次服务调用 服务启动后向…

台式计算机读不到u盘怎么回事,电脑读不出u盘怎么办

把U盘插入电脑USB接口中&#xff0c;却发现找不到U盘图标&#xff0c;甚至连安装U盘驱动的提示也没有&#xff0c;那么电脑读不出u盘怎么办呢?天学习啦小编就和大家说说电脑读不出u盘的解决方法。电脑读不出u盘解决方法1、首先应该排除是否是由于电脑系统问题&#xff0c;具体…

Eureka 与Zookeeper 的区别,Eureka相较于Zookeeper好在哪?

传统的ACID A&#xff08;Atomicity&#xff09; 原子性C&#xff08;Consistency&#xff09; 一致性I &#xff08;Isolation&#xff09;独立性D&#xff08;Durability&#xff09;持久性 关系型数据库&#xff08;MySQL&#xff0c;Oracle&#xff0c;SqlServer&#xf…

如何将Springboot项目成功部署到linux服务器上?

springboot的jar包方式 idea默认就是jar打包方式所以直接使用maven工具按照步骤点击就可以直接打包ps:打包前你的数据库相关的连接信息要记得修改&#xff0c;不能再用本地的了 第二步&#xff1a;Maven clean &#xff1a;清除编译后的目录&#xff0c;默认是target目录 [IN…

2018年3月计算机二级考试题,2018年3月计算机二级考试Access综合试题十

2018年3月计算机等级考试即将开始&#xff0c;小编在这里为考生们整理了2018年3月计算机二级考试Access综合试题&#xff0c;希望能帮到大家&#xff0c;想了解更多资讯&#xff0c;请关注出国留学网的及时更新哦。2018年3月计算机二级考试Access综合试题十(1)要将“选课成绩”…

sqldataadapter.fill 索引超出了数组界限_小学生学习C++||第十五节 数组

存储数据的方式第一种&#xff0c;变量&#xff1a;存放1个学生的数学成绩可以定义1个变量存放&#xff0c;那么如果想要存放100个学生的数学成绩应该如何存储呢&#xff1f;第二种&#xff0c;数组&#xff1a;引入数组概念&#xff1a;可以用来表达类型相同的元素的集合&…

数据字典在sga的哪一个组件中缓存_【赵强老师】Oracle数据库的内存结构

首先&#xff0c;我们通过一张图片来了解一下Oracle数据库的内存结构&#xff0c;如下&#xff1a;每个数据库实例有两个关联的内存结构—系统全局区(SGA),程序全局区(PGA)。系统全局(SGA)&#xff1a;一组共享的内存结构(称为SGA 组件)&#xff0c;其中包含一个OracleDB 实例的…

计算机黑屏策略,小黑w7系统诊断策略服务已被禁用的还原教程

小黑w7家庭版开机速度快&#xff0c;是入门级小黑w7系统。据调查不少用户在使用中都碰到了诊断策略服务已被禁用的问题。面对小黑w7系统诊断策略服务已被禁用这样的小问题&#xff0c;我们该如何解决呢&#xff1f;不经常使用电脑的朋友对于小黑w7系统诊断策略服务已被禁用的问…

overline css,CSS text-decoration-line 属性

定义和用法text-decoration-line 属性规定文本修饰要使用的线条类型。注意&#xff1a;您也可以使用 text-decoration 属性设置 text-decoration-line。text-decoration 属性是 text-decoration-line、text-decoration-style 和 text-decoration-color 属性的速记属性。注意&am…

npoi word在试图打开文件时遇到错误_【技巧】word在试图打开文件时遇到错误

问题使用Word的时候遇到了一个问题&#xff0c;如下图所示解决方案情况一&#xff1a;修改文件后缀导致打开错误如果源文件不是“.doc”或者“.docx”格式结尾&#xff0c;通过修改文件后缀的方式修改为“.doc”或者“.docx”格式。在打开文件的时候出现上述警告时&#xff0c;…

空间服务器有问题是系统问题吗,服务器空间租用两个主要问题要留意

只要是建设网站&#xff0c;那么服务器空间租用都是不能缺少的。而且这样的一种租赁模式都是长期的&#xff0c;所以我们需要考虑到租用的整体性价比&#xff0c;这样后续的应用才能有所保障。而且我们只要是建设了网站&#xff0c;服务器和空间一般都是不会更换掉的&#xff0…

面试让HR都能听懂的MySQL锁机制,欢声笑语中搞懂MySQL锁

腾讯云数据库负责人林晓斌说过&#xff1a;“我们面试MySQL同事时只考察两点&#xff0c;索引和锁”。言简意赅&#xff0c;MySQL锁的重要性不言而喻。 本文通过同事“侨总”的一场面试&#xff0c;带你通俗易懂的掌握MySQL各种锁机制&#xff0c;希望可以帮到你&#xff01;近…

MySQL锁机制,行锁jingran加在索引上

锁概述 锁是计算机协调多个进程或线程并发访问某一资源的机制&#xff0c;应该都不陌生。?但在这之前我们先来看看并发控制&#xff0c;理清MVCC多版本并发控制和锁的关系&#xff0c;这也是之前我很迷惑的一个点 并发控制技术 在数据库中&#xff0c;数据可以允许多个用户…

闲置服务器 虚拟服务器,闲置主机搭建服务器

闲置主机搭建服务器 内容精选换一换安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具&#xff0c;将文件上传到云服务器。例如QQ.exe。在本地主机和Windows云服务器上分别安装数据传输工具&#xff0c;将文件上传到云服务器。例如QQ.exe。本地磁盘映射(推荐使用…

浏览器接收响应数据过大_交互响应性能之优化FID

由于 FID 需要一个真实用户的交互&#xff0c;所以无法用实验数据测试。为了在实验数据下预测 FID&#xff0c;通常会用 TBT(Total Blocking Time)&#xff0c;具体这个指标后面文章会介绍。他们测量的内容不同&#xff0c;但改善 TBT 通常也能改善 FID。一个糟糕的 FID 主要原…

postman如何发送application/json类的post请求

​ 当接口类型限制为只接受application/json类型的请求&#xff0c;我们使用postman测试的时候怎么选择呢&#xff1f;如下图&#xff1a; 我们需要先在postman上选择POST请求方法&#xff0c;后边输入要请求的地址即可。 在Body选项卡选择raw&#xff0c;然后再后边的下拉选项…

fe文件服务器,FE File Explorer

FE File Explorer是Mac电脑上的一款文件管理应用。FE File Explorer可以访问FTP&#xff0c;SFTP&#xff0c;WebDAV服务器和网络共享上的文件。在这些位置之间传输文件。将电影和歌曲流式传输到Mac。直接在远程位置查看和编辑文档&#xff0c;照片&#xff0c;文件&#xff0c…

swift中文文档_Flutter 中文文档:使用 Packages

Flutter 支持使用其他开发者向 Flutter 和 Dart 生态系统贡献的共享 package&#xff0c;这意味着你可以快速构建应用而不是一切从零开始。现有的 package 支持许多使用场景&#xff0c;例如&#xff0c;网络请求 (http)&#xff0c;自定义导航/路由处理 (fluro)&#xff0c;集…

Spring深入理解之ComponentScan___@ComponentScan 详解

Spring深入理解之ComponentScan 一、概述 ComponentScan顾名思义包扫描&#xff0c;底层其实就可以通过递归算法反射将其装载成bean来实现的&#xff0c;实在开发过程中&#xff0c;Spring已经帮我们实现好了&#xff0c;我们其实就可以直接使用XML或者注解的形式来进行业务处…