欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

Eureka的服务自我保护

发布时间:2024/4/13 38 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Eureka的服务自我保护 小编觉得挺不错的,现在分享给大家,帮大家做个参考.
一个名字叫SPRINGCLOUD-EUREKA-CONSUMER,一个名字叫SPRINGCLOUD-EUREKA-PROVIDER,然后后面显示的是服务的详细信息,他的IP,服务名称,以及端口,然后UP是正常的状态,这两个服务我们都已经启动了,然后我们往下看,什么是自我保护模式,自我保护的条件是什么,一般情况下,微服务在Eureka注册后,会每30秒发送心跳包,Eureka通过心跳包来判断服务是否健康,同时会定期删除超过90秒没有发送心跳的服务,我们也拿到这段话来说一下,现在我服务启动了,在这段列表当中,我们是可以看到这个服务是正常的,那么注册中心怎么知道这个服务是正常的呢,其实就是我们已注册的服务,就是每30秒发送一个心跳包,健康检查,如果他能够收到30秒的心跳包,说明这个服务是正常的,但是如果超过90秒,没有收到服务的心跳包,那他就认为这个服务就已经出问题了,然后他会删除90秒没有发送心跳的服务,我们来做一个演示,我们演示的可能会跟我们看到的不一样,我们首先来关掉服务,现在我把这个关掉,Provider和Consumer关掉,那么关掉以后,现在也就意味着,也就是没有向我们的Eureka服务发送心跳包的,服务都停了,我们再来刷新http://10.40.8.152:8761/现在还有,别着急,90秒内,那我们先等90秒,其实超过90秒也不会真正的删除,为什么呢,有两种情况会导致Eureka Server收不到微服务的心跳,我们要解释一下,他不是不删,只是有这么几种情况下的,并不会从服务当中把服务列表中的删除掉的,但是像你在启动的时候,你在关闭的时候,忘记注册中心了,我现在就要关闭这个服务,我要做优雅停服的事情以后,配置以后,他才会删除,就是没有设置优雅停服的,90秒以后他也不会删除服务呢,是有这么几种情况的,我们来看,有两种情况会导致收不到微服务心跳的情况,第一个是微服务自身的原因,你像我们现在就是微服务自身的原因,直接把微服务停掉了,90秒应该差不多了,还没到,我们再等一下,还有一种是微服务与Eureka之间出现了网络故障,我们看一下,通常微服务的自身故障,只会导致个别服务出现,现在Eureka Server,他必须要去区分一下,这个服务,在90秒内,已经过了90秒了,没有收到心跳包,是因为什么,是因为单节点的故障,还是因为网络故障,那么他是怎么区分的呢,他是这么区分的,一般自身故障,只会导致个别服务出现故障,一般不会出现大面积的故障,而网络故障通常会导致Eureka Server会在短时间内无法收到大量的心跳,所以是会大批量的收不到心跳包的方式区分,甚至你的单节点故障,还是因为网络阻塞而引起的,90秒应该差不多了,出来了,看到了吗,会显示红色的一段话,这个我们也说过,我们将来会讲的,我们这块讲的内容,那么红色的字体是什么意思呢,我们而已可以尝试的翻译一下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可能不正确的声称,当他不在时,就是更新的比阀值小,所以为了安全起见,实例不会过期,就是这句话,他说,出现服务的数量,比更的阀值要小,那么这个阀值是什么呢,这个阀值就是我们要说的,15分钟之内是否低于85%,也就是说如果在15分钟之内,以服务没有收到心跳包的,数量达到总服务数量的85%以上,他认为是网络故障,如果低于85,那你看,一共才有四个服务,四个服务当中我停掉了两个,那么出现故障是85%,那么50%是远远低于85%,他不会认为这是一个网络故障,它会认为你是一个节点的故障,那么如果是节点的故障,他觉得你未来的节点是可以修复的,修复了启动以后,你可以继续服务了,所以他把出现节点故障的服务,做了一个保留,这个保留是什么呢,就是自我保护,现在你出现故障的数量远远低于阀值,所以为了安全起见,这个实例不会过期,他在这里还是把服务给保存着,明白这意思了吧,明白这句话了吧,这个阀值多少呢,就是85%,然后我们再看,Eureka Server在运行时,会统计心跳失败的比例,在15分钟内是否低于85%,这种算法叫做Eureka Server的自我保护模式,所以现在我们把这两个服务关闭掉了,所以并没有达到85%的阀值,所以他就会对出现故障的服务,做了自我保护,咱们再看

