赞
踩
Eureka是Netflix影视公司出品的一套成熟老套的微服务技术,用于注册中心,以后出来的consul、zookeeper和Nacos多少会借鉴一点Eureka的相关思想和技术。
1、Eureka有两个组件:Eureka Client 和 Eureka Server ,Eureka Server 可以理解为是Eureka的服务端或者注册中心,保存注册的服务信息,Eureka Client可以理解为是Eureka的客户端或者是各个微服务模块,他们需要被其他的微服务模块调用和调用其他微服务的服务,需要将自己的元数据注册进Eureka Server服务端,即注册中心,这个过程也分别叫做服务注册和服务发现。
2、Eureka Client的注册表存放在本地缓存中,这使得Eureka Client每次请求不需要都去Eureka Server拿数据。而Eureka Server是没有本地缓存的,这使得注册表中的数据只能存放在内存中,所以,心跳也只能在内存中完成。
Euraka的主要功能其实当作注册中心使用。但是它还有其他的功能:负载均衡、认证、健康检测等等。
重要的功能有:健康检测和自我保护机制
下面通过代码来分别实现健康检测和自我保护机制。
环境搭建-客户端
yaml文件: spring: application: name: eureka-client eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ healthcheck: enabled: true instance: hostname: STORES lease-expiration-duration-in-seconds: 20 #诉服务端,如果我20s之内没有给你发心跳,就代表我“死”了,将我踢出掉 lease-renewal-interval-in-seconds: 10 #每间隔10s,向服务端发送一次心跳,证明自己依然”存活 启动类: @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) @EnableEurekaClient public class EurekaClientApplication { public static void main(String[] args) { SpringApplication.run(EurekaClientApplication.class, args); } //整合actuator、实现健康检测 @Bean public MyHealthIndicator11 myHealthIndicator(){ return new MyHealthIndicator11(); } }
环境搭建-服务端
yaml: spring: application: name: eureka-service server: port: 8761 eureka: instance: hostname: localhost client: registerWithEureka: false healthcheck: enabled: true fetchRegistry: false serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ server: enable-self-preservation: false eviction-interval-timer-in-ms: 5000 启动类: @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
搭建好环境后,我们看看Eureka的健康检查,Eureka的健康检查是通过整合spring boot- autuator实现的,然后在配置文件中设置healthcheck属性即可。官网中是这么说的:如果只需要开启健康检查,只需要在配置文件中设置healthcheck,如果想自定义实现更多的健康检测功能,需要实现HealthCheckHandle健康检查处理器。这个类的作用其实就是将健康状态保存到内存,状态一改变就重新向服务端注册。
我们自定义一个HealthIndicator和一个HealthCheckHandle的实现类。
HealthIndicator实现类负责每次心跳检测就加一、当为5次后将微服务的健康状态改为DOWN,然后HealthCheckHandle实现类从HealthIndicator实现类中拿到健康状态,重新向服务端注册信息。代码如下:
@Component public class MyHealthIndicator11 implements HealthIndicator { private int healthIndicatorErrorCount; private int healthIndicatorCount; private boolean hasError=false; @Override public Health health(){ if(!hasError){ healthIndicatorCount++; //每检测5次,就返回DOWN if(healthIndicatorCount%2==0){ hasError=true; } }else{ //DOWN计数10次就UP healthIndicatorErrorCount++; if(healthIndicatorErrorCount>10){ hasError=false; healthIndicatorErrorCount=0; } } if(hasError){ return new Health.Builder(Status.DOWN).build(); } return new Health.Builder(Status.UP).build(); } } @Component public class MyHealthHealthCheckHandler implements HealthCheckHandler { @Autowired private MyHealthIndicator11 myHealthIndicator; @Override public InstanceInfo.InstanceStatus getStatus(InstanceInfo.InstanceStatus currentStatus){ Status status=myHealthIndicator.health().getStatus(); if(status== Status.UP){ return InstanceInfo.InstanceStatus.UP; }else{ return InstanceInfo.InstanceStatus.DOWN; } } } @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) @EnableEurekaClient public class EurekaClientApplication { public static void main(String[] args) { SpringApplication.run(EurekaClientApplication.class, args); } //整合actuator、实现健康检测 @Bean public MyHealthIndicator11 myHealthIndicator(){ return new MyHealthIndicator11(); } }
刚开启时
五次心跳时间后
Eureka客户端五次心跳后,这个客户端的服务状态就变为DOWN了,重新向服务端注册,打开localhost:8761查看注册的微服务就能看到改变后的状态。
下面讲一讲Eureka的自我保护机制,这也是Eureak高可用的原因。自我保护机制的意思是Eureka的微服务由于某种原因不可用时,注册中心中的数据不会剔除,Euraka会认为这个微服务在未来某个时间能再可用。
Eureka默认是开启自我保护机制的。如果需要关闭掉,可以使用enable-self-preservation属性关闭。
下面测验一下
Eureka Server端
分别开启服务端和客户端后
关闭客户端,刷新页面后
客户端只要一关闭,马上注册中心中该客户端注册的信息就没有了。
Euraka还有其他的小功能,比如服务端能通过EurekaClient拿到该注册中心中注册的所有相关信息。
@RestController public class EurekaClientController { @Qualifier("eurekaClient") @Autowired private EurekaClient eurekaClient; @RequestMapping("fa") public String serviceUrl() { Set<String> set = eurekaClient.getAllKnownRegions(); Iterator<String> it = set.iterator(); String res = "hello"; while(it.hasNext()){ res = it.next(); break; } return res; } }
1、Eureaka客户端默认是半分钟发送一次心跳。
2、为什么注册服务会很慢?官网中有解释:客户端向服务端注册,需要发送心跳,默认是30秒,在实例、服务器和客户端的本地缓存中都具有相同的元数据之前,客户端无法发现服务,所以,可能需要三次心跳。你可以设置leaseRenewalIntervalInSeconds属性来改变心跳间隔时间,但是建议还是使用默认的30秒
3、刷新客户端:默认情况下Eureka Client是开启刷新功能的。当刷新发生时,客户端将从Eureka服务器注销,可能有一段时间,给定服务的所有实例都不可用,我们可以通过eureka.client.refresh.enable属性关闭自动刷新功能。
借鉴了https://www.cnblogs.com/li3807/p/8676401.html,同时,如有差错,忘不吝赐教!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。