4

We are trying to register a spring-cloud-consul application with consul on GCP compute engine, where it is able to register the application with the consul, but there are two problems we are facing with the application. Below is bootstrap.yaml and server.yaml for the application,

application.yaml

server:
  port: 10003
spring:
  application:
    name: hello-service
  cloud:
    consul:
      enabled: true
    inetutils:
      useOnlySiteLocalInterfaces: true
  endpoints:
    actuator:
      sensitive: false

bootstrap.yaml

spring:
  cloud:
    consul:
      enabled: true
      host: 10.160.0.18
      port: 8500
      discovery:
        prefer-ip-address: true
  1. Consul is not able to call health-check on compute engine, possibly because it's registered on the internal domain name of the instance.

service with consul: NewService{id='hello-service-10003', name='hello-service', tags=[secure=false], address='consul-app-test.c.name-of-project.internal', meta=null, port=10003, enableTagOverride=null, check=Check{script='null', interval='10s', ttl='null', http='http://consul-app-test.c.name-of-project.internal:10003/actuator/health', method='null', header={}, tcp='null', timeout='null', deregisterCriticalServiceAfter='null', tlsSkipVerify=null, status='null'}, checks=null}

  1. Application, not de-registering from the consul. We have stopped the application still it shows on consul UI.
Nitishkumar Singh
  • 1,781
  • 1
  • 15
  • 33

2 Answers2

2

I made a few changes in the application.yaml and bootstrap.yaml which worked for me.

application.yaml

spring:
  application:
    name: hello-service
  cloud:
    consul:
      discovery:
        instanceId: ${spring.application.name}:${random.value}
        health-check-critical-timeout: 3m
        prefer-ip-address: true # disable if we want to use google cloud internal DNS 

bootstrap.yaml

spring:
  cloud:
    consul:
      enabled: true
      host: 10.160.0.18
      port: 8500
Nitishkumar Singh
  • 1,781
  • 1
  • 15
  • 33
0

if you use version 2.1.2 like me: org.springframework.cloud:spring-cloud-starter-consul-discovery:2.1.2.RELEASE

you can set:

spring:

  cloud:
    consul:
      host: localhost #  consul的地址
      port: 8500 # consul 的端口
      discovery:
        prefer-ip-address: true  # // This must be matched
        tags: version=1.0
        instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}
        healthCheckPath: /actuator/health # 服务做健康检查的端口
        healthCheckInterval: 15s  # 服务健康检查的周期
        healthCheckTimeout: 60s # 服务检查是的timeout时长
        healthCheckCriticalTimeout: 5m # 服务健康检查失败5分钟后,删除服务

and you can look the source code in ConsulDiscoveryProperties:

@ConfigurationProperties("spring.cloud.consul.discovery")
public class ConsulDiscoveryProperties {

……

    /** Is service discovery enabled? */
    private boolean enabled = true;

    /** Alternate server path to invoke for health checking. */
    private String healthCheckPath = "/actuator/health";

    /** Custom health check url to override default. */
    private String healthCheckUrl;

    /** How often to perform the health check (e.g. 10s), defaults to 10s. */
    private String healthCheckInterval = "10s";

    /** Timeout for health check (e.g. 10s). */
    private String healthCheckTimeout;

    /**
     * Timeout to deregister services critical for longer than timeout (e.g. 30m).
     * Requires consul version 7.x or higher.
     */
    private String healthCheckCriticalTimeout;
……
Bruce
  • 1,718
  • 20
  • 15