SpringCloud学习系列之一 ----- 搭建一个高可用的注册中心(Eureka) (2)

代码示例:

@SpringBootApplication @EnableDiscoveryClient public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); System.out.println("客户端服务启动..."); } } 功能测试

完成如上的工程开发之后,我们依次启动服务端和客户端程序,然后在浏览器界面输入::8000/,即可查看注册中心的信息。

访问界面地址:

在这里插入图片描述

通过上述示例图中,可以看到Eureka启动成功了,并且有一个服务进行注册了。

成功的实现了服务注册功能之后,我们来测试下Eureka服务的保护机制。
这里我们先关闭客户端,查看界面信息,发现没什么改变,等待大约15分钟左右之后,再到Eureka界面查看信息,发现出现了一长串红字描述,描述的语句如下:

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

翻译之后的意思:

紧急!EUREKA可能错误地声称实例已经启动,而实际上并没有。续订小于阈值,因此实例不会为了安全而过期。

界面示例图:

在这里插入图片描述

这里就顺便说下Eureka的自我保护机制。

自我保护模式正是一种针对网络异常波动的安全保护措施,使用自我保护模式能使Eureka集群更加的健壮、稳定的运行。

自我保护机制的工作机制是如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,Eureka Server自动进入自我保护机制,此时会出现以下几种情况:

Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。

Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。

当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。

因此Eureka Server可以很好的应对因网络故障导致部分节点失联的情况,而不会像ZK那样如果有一半不可用的情况会导致整个集群不可用而变成瘫痪。

自我保护机制的相关配置如下:

服务端的配置:

eureka.server.enable-self-preservation: 该配置可以移除这种自我保护机制,防止失效的服务也被一直访问 (Spring Cloud默认该配置是 true)。

eureka.server.eviction-interval-timer-in-ms:该配置可以修改检查失效服务的时间,每隔10s检查失效服务,并移除列表 (Spring Cloud默认该配置是 60s)

客户端的配置:

eureka.instance.lease-renewal-interval-in-seconds: 该配置指示eureka客户端需要向eureka服务器发送心跳的频率 (Spring Cloud默认该配置是 30s)。

eureka.instance.lease-expiration-duration-in-seconds: 该配置指示eureka服务器在接收到最后一个心跳之后等待的时间,然后才能从列表中删除此实例 (Spring Cloud默认该配置是 90s)。

这里顺便说下Eureka的的心跳机制。

Eureka Client需要每30秒给Eureka Server发一次心跳,同时更新Server上最新的注册信息到本地,如果Server多次没有收到来自客户端的心跳,那么在90秒内会被Server上剔除。

高可用的注册中心

上述的服务注册中心示例是单点的,如果在生产环境中就显得不适合,显然这并不适合应用于线上生产环境。作为分布式系统最重要的注册服务功能,为了使其高可用,使用集群是最普遍的方式。Eureka可以通过互相注册的方式来实现高可用的部署。

Eureka实现相互注册的方式很简单,只需要将各个服务端的地址相互进行配置即可。
那么我们再来新建两个服务端的工程,其中配置信息如下:

server2配置信息:

spring.application.name=springcloud-eureka-server server.port=8002 eureka.instance.hostname = server2 eureka.client.serviceUrl.defaultZone=http://server3:8003/eureka/

server3配置信息:

spring.application.name=springcloud-eureka-server server.port=8003 eureka.instance.hostname = server3 eureka.client.serviceUrl.defaultZone=http://server2:8002/eureka/

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyyxws.html