Piotr
Piotr

Reputation: 72

How to do Spring-boot configuration for many clients

I am wondering how to resolve problem: I have a spring-boot app on docker that connects to db and some other service. Probably some clients will have db on other urls than the others.

I use spring.datasource.url property to connect to DB. Should I add it to args and use:

    Properties properties = new Properties();
    properties.put("spring.datasource.url", args[1]);
    application.setDefaultProperties(properties);

And something like that will override it ? But every run will need adding DB url. Or use something else?

Upvotes: 1

Views: 401

Answers (3)

Ryan Dawson
Ryan Dawson

Reputation: 12558

If you've got lots of deployments each with their own database then that will take some management one way or another. But you don't want it to require lots of builds of your app - you want to externalise that configuration.

Sorting boot has features for externalising configuration (https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html). The simplest for your case would be to use environment variables that override properties by relaxed binding of names (https://github.com/spring-projects/spring-boot/wiki/Relaxed-Binding-2.0). If app is started with an environment variable named SPRING_DATASOURCE_URL then this value will override what you have in your properties for spring.datasource.url. Your properties file effectively sets a default value that you can override. This is out of the box behaviour for Spring Boot and applies to other properties too (inc all the db ones, though if you've got databases of different types then you'll want to include all the relevant driver jars in your build).

Since you're using docker you can set environment variables in the container at deploy/startup time using a -e parameter. So you can override at deploy time for each deployed instance.

You might well use further layers on top of docker like docker-compose or Kubernetes. Then you might get into setting the environment variables in deployment descriptor files that describe your deployment configuration. But that configuration management question is at a different layer/stage and is no longer part of the build step once you have your config externalised.

Upvotes: 0

Mohammadreza  Alagheband
Mohammadreza Alagheband

Reputation: 2230

datasource could be read as a variable from the docker-compose file:

assume this is your docker-compose file:

version: '2'

services:
  db:
    image: customimage_mysql
    restart: always
    ports:
    - "3306:3306"

  application:
   build: .
   ports:
     - "9111:9111"
   depends_on:
     - db
   links:
     - db
   environment:
     - database.url=jdbc:mysql://mysql-docker-container:3306/spring_app_db?

Now you have 2 options:

  • set different values for databse.url inside docker compose and build image for each app correspondingly
  • set different variables (databse1.url , databse2.url,databse3.url, ...) inside docker-compose file, and reference to them from application.properties:

application.properties

spring.datasource.url=${database.url}
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.generate-ddl=true
spring.jpa.show-sql=true
server.port=9111

Upvotes: 1

Damith
Damith

Reputation: 747

According to the information that you have provided here, the database link should be a configuration to your application. basically you need to have a configurations file

application.properties

And when you want to change the URL, just change it in the configuration file and build.

you can find the documentation here

And moreover if you are using devops environment like kubernetes, you would have to have a config-map and your deployments will get configurations from those config-maps which are like application.properties files.

Upvotes: 0

Related Questions