如何为许多客户端进行Spring-boot配置

时间:2018-09-11 11:30:16

标签: spring spring-boot

我想知道如何解决问题:我在docker上有一个spring-boot应用程序,该应用程序连接到db和其他服务。 可能有些客户端在其他URL上将拥有数据库,而不是其他URL。

我使用spring.datasource.url属性连接到数据库。我应该将其添加到args并使用:

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

这样的东西会覆盖它吗?但是每次运行都需要添加数据库URL。还是使用其他东西?

3 个答案:

答案 0 :(得分:1)

数据源可以从docker-compose文件中作为变量读取:

假设这是您的docker-compose文件:

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?
  

现在您有2个选择:

     
      
  • 为docker内部的databse.url设置不同的值,以分别为每个应用程序构建图像和构建图像
  •   
  • 在docker-compose文件中设置不同的变量(databse1.url,databse2.url,databse3.url等),并从中引用它们   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

答案 1 :(得分:0)

根据您在此处提供的信息,数据库链接应该是您的应用程序的配置。基本上,您需要一个配置文件

  

application.properties

当您要更改URL时,只需在配置文件中进行更改并构建即可。

您可以找到文档here

此外,如果您使用的是诸如kubernetes之类的devops环境,则必须拥有一个config-map,并且您的部署将从这些config-map中获取配置,例如application.properties文件。

答案 2 :(得分:0)

如果您有很多部署,每个部署都有自己的数据库,那么这将需要某种管理方式。但是,您不希望它需要大量的应用程序构建-您想要外部化该配置。

排序启动具有用于外部化配置(https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html)的功能。对于您而言,最简单的方法是使用环境名称,这些环境变量通过宽松的名称绑定(https://github.com/spring-projects/spring-boot/wiki/Relaxed-Binding-2.0)覆盖属性。如果应用程序使用名为SPRING_DATASOURCE_URL的环境变量启动,则此值将覆盖spring.datasource.url属性中的值。您的属性文件有效地设置了可以覆盖的默认值。这对于Spring Boot来说是开箱即用的行为,并且也适用于其他属性(包括所有db属性,尽管如果您拥有不同类型的数据库,则需要在构建中包括所有相关的驱动程序jar)。

由于使用的是docker,因此可以在部署/启动时使用-e参数在容器中设置环境变量。因此,您可以在部署时为每个已部署的实例覆盖。

您可能会在Docker之上使用其他层,例如docker-compose或Kubernetes。然后,您可能需要在描述您的部署配置的部署描述符文件中设置环境变量。但是该配置管理问题位于不同的层/阶段,并且一旦外部化了配置,就不再是构建步骤的一部分。