什么是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、…

软考计算机英语考题,《全国计算机软考网管英语试题及答案.doc

《全国计算机软考网管英语试题及答案全国计算机软考网管英语试题及答案(1)Heterogeneous network environments consist of computer systems from(1)vendors that run(2)operating systems and communication protocols&#xff0e;An organization that(3)its computer resou…

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

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

python统计字数分布可视化展示_数据的概率分布并用python实现概率分布可视化图...

一、基础概念先来看下数据的类型&#xff0c;常见的数据分类方式有三种&#xff1a;第一种是按照数据的结构属性分类&#xff0c;根据数据的存储形式分为结构化数据和非结构化数据&#xff0c;例如数据库的存储对象基本上都是结构化数据&#xff0c;结构化数据是进行数据分析的…

台式计算机读不到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…

断网情况下安装python_断网环境下利用pip安装Python离线安装包

著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。这几天搞Windows离线断网环境下安装Python包&#xff0c;配置环境&#xff0c;各种坑&#xff01;做个记录&#xff0c;供以后查询吧。# 生产环境 windows 7# python 2.7.9# pip 1.5.2友情提示…

计算机英语词组,计算机专业英语词组.doc

Integrated circuit 集成电路Central controller 中央控制器Trigonometry function 三角函数Square root 平方根Floating point 浮点数Real number 实数Logic operation 逻辑运算Superscalar computer 超级计算机Hard disk drive 硬盘驱动器Personal computer 个人计算机Floppy…

python 整数输出 d f_如何将数字(10,11,12,13,14,15)分配给Python 3中的字母(A,B,C,D,E,F)?...

您可以在代码中添加更多行来执行此操作&#xff1a;首先创建两个带有字符的列表&#xff0c;一个带有要映射的整数&#xff0c;然后从那些创建dict&#xff1a;list_1["A","B","C","D","E","F"]list_2[10,11,12,1…

如何将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;可以用来表达类型相同的元素的集合&…

计算机组组内培训记录,计算机教研组活动记录.doc

计算机教研组活动记录PAGE \* MERGEFORMAT 3计算机基础教研组活动记录活动时间2017年10月17日参加人员&#xff1a;田飞, 许丽, 张刚, 夏丽, 刘璐, 苑瑜, 王梦, 靳双正, 梁宇, 常喜活动主题如何提高计算机课程教学质量活动过程摘要活动记录&#xff1a;田飞——今天我们就如何提…

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

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

springboot+shiro:ShiroConfiguration配置

1.EhCacheManager EhCache缓存管理也可将shiro session存入redis中 Beanpublic EhCacheManager getEhCacheManager() {EhCacheManager em new EhCacheManager();em.setCacheManagerConfigFile("classpath:ehcache-shiro.xml");return em;}ehcache-shiro.xml中的配置…

幼师计算机课是上什么,幼师面试 鱼在天空飞,鸟在水里游是小班课程,还是中班,大班的课程...

大班第一课时教学目标&#xff1a;1、学会生字“鸟、儿、鱼、飞”,读准音,认清形,了解义,能正确书写.2、看图感知画面内容,练习说话.3、拓展认识各种鸟,鱼&#xff1b;激发学生喜爱小动物的的感情.教学重点&#xff1a;学会“鸟、儿、飞、鱼”四个生字,读准字音,了解字义,能正确…

python关键词大全_Python 批量获取Baidu关键词的排名并入库

1.[代码][Python]代码#-*- coding: UTF-8 -*-#Python UTF-8 抓取百度关键词V1.0#key.txt是抓取文件配置#author PHPer.yanggmail.comimport cgi,urllib #URL读取import re #正则匹配import MySQLdb #MySQLimport datetime #时间#import time,thread #多线程"""M…

mysql出现多线程操作同一个表的情况,应该怎么办?

1、对于MySQL来说&#xff0c;有三种锁的级别&#xff1a;页级、表级、行级。 页级的典型代表引擎为BDB。 表级的典型代表引擎为MyISAM,MEMORY以及很久以前的ISAM。 行级的典型代表引擎为INNODB。 2、我们实际应用中用的最多的就是行锁。 行级锁的优点如下&#xff1a; 1&…

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

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

python中的date的含义_python中date、datetime、string的相互转换

import datetimeimport timestring转datetimestr 2012-11-19date_time datetime.datetime.strptime(str,%Y-%m-%d)date_timedatetime.datetime(2012,11,19,0,0)datetime转stringdate_time.strftime(%Y-%m-%d)2012-11-19datetime转时间戳time_time time.mktime(date_time.tim…