一、概述
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,同时,如有差错,忘不吝赐教!