Eureka细节详解
Eureka元数据详解
Eureka的元数据有两种,标准元数据和自定义元数据。
标准元数据:主机名、IP地址、端口号等信息。这些信息都会被发布在服务注册表中,用于服务之间的调用。
自定义元数据:可以使用 eureka.instance.metadata-map
配置,符合 KEY/VALUE
存储格式。
这些元数据可以在远程客户端中访问。
eureka:
instance:
prefer-ip-address: true
metadata-map:
# 自定义元数据(kv自定义)
cluster: cl1
region: rn1
@Autowired
private DiscoveryClient discoveryClient;
@Test
public void test() {
// 从EurekaServer获取指定微服务实例
List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("lagou-service-resume");
// 循环打印每个微服务实例的元数据信息
for (int i = 0; i < serviceInstanceList.size(); i++) {
ServiceInstance serviceInstance = serviceInstanceList.get(i);
System.out.println(serviceInstance);
}
}
元数据如下:
Eureka客户端详解
服务提供者和服务消费者都为Eureka客户端。需要向EurekaServer注册服务。
服务提供者需完成服务续约(心跳)、注册服务操作。
服务注册(服务提供者)
(1)导入 eureka-client
依赖坐标,配置Eureka服务注册中心地址。
(2)服务在启动时会向注册中心发起注册请求,携带服务元数据信息。
(3)Eureka注册中心会把服务的信息保存在Map中。
服务续约(服务提供者)
服务每隔30秒会向注册中心续约(心跳)一次(也称为报活),如果没有续约,租约会在90秒后到期,然后服务就会失效。
每隔30秒的续约操作称之为心跳检测。
#向Eureka服务中⼼集群注册服务
eureka:
instance:
# 租约续约间隔时间,默认30秒
lease-renewal-interval-in-seconds: 30
# 租约到期,服务时效时间,默认值90秒,服务超过90秒没有发⽣⼼跳,EurekaServer会将服务从列表移除
lease-expiration-duration-in-seconds: 90
获取服务列表(服务消费者)
每隔30秒服务会从注册中心拉取一份服务列表,这个时间可以通过配置修改。
#向Eureka服务中⼼集群注册服务
eureka:
client:
# 每隔多久拉取⼀次服务列表
registry-fetch-interval-seconds: 30
(1) 服务消费者启动时,会从Eureka Server服务列表中获取只读备份,缓存到本地;
(2)每隔30秒,会重新获取并更新数据;
(3)每隔30秒的时间,可以通过配置 eureka.client.registry-fetch-interval-seconds
修改。
Eureka服务端详解
服务下线
(1)当服务正常关闭操作时,会发送服务下线的rest请求给EurekaServer。
(2)服务中心接受请求后,将该服务置为下线状态。
失效剔除
Eureka Server会定时进行检查(通过配置间隔值: eureka.server.eviction-interval-timer-in-ms
,默认为 60s
),如果发现客户端实例在一定时间内没有发送心跳(客户端配置的 eureka.instance.lease-expiration-duration-in-seconds
,默认值为 90s
),则会注销实例。
自我保护
服务提供者会向服务注册中心注册自己,并会在每隔30s向注册中心发送心跳进行报活(心跳检测)操作。
但是,如果在心跳检测过程中,假如服务提供者和注册中心之间的网络存在问题(不代表服务提供者不可用,不代表服务消费者无法访问到服务提供者),导致在15分钟内85%的客户端节点没有正常的心跳,那么Eureka就会认为客户端与注册中心出现了网络故障,Eureka Server就会自动进入自我保护机制。
为什么会有自我保护机制: 默认情况下,如果Eureka Server在一定时间内(默认90秒)没有收到某个微服务实例的心跳,Eureka Server将会移除该实例。 但是当网络分区故障发生时,微服务与Eureka Server之间是无法通信,但是微服务本身是正常运行,此时不应该移除这个微服务,所以引入了自我保护机制。
当处于自我保护模式时,服务注册中心页面会显示如下提示信息:
当处于自我保护模式时,
(1)不会剔除任何服务实例(可能是服务提供者和EurekaServer之间的网络问题),从而保证大多数服务依然可用。
(2)Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其他节点上,保证当前节点依然可用。当网络稳定时,当前Eureka Server新的注册信息会被同步到其他的节点上。
(3)在Eureka Server工程的中可以通过配置 eureka.server.enable-self-presevation
自我保护的关闭,默认是打开的。(建议生产环境中打开自我保护机制)。
eureka:
server:
enable-self-preservation: false # 关闭⾃我保护模式(缺省为打开)