spring-cloud / spring-cloud/spring-cloud-consul

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

Open
#774 3 comments 0 reactions 1 assignee View on GitHub

@Saravana-PS is already working on this.

Since Jun 21, 2023.

enhancement help wanted
Dominant language
Java
Stars
822
Forks
539
Avg merge
9h 31m
Merged PRs (30d)
7

Description

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.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.