3.1 Eureka的核心类
3.1.1 InstanceInfo
Eureka使用InstanceInfo(com/netflix/appinfo/InstanceInfo.java)来代表注册的服务实例,其主要字段如表3-1所示。
表3-1 InstanceInfo类字段说明
可以看到InstanceInfo里既有metadata,也有dataCenterInfo,还有一个比较重要的leaseInfo,用来标识该应用实例的租约信息。
3.1.2 LeaseInfo
Eureka使用LeaseInfo(com/netflix/appinfo/LeaseInfo.java)来标识应用实例的租约信息,其字段如表3-2所示。
表3-2 LeaseInfo类字段说明
这些参数主要用于标识应用实例的心跳情况,比如约定的心跳周期,租约有效期,最近一次续约的时间等。
3.1.3 ServiceInstance
ServiceInstance(org/springframework/cloud/client/ServiceInstance.java)是Spring Cloud对service discovery的实例信息的抽象接口,约定了服务发现的实例应用有哪些通用的信息,其方法如表3-3所示。
表3-3 ServiceInstance接口方法列表
由于Spring Cloud Discovery适配了Zookeeper、Consul、Netflix Eureka等注册中心,因此其ServiceInstance定义更为抽象和通用,而且采取的是定义方法的方式。Spring Cloud对该接口的实现类为EurekaRegistration(org/springframework/cloud/netflix/eureka/serviceregistry/EurekaRegistration.java), EurekaRegistration实现了ServiceInstance接口,同时还实现了Closeable接口,它的作用之一就是在close的时候调用eurekaClient.shutdown()方法,实现优雅关闭Eureka Client。
3.1.4 InstanceStatus
InstanceStatus用于标识服务实例的状态,它是一个枚举,定义如下:
public enum InstanceStatus { UP, // Ready to receive traffic DOWN, // Do not send traffic- healthcheck callback failed STARTING, // Just about starting- initializations to be done - do not // send traffic OUT_OF_SERVICE, // Intentionally shutdown for traffic UNKNOWN; public static InstanceStatus toEnum(String s) { if (s ! = null) { try { return InstanceStatus.valueOf(s.toUpperCase()); } catch (IllegalArgumentException e) { // ignore and fall through to unknown logger.debug("illegal argument supplied to InstanceStatus. valueOf: {}, defaulting to {}", s, UNKNOWN); } } return UNKNOWN; } }
从定义可以看出,服务实例主要有UP、DOWN、STARTING、OUT_OF_SERVICE、UNKNOWN这几个状态。其中OUT_OF_SERVICE标识停止服务,即停止接收请求,处于这个状态的服务实例将不会被路由到,经常用于升级部署的场景。