spring-cloud / spring-cloud-consul

Spring Cloud Consul
http://cloud.spring.io/spring-cloud-consul/
Apache License 2.0
808 stars 540 forks source link

Serivices won't register automatically when consul-server is started after starting spring-cloud-consul #774

Open cooolcai opened 2 years ago

cooolcai commented 2 years ago

Serivices wont register automatically when consul-server is started after starting spring-cloud-consul

version:spring-cloud-consul-discovery 3.1.0

I already configured spring.cloud.consul.discovery.heartbeat like this

spring.cloud.consul.discovery.heartbeat.enabled: true;
spring.cloud.consul.discovery.heartbeat.reregisterServiceOnFailure: true;
spring.cloud.consul.discovery.heartbeat.ttl: 10s;

then I checked the source code and  found a bug. The bug is come from spring-cloud-consul-discovery package's class org.springframework.cloud.consul.serviceregistry.ConsulServiceRegistry. In this method public void register(ConsulRegistration reg),the original code is:

@Override
    public void register(ConsulRegistration reg) {
        log.info("Registering service with consul: " + reg.getService());
        try {
            this.client.agentServiceRegister(reg.getService(), this.properties.getAclToken());
            NewService service = reg.getService();
            if (this.heartbeatProperties.isEnabled() && this.ttlScheduler != null && service.getCheck() != null
                    && service.getCheck().getTtl() != null) {
                this.ttlScheduler.add(reg.getService());
            }
        }
        catch (ConsulException e) {
            if (this.properties.isFailFast()) {
                log.error("Error registering service with consul: " + reg.getService(), e);
                ReflectionUtils.rethrowRuntimeException(e);
            }
            log.warn("Failfast is false. Error registering service with consul: " + reg.getService(), e);
        }
    }

than I changed it like this:

  @Override
  public void register(ConsulRegistration reg) {
    log.info("Registering service with consul: " + reg.getService());
    try {
      this.client.agentServiceRegister(reg.getService(), this.properties.getAclToken());

    }
    catch (ConsulException e) {
      if (this.properties.isFailFast()) {
        log.error("Error registering service with consul: " + reg.getService(), e);
        ReflectionUtils.rethrowRuntimeException(e);
      }
      log.warn("Failfast is false. Error registering service with consul: " + reg.getService(), e);
    }

    try {
      NewService service = reg.getService();
      if (this.heartbeatProperties.isEnabled() && this.ttlScheduler != null && service.getCheck() != null
          && service.getCheck().getTtl() != null) {
        this.ttlScheduler.add(reg.getService());
      }
    }
    catch (ConsulException e) {
      if (this.properties.isFailFast()) {
        log.error("Error registering service with consul: " + reg.getService(), e);
        ReflectionUtils.rethrowRuntimeException(e);
      }
      log.warn("Failfast is false. Error registering service with consul: " + reg.getService(), e);
    }
  }

Now when services is not registered successfully,the method will go to an exception,than I will add the registered services into the scheduler. Maybe you can fix this,thank you.

spencergibb commented 1 year ago

PRs welcome

Saravana-PS commented 1 year ago

Hey @spencergibb , I would like to work on this issue. Can you please assign it on me?

Saravana-PS commented 1 year ago

Hey @spencergibb , I have few queries regarding the local setup of the project. Can we talk about this in a slack kinda environment?