Renew(服务续约):Eureka Client 在默认情况下每个三十秒会发送一次心跳来进行服务的续约,通过服务的续约来告知Server客户端没有出现故障。如果server在90秒内没有收到Client的心跳,从注册列表中将其剔除。
Fetch Registries--获取服务的注册列表信息:Client从Server获取服务的注册列表信息,并将其缓存到本地,然后他就会查找信息进行远程调用。该注册列表的信息每隔30秒更新一次,更新的信息和Client缓存的信息不同Client会自己处理这些信息。Server和Client之间采用JSON和XML的数据格式进行通信。
整个架构分为两个角色:Eureka Server 和Eureka Client,Eureka Client又分为Application Server和Application Client。
Client向Server注册信息,通过心跳机制来续约服务,如果不能持续续约,那么该客户大约90秒后从Server服务注册列表中剔除。服务的注册列表信息和服务的续约信心都会被复制到集群中的每个Service节点,来自任何区域的Client都可以获取整个系统的服务注册和列表信息。根据这些注册列表信息,Application Client可以远程调用Application Service来消费服务。
Eureka Client一启动(不是启动完成),不是立即向Eureka Server注册,它有一个延迟向服务端注册的时间,通过跟踪源码,可以发现默认的延迟时间为40秒。原因是第一Eureka Server维护每30秒更新的响应缓存, 所以即使实例刚刚注册,它也不会出现在调用/ eureka / apps REST端点的结果中。第二Eureka客户端保留注册表信息的缓存。 该缓存每30秒更新一次(如前所述)。 因 此,客户端决定刷新其本地缓存并发现其他新注册的实例可能需要30秒。刚注册的Eureka Client也不能立即被其他服务调用,因为调用方因为各种缓存没有及时的获取到新的注册列表。
一个新的Eureka Server出现时,它尝试从相邻节点获取所有实例注册表信息。如果从Peer节点获取信息时出现问题,Eureka Serve会尝试其他的Peer节点。如果服务器能够成功获取所有实例,则根据该信息设置应该接收的更新阈值。如果有任何时间,Eureka Serve接收到的续约低于为该值配置的百分比(默认为15分钟内低于85%),则服务器开启自我保护模式,即不再剔除注册列表的信息。这样做的好处就是,如果是Eureka Server自身的网络问题,导致Eureka Client的续约不上,Eureka Client的注册列表信息不再被删除,也就是Eureka Client还可以被其他服务消费。
通俗点的说法就是: 默认情况下,如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,这就可能变得非常危险了----因为微服务本身是健康的,此时本不应该注销这个微服务。
Eureka Server通过“自我保护模式”来解决这个问题----当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。自我保护模式是一种对网络异常的安全保护措施。使用自我保护模式,而已让Eureka集群更加的健壮、稳定。
在Spring Cloud中,可以使用eureka.server.enable-self-preservation=false来禁用自我保护模式。
继续采用上一节搭建的工程,在Eureka Server中采用多文件配置的方式,如下:
application-peer1.yml和application-peer2.yml的配置:
spring: application: name: eurka-server1 profiles: active: peer1 server: port: 8761 eureka: instance: hostname: peer1 client: serviceUrl: defaultZone: http://peer2:8762/eureka/ spring: application: name: eurka-server2 profiles: active: peer2 server: port: 8762 eureka: instance: hostname: peer2 client: serviceUrl: defaultZone: http://peer1:8761/eureka/因为是在本地搭建所以需要修改hosts文件:路径:C:\Windows\System32\drivers\etc
127.0.0.1 peer1 127.0.0.1 peer2Eureka Client的配置:只将服务注册到了peer1。
server: port: 8763 spring: application: name: service-hi eureka: client: serviceUrl: defaultZone: http://peer1:8761/eureka/利用maven将工程打包,打包的时候突然就报错了:
原因在于在pom中配置<parent>时,需指定<relativePath>. 相对路径的默认值是../pom.xml.maven首先会在当前路径下寻找父项目pom.xml,其次会在relativePath下寻找,然后在本地仓库,最后在远程仓库中寻找。我在代码里面是写的<relativePath/>.所以报错就是上面的那样,把这句去掉就可以了。
relativePath的作用:查找顺序:relativePath元素中的地址–本地仓库–远程仓库 <relativePath/>设定一个空值将始终从仓库中获取,不从本地路径获取。
可以参考:史上最全的maven pom.xml文件教程详解
所以在本项目中去掉所有的relativePath标签,子模块也一样:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEASE</version> <!--<relativePath/>--> </parent>重新打包:mvn xlean package
在项目的target目录下出现打好的jar包:
启动命令:
java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1 java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2启动客户端:
在客户端的配置文件中并没有制定向peer2节点注册,但是在两个Eureka Server中都显示其注册了。