eureka自我保护机制
1.默认情况下EurekaClient定时(30秒)向EurekaServer端发送心跳包(来确保EurekaClient是否停止)
2.如果Eureka在server端在一定时间内(默认90秒)没有收到EurekaClient发送心跳包,便会直接从服务注册列表中剔除该服务
3.如果Eureka 开启了自我保护模式/机制, 那么在短时间(90秒中)内丢失了大量的服务实例跳,这时候EurekaServer会开启自我保护机制,不会剔除该服务(该现象可能出现在如果网络不通或者阻塞) 因为客户端还能正常发送心跳,只是网络延迟问题,而保护机制是为了解决此问题而产生的
4.自我保护是cap里的ap分支,提高可用性和分区容错性
CAP:三者存在其二
c:一致性 同一时间,数据保持不变
a:可用性 正常时间,服务一直可以使用
p:分区容错性 当出现分区故障时候,一致性或者可用性存活其一
eg:eureka的ap保护机制,当某个客户端服务90秒后没有发送心跳,eureka server端不会立即销毁,会保留该客户端服务,并提示红字error信息
如下是关闭自我保护时,如果client端停下,就会踢掉
取消自我保护机制,自己设置超时时间(默认90秒)和心跳时间(默认30秒)
在你的eureka server微服务模块的application.yml文件中配置
server: #关闭自我保护 enable-self-preservation: false #设置超时时间为2秒,2秒后收不到心跳包,就表示超时 eviction-interval-timer-in-ms: 2000
在你的eureka client微服务模块的application.yml文件中配置
instance: #表示client端向server端发送心跳包的时间为1秒(默认30秒) lease-renewal-interval-in-seconds: 1 #表示server端从收到最后一次心跳开始等待的时间为2秒(默认90秒) #超时就踢出client端 lease-expiration-duration-in-seconds: 2
配置eureka集群
只需要在对应的application.yml文件中,将eureka:client: service-url :defaultZone 中配置你要相互注册的服务模块
eg:9002与9001模块相互注册
server: port: 9002 #配置eureka eureka: instance: hostname: eureka9002.com #服务实例名 client: #配置 不向注册中心 注册自己 register-with-eureka: false #配置 自己就是注册中心 作用是维护注册服务实例 不需要去检索服务 fetch-registry: false service-url: #设置交互模块, 查询服务和注册服务都需要依赖这个地址 #将该模块注册到9001 server (相互注册) defaultZone: http://eureka9001.com:9001/eureka/
DiscoveryClient获取eureka server上的注册服务
对应controller层
@GetMapping("/member/consumer/discovery")
public Object discovery(){
//获取eureka server上的注册服务
List<String> services = discoveryClient.getServices();
for (String service : services) {
log.info("服务名={}",service);
List<ServiceInstance> instances = discoveryClient.getInstances(service);
for (ServiceInstance instance : instances) {
log.info("id={},host={},port={},uri={}",
instance.getServiceId(),instance.getHost(),instance.getPort(),instance.getUri());
}
}
return discoveryClient;
}
主要返回对应eureka server上的注册服务
后台 对应log.info()