赞
踩
Eureka是Netflix开发的服务发现框架,(作为注册中心的角色)本身是一个基于REST的服务,(应用举例:在AWS中,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的)。 SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。而可以与之对比的是,在 Dubbo 中,官方推荐的服务注册与发现方式是使用 Zookeeper(也是作为注册中心的角色),此方式的具体知识可参考之前文章:SpringBoot集成 Dubbo + Zookeeper + Dubbo Admin:服务注册发现实战与详细步骤。
Netflix Eureka 是 Netflix 的一个子模块,也是核心模块之一。同时 Netflix Eureka 是一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移。
Netflix 在设计Eureka 时,遵循的就是 CAP 原则,CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。
Eureka 采用了 C-S 的架构设计,EurekaServer 作为服务注册功能的服务器,作为服务注册中心。
Spring Cloud Eureka 是对 Netflix Eureka 做了二次封装,SpringCloud 封装了NetFlix公司开发的Eureka模块来实现服务注册和发现。
系统中的其他微服务。使用 Eureka 的客户端连接到 EurekaServer 并维持心跳连接(心跳连接就是每隔一段时间发个消息,如果没相应就说明已经没有了心跳,挂掉了)。这样系统的维护人员就可以通过 EurekaServer 来监控系统中各个微服务是否正常运行,SpringCloud 的一些其他模块(比如 Zuul)就可以通过 EurekaServer 来发现系统中的其他微服务,并执行相关的逻辑,逻辑关系和角色如下图所示:
而可以借此对比一下 Dubbo 框架的架构,对比学习,如下图:
(以下学习自——百度百科 Eureka)
Eureka包含两个组件:Eureka Server 和 Eureka Client。
综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。
Eureka Server:提供服务的注册于发现。
Service Provider:将自身服务注册到Eureka中,从而使消费方能够找到。
Service Consumer:服务消费方从Eureka中获取注册服务列表,从而找到消费服务。
在父 Maven 工程中(此 Maven 父工程,是直接利用的之前的一个项目:【Spring Cloud】RestTemplate:学习总结、项目实战)新建一个名为 springcloud-eureka-7001 的子模块作为服务端。
为此子模块添加 Eureka 依赖,我们在上文已经提到了,Eureka包含两个组件,即 Eureka Server 和 Eureka Client,正好对应下图的两个红框项目:
我们让 springcloud-eureka-7001 子模块作为服务端,因此,导入 Spring Cloud Starter Eureka Server 依赖到其中,目前所需依赖如下
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
接下来创建 application.yml 配置文件,配置项目的端口及 Eureka 必要配置:
之后手写出此模块的主启动类,需要添加 @EnableEurekaServer 注解:
接下来,访问我们事先配置的地址,即可来到 Eureka 的监控页面
我们在之前的一个项目:【Spring Cloud】RestTemplate:学习总结、项目实战 中 springcloud-provider-dept-8001 的子模块的基础上改造,将此模块注册到 Eureka 注册中心中,来进一步学习 Eureka
选择并添加此依赖
在此模块的 pom 文件中添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
在其 yml 配置文件中添加内容:
在主启动类中添加 @EnableEurekaClient 注解
测试时,先启动作为 Eureka 服务端的 springcloud-eureka-7001 子模块,再启动此 springcloud-eureka-8001 子模块
访问监控页面:http://localhost:7001/
8001 项目成功注册进来
其中,SPRINGCLOUD-PROVIDER-DEPT 对应
我们这次将已注册进来的 8001 项目给终止掉,通过监控页面观察注册中心的变化
ok,注册中心中目前仍存在 8001 的服务
过了一会,提示如下红字,翻译过来就是:紧急情况!EUREKA可能错误地声称实例在未启动时已启动。续订小于阈值,因此实例不会为了安全而过期。
这就是 Eureka 的自我保护机制,保护过期实例,此微服务不可用了,Eureka 不会立刻清理,依旧会对该微服务的信息进行保存,在默认的情况下,如果Eureka Server 在一定的时候内,没有接受到某个微服务的心跳,就会注销该实例,默认时间是90秒。但是当网络发生故障的情况下,微服务和 EurekaServer 就无法通讯,这样就很危险,因为微服务本身是健康的,此时不应该注销该服务,而 EurekaServer 通过自我保护机制解决这个问题,自我保护机制可以手动禁用,但不推荐禁用。
关于 Eureka 的自我保护机制,有一篇大佬的文章:EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT 写的非常好。
最后,我们重新将 8001 项目启动起来,以进行下面的学习和测试。
未配置前,点击此链接
点进去是报错的
接下来我们的配置就是解决此问题
在 8001 项目中添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
在 yml 中添加配置
之后我们再点下图的链接
可以成功访问我们预先配置的信息
因此,在大公司中,多个团队开发各自的微服务,为了表示各个模块服务中的团队信息,可以在此链接配置一些基本信息,并可以将 JSON 渲染到页面中。
给 8001 模块的 DeptController 增加新的方法和实例
同时在 8001 模块的主启动类中开启此功能的自动配置,添加 @EnableDiscoveryClient 注解
注:导入的是接口
重启 8001 模块后,访问刚才配置的映射地址,即可得到项目的基本信息,可在团队合作开发中使用
同时,我们刚才写的输出内容如下
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。