服务注册的实现

服务注册的实现由类 ConsulServiceRegistry 完成。

类定义

ConsulServiceRegistry 是 consul 中实现服务注册的主要类。定义如下:

public class ConsulServiceRegistry implements ServiceRegistry<ConsulRegistration> {}

ServiceRegistry定义的方法实现

register()方法

@Override
public void register(ConsulRegistration reg) {
    log.info("Registering service with consul: " + reg.getService());
    try {
        // 调用ConsulClient做注册
        client.agentServiceRegister(reg.getService(), properties.getAclToken());
        // 如果开启心跳,则交给ttlScheduler
        if (heartbeatProperties.isEnabled() && ttlScheduler != null) {
            ttlScheduler.add(reg.getInstanceId());
        }
    }
    catch (ConsulException e) {
        // 如果注册出错,检查是否设置了 failFast
        // 如果要求 failFast,则抛异常要求退出
        if (this.properties.isFailFast()) {
            log.error("Error registering service with consul: " + reg.getService(), e);
            ReflectionUtils.rethrowRuntimeException(e);
        }
        // 如果不要求 failFast,则打日志警告
        log.warn("Failfast is false. Error registering service with consul: " + reg.getService(), e);
    }
}

deregister()方法

@Override
public void deregister(ConsulRegistration reg) {
    if (ttlScheduler != null) {
        // 移除心跳
        ttlScheduler.remove(reg.getInstanceId());
    }
    if (log.isInfoEnabled()) {
        log.info("Deregistering service with consul: " + reg.getInstanceId());
    }
    // 调用ConsulClient做注销
    client.agentServiceDeregister(reg.getInstanceId());
}

setStatus()方法

@Override
public void setStatus(ConsulRegistration registration, String status) {
    if (status.equalsIgnoreCase(OUT_OF_SERVICE.getCode())) {
        // 如果是 OUT_OF_SERVICE,开启维护模式
        client.agentServiceSetMaintenance(registration.getInstanceId(), true);
    } else if (status.equalsIgnoreCase(UP.getCode())) {
       // 如果是 UP,取消维护模式 client.agentServiceSetMaintenance(registration.getInstanceId(), false);
    } else {
        throw new IllegalArgumentException("Unknown status: "+status);
    }

}

getStatus()方法

public Object getStatus(ConsulRegistration registration) {
    String serviceId = registration.getServiceId();
    // 调用ConsulClient获取健康检查的信息
    Response<List<Check>> response = client.getHealthChecksForService(serviceId, QueryParams.DEFAULT);
    List<Check> checks = response.getValue();

    for (Check check : checks) {
        if (check.getServiceId().equals(registration.getInstanceId())) {
            // 如果有信息表明当前服务是维护状态,则返回OUT_OF_SERVICE
            if (check.getName().equalsIgnoreCase("Service Maintenance Mode")) {
                return OUT_OF_SERVICE.getCode();
            }
        }
    }

    // 否则返回UP
    return UP.getCode();
}