你必须懂也可以懂的微服务系列二:服务反注册

1.前言

你必须懂也可以懂的微服务系列一:服务注册一文中介绍了应用程序在启动过程中会调用注册中心提供的服务注册接口,将应用名、ip、端口注册到注册中心。

在微服务中仅仅有服务注册功能是远远不够的,因为应用系统往往会面临需求版本发布,在需求发版过程中注册中心还保留应用信息的话,就会导致服务调用者出现偶发调用失败情况,因此当应用程序停机的时候,需要将应用信息进行反注册。

2.服务反注册

2.1 定义销毁方法

ConsulAutoServiceRegistration继承AbstractAutoServiceRegistrationAbstractAutoServiceRegistration中声明了销毁方法

@PreDestroy
public void destroy() {
    stop();
}
复制代码

@PreDestroy标注的方法会在应用程序关闭的时候被回调

2.2 服务注册表反注册服务

@Override
public void deregister(ConsulRegistration reg) {
    if (this.ttlScheduler != null) {
        this.ttlScheduler.remove(reg.getInstanceId());
    }
    if (log.isInfoEnabled()) {
        log.info("Deregistering service with consul: " + reg.getInstanceId());
    }
    this.client.agentServiceDeregister(reg.getInstanceId(), this.properties.getAclToken());
}
复制代码

2.3 发起服务反注册请求

public Response<Void> agentServiceDeregister(String serviceId, String token) {
    UrlParameters tokenParam = token != null ? new SingleUrlParameters("token", token) : null;
    HttpResponse httpResponse = this.rawClient.makePutRequest("/v1/agent/service/deregister/" + serviceId, "", new UrlParameters[]{tokenParam});
    if (httpResponse.getStatusCode() == 200) {
        return new Response((Object)null, httpResponse);
    } else {
        throw new OperationException(httpResponse);
    }
}
复制代码

指定服务id,调用/v1/agent/service/deregister/service-id 接口进行服务反注册。因此要求注册到注册中心的服务的id必须是唯一的,否则在反注册的时候可能会反注册掉多余的服务