因为同时保留好数据与坏数据,总比丢掉任何数据更好,当网络故障恢复后,Eureka节点会退出自我保护模式,这句话什么意思呢,我们讲过Eureka和Zookeeper的区别,讲CAP对比的时候,拿CAP原则对比的时候,Eureka和Zookeeper都是支持分区容错的,那么Eureka他在做分区容错的时候,一旦有节点出现故障了,会将出现故障的节点做一个保存,无论是好数据还是坏数据,在Eureka的Server当中,他都会做一个保存,以便你出现故障的服务,进行服务的处理,所以说,在这儿,保留了好数据和坏数据,如果你的服务关闭掉了,就是坏数据,比丢掉任何数据都好,因为CAP里的P的模式,不像Zookeeper里采用的是Leader,主从复制的这样一个方式,他不是,它是通过节点与节点之间的通信,一旦你服务当中某个服务出现问题了,我暂时不能通信了,他采用的是这样的一个机制,还有一个原因就是,Eureka还有客户端缓存功能,之所以要对他做自我保护,还有一个原因就是缓存功能,也就是我们微服务的功能,你这个出现问题的节点,可能节点出现问题了,但是注册到我的Eureka当中,我会缓存你这个服务信息,这样即便你这个节点出现故障了,由于我Eureka注册中心里,缓存你之前注册过来的信息,我仍然可以对外界提供服务,所以即便Eureka所有的服务都宕机失效了,微服务的Provider和Consumer还是可以正常通信的,是这样的一个原因,正因为他有缓存的功能,所以正因为有这样的一个特点,从CAP角度来看,服务可用性的一个特点,那么这里我们要注意,当你坏掉的节点,恢复了,退出自我保护模式,那我们现在就来看一下,我们现在这两个服务还是保护模式的,那我们把这两个服务重新启动,我们先去启动Provider,我们再来启动Consumer,那我们这两个实例一启动,服务一启动,是不是又能向注册中心发送心跳包了,能够发送心跳包,他收到这个心跳包以后,发现这个服务又正常了,他就会对这两个自我保护的服务呢,就会退出自我保护,解除自我保护,因为他有每隔30秒发送心跳,启动30秒才能够发包,我们稍等一下吧,我们先继续往下说,所以我们主要是讲解Eureka注册中心,它是怎么来管理我们服务的,当服务出现问题了,而且不是大面积的网络故障的,他对有问题的服务做一个自我保护,那么他又是怎么区分网络故障和单节点故障的呢,通过一个阀值,什么阀值呢,在15分钟内是否低于85%的服务收到他的心跳包,我们再来刷新,那么我的服务在退出的时候,就是我的服务在退出的时候,能不能不让他去启动自我保护呢,当然是可以了,那么这个也是我下节课要讲的,我们服务在关闭的时候,如何去退出自我保护模式,不让他启动自我保护模式呢,这个时候又能向注册中心发送心跳包了,上面那句话是不是没有了,表示了这两个服务已经退出了自我保护模式,就是什么情况下回启动自我保护,为什么要启动自我保护模式的一个讲解

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.learn.cloud</groupId><artifactId>springcloud-eureka-server</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.12.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties> <dependencyManagement><dependencies><dependency> <groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Dalston.SR1</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka-server</artifactId><version>1.4.2.RELEASE</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency></dependencies><!-- 这个插件,可以将应用打包成一个可执行的jar包 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project> server.port=8761 eureka.instance.hostname=eureka-server#spring.application.name=eureka #eureka.server.evictionIntervalTimerInMs=60000 eureka.client.serviceUrl.defaultZone=http://admin:1234@localhost:8761/eureka #eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka eureka.client.registerWithEureka=false eureka.client.fetchRegistry=false#eureka.server.enableSelfPreservation=truesecurity.basic.enabled=true security.user.name=admin security.user.password=1234eureka.datacenter=cloud eureka.environment=product#eureka.server.enable-self-preservation=false <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.learn.cloud</groupId><artifactId>springcloud-eureka-provider</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.12.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties> <dependencyManagement><dependencies><dependency> <groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Dalston.SR1</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><!-- <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency> --></dependencies><!-- 这个插件,可以将应用打包成一个可执行的jar包 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project> server.port=9090 eureka.client.serviceUrl.defaultZone=http://admin:1234@localhost:8761/eureka spring.application.name=springcloud-eureka-provider eureka.instance.prefer-ip-address=true eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}} <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.learn.cloud</groupId><artifactId>springcloud-eureka-consumer</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.12.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties> <dependencyManagement><dependencies><dependency> <groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Dalston.SR1</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency></dependencies><!-- 这个插件,可以将应用打包成一个可执行的jar包 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project> server.port=9091 eureka.client.serviceUrl.defaultZone=http://admin:1234@localhost:8761/eureka spring.application.name=springcloud-eureka-consumer eureka.instance.prefer-ip-address=true eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}

 

总结

以上是生活随笔为你收集整理的Eureka的服务自我保护的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。