user7069368
user7069368

Reputation:

Microservice can't reach config service in docker-compose

I currently have two microservices:
- service - port 8080, this microservice tries to fetch config from the other microservice.
- config - port 8888, this microservice is supposed to provide config.

For some reason my service is unable to fetch configuration from config microservice.
My config microservice should work because I can curl localhost:8888/service/default on my machine I receive:

{"name":"service","profiles":["default"],"label":null,"version":null,"state":null,"propertySources":[{"name":"classpath:/shared/service.yml","source":{"server.port":8080,"spring.security.user.password":"admin"}},{"name":"classpath:/shared/service.yaml","source":{"server.port":8080,"spring.security.user.password":"admin"}}]}

Error received (full)

service | 2019-06-06 21:31:06.721  INFO 1 --- [main] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at : http://config:8888   
service | 2019-06-06 21:31:06.894  INFO 1 --- [main] c.c.c.ConfigServicePropertySourceLocator : Connect Timeout Exception on Url - http://config:8888. Will be trying the next url if available   
service | 2019-06-06 21:31:06.904 ERROR 1 --- [main] o.s.boot.SpringApplication               : Application run failed

Docker-compose.yaml

version: '3.7'
services:
  config:
    container_name: config
    build: ./config
    ports:
      - 8888:8888

  service:
    container_name: service
    build: ./service
    ports:
      - 8080:8080
    depends_on:
      - config

Service Dockerfile:

FROM openjdk:8-jdk-alpine
ADD target/service.jar /app.jar
CMD [ "java", "-Xmx200m", "-jar", "/app.jar" ]
EXPOSE 8080

Service bootstrap.yaml

spring:
  application:
    name: service
  cloud:
    config:
      uri: http://config:8888
      fail-fast: true

service.yaml (has service configuration)

server:
  port: 8080

spring:
  security:
    user:
      password: admin # doesnt set since no connection

Config Dockerfile

FROM openjdk:8-jdk-alpine
ADD target/config.jar /app.jar
CMD [ "java", "-Xmx200m", "-jar", "/app.jar" ]
EXPOSE 8888

Config application.yaml

spring:
  application:
    name: config
  profiles:
    active: composite
  cloud:
    config:
      server:
        composite:
          - type: native
            search-locations: classpath:/shared

server:
  port: 8888

shared/service.yaml (has service configuration)

server:
  port: 8080

spring:
  security:
    user:
      password: admin # doesnt set since no connection

Any ideas?

I found some similar issues, although they only had issues with their URI, mine is set correctly. Microservice can not reach to Config Server on Docker Compose
Docker - SpringConfig - Connection refused to ConfigServer

Upvotes: 1

Views: 1253

Answers (1)

b0gusb
b0gusb

Reputation: 4731

When one service depends on another you have to make sure that the latter is fully started before connecting to it.

In your case, most probably, config is started but not ready (context started) at the time service is run. As @Ganesh Karewad and @asolanki pointed out, a solution is to implement a reconnection logic. Another solution is to make sure config is initialized and accepting connections before you run service.

You can achieve that with a script that waits until the config app is up. In alternative you could configure the config container with a health check command and after you start it, wait until it is marked as healthy. Then you can run the service container.

Similar issue discussed here and here

Hope that helps.

Upvotes: 1

Related Questions