重新定义Spring Cloud实战
上QQ阅读APP看书,第一时间看更新

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标识停止服务,即停止接收请求,处于这个状态的服务实例将不会被路由到,经常用于升级部署的场景。