irpas技术客

Eureka的理解和使用_正经人z.

网络 3344

一、概述

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://·/li3807/p/8676401.html,同时,如有差错,忘不吝赐教!


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #Eureka的理解和使用 #client # #Eureka #Server