Quelle est la différence entre mettre une propriété sur application.yml ou bootstrap.yml dans Spring Boot?

251

Quelle est la différence entre mettre une propriété sur application.yml ou bootstrap.yml dans Spring Boot? Dans le cas logging.config, l'application fonctionne différemment.

Rys
la source
14
bootstrap.yml est autant que je peux voir spécifique à [ spring-cloud-config] ( cloud.spring.io/spring-cloud-config/… )) et c'est la configuration utilisée pour trouver la bonne configuration. Donc, la configuration est probablement chargée avant application.properties/yaml
zapl

Réponses:

297

Je viens de demander aux Spring Cloudgars et j'ai pensé que je devrais partager les informations que j'ai ici.

bootstrap.ymlest chargé avant application.yml.

Il est généralement utilisé pour les éléments suivants:

  • lorsque vous utilisez Spring Cloud Config Server, vous devez spécifier spring.application.nameet à l' spring.cloud.config.server.git.uriintérieurbootstrap.yml
  • quelques encryption/decryptioninformations

Techniquement, bootstrap.ymlest chargé par un parent parent ApplicationContext. Ce parent ApplicationContextest chargé avant celui qui l'utilise application.yml.

Michael Isvy
la source
6
Pourriez-vous expliquer pourquoi Config Server doit insérer ces paramètres bootstrap.yml?
Neo
31
Lorsque vous utilisez Spring Cloud, les «vraies» données de configuration sont généralement chargées à partir d'un serveur. Pour obtenir l'URL (et toute autre configuration de connexion, comme les mots de passe, etc.), vous avez besoin d'une configuration antérieure ou "bootstrap". Ainsi, vous placez les attributs du serveur de configuration dans le bootstrap.yml, qui est utilisé pour charger les données de configuration réelles (qui remplacent généralement ce qui se trouve dans un application.yml [le cas échéant]).
Mike Mansell
10
Parfois, je me demande quand le printemps apporte de nouvelles fonctionnalités excitantes qu'il laisse derrière la convention sur les spécifications ou qu'ils supposent déjà sa convention et rien n'a besoin d'être spécifié et tout sera résolu par lui-même sinon au printemps puis au printemps et peut être au printemps prochain. boot-boot;)
Saurabh
Lorsque vous dites que bootstrap.yml est chargé avant application.yml. Mais quand je supprime application.yml. Mon application ne lit pas bootstrap.yml. Pourquoi donc?
Jesse
Nous devons souligner que le fichier d'amorçage n'est jamais remplacé car il a plus de priorité. Selon la documentation Team's Spring
kelgwiin
84

bootstrap.yml ou bootstrap.properties

Il n'est utilisé / nécessaire que si vous utilisez Spring Cloud et que la configuration de votre application est stockée sur un serveur de configuration distant (par exemple, Spring Cloud Config Server).

De la documentation:

Une application Spring Cloud fonctionne en créant un contexte "bootstrap", qui est un contexte parent pour l'application principale. Dès la sortie de la boîte, il est responsable du chargement des propriétés de configuration à partir des sources externes , ainsi que du décryptage des propriétés dans les fichiers de configuration externes locaux.

Notez que le bootstrap.ymlou bootstrap.properties peut contenir une configuration supplémentaire (par exemple par défaut) mais généralement vous n'avez qu'à mettre ici la configuration de démarrage.

Il contient généralement deux propriétés:

  • emplacement du serveur de configuration ( spring.cloud.config.uri)
  • nom de l'application ( spring.application.name)

Au démarrage, Spring Cloud fait un appel HTTP au serveur de configuration avec le nom de l'application et récupère la configuration de cette application.

application.yml ou application.properties

Contient la configuration d'application standard - généralement la configuration par défaut car toute configuration récupérée pendant le processus d'amorçage remplacera la configuration définie ici.

dustin.schultz
la source
34

Cette réponse a été très joliment expliquée dans le livre " Microservices Interview Questions, For Java Developers (Spring Boot, Spring Cloud, Cloud Native Applications)" par Munish Chandel , Version 1.30, 25.03.2018.

Le contenu suivant a été tiré de ce livre, et le crédit total pour cette réponse va à l'auteur du livre, c'est-à-dire Munish Chandel

application.yml

Le fichier application.yml / application.properties est spécifique aux applications Spring Boot. À moins que vous ne changiez l'emplacement des propriétés externes d'une application, Spring Boot chargera toujours application.yml à partir de l'emplacement suivant:

/src/main/resources/application.yml

Vous pouvez stocker toutes les propriétés externes de votre application dans ce fichier. Les propriétés communes disponibles dans n'importe quel projet Spring Boot se trouvent à l' adresse : https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html Vous pouvez personnaliser ces propriétés comme selon vos besoins d'application. Un exemple de fichier est présenté ci-dessous:

spring:
    application:
        name: foobar
    datasource:
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost/test
server:
    port: 9000

bootstrap.yml

bootstrap.yml d'autre part est spécifique à spring-cloud-config et est chargé avant le fichier application.yml

bootstrap.yml n'est nécessaire que si vous utilisez Spring Cloud et que votre configuration de microservice est stockée sur un serveur Spring Cloud Config Server distant.

Points importants sur bootstrap.yml

  1. Lorsqu'il est utilisé avec le serveur Spring Cloud Config, vous devez spécifier le nom de l'application et l'emplacement de git de configuration à l'aide des propriétés ci-dessous.
spring.application.name: "nom-application"
spring.cloud.config.server.git.uri: "git-uri-config"

  1. Lorsqu'il est utilisé avec des microservices (autres que le serveur de configuration cloud), nous devons spécifier le nom de l'application et l'emplacement du serveur de configuration à l'aide des propriétés ci-dessous
spring.application.name: 
spring.cloud.config.uri: 
  1. Ce fichier de propriétés peut contenir d'autres configurations pertinentes pour l'environnement Spring Cloud, par exemple l'emplacement du serveur eureka, les propriétés liées au chiffrement / déchiffrement.

Au démarrage, Spring Cloud effectue un appel HTTP (S) vers le serveur de configuration Spring Cloud avec le nom de l'application et récupère la configuration de cette application.

application.yml contient la configuration par défaut du microservice et toute configuration récupérée (à partir du serveur cloud config) pendant le processus d'amorçage remplacera la configuration définie dans application.yml

Vaibhav Sharma
la source
5

Juste mes 2 cents ici ..

Bootstrap.yml ou Bootstrap.properties est utilisé pour récupérer la configuration à partir de Spring Cloud Server.

Par exemple, dans mon fichier Bootstrap.properties, j'ai la configuration suivante

spring.application.name=Calculation-service
spring.cloud.config.uri=http://localhost:8888

Au démarrage de l'application, il essaie de récupérer la configuration du service en se connectant à http: // localhost: 8888 et examine Calculation-service.properties présent dans le serveur Spring Cloud Config

Vous pouvez valider la même chose à partir des journaux de Calcuation-Service lorsque vous le démarrez

INFO 10988 --- [ restartedMain] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at : http://localhost:8888

dixit gangaiah
la source
4

Eh bien, je suis totalement d'accord avec les réponses qui existent déjà sur ce point:

  • bootstrap.ymlest utilisé pour enregistrer les paramètres qui indiquent où se trouve la configuration à distance et le contexte d'application Bootstrap est créé avec ces configurations à distance.

En fait, il est également capable de stocker des propriétés normales tout comme quoi application.yml. Mais faites attention à cette chose délicate:

  • Si vous placez des propriétés dans bootstrap.yml, elles auront une priorité inférieure à presque toutes les autres sources de propriété, y compris application.yml. Comme décrit ici .

Soyons clairs, il existe deux types de propriétés liées à bootstrap.yml:

  • Propriétés chargées pendant la phase d'amorçage. Nous utilisons bootstrap.ymlpour trouver le détenteur des propriétés (un système de fichiers, un référentiel git ou autre), et les propriétés que nous obtenons de cette manière ont une priorité élevée, de sorte qu'elles ne peuvent pas être remplacées par la configuration locale. Comme décrit ici .
  • Propriétés qui se trouvent dans le bootstrap.yml. Comme expliqué précédemment, ils auront une priorité plus faible. Utilisez-les pour définir les valeurs par défaut, peut-être une bonne idée.

Ainsi, les différences entre mettre une propriété sur application.ymlou bootstrap.ymldans une botte de printemps sont:

  • Les propriétés de chargement des fichiers de configuration en phase d'amorçage ne peuvent être placées que dans bootstrap.yml.
  • Comme pour tous les autres types de propriétés, les placer application.ymlaura une priorité plus élevée.
Lebecca
la source
3

Bootstrap.yml est utilisé pour récupérer la configuration du serveur. Cela peut être pour une application cloud Spring ou pour d'autres. Il ressemble généralement à:

spring:
  application:
    name: "app-name"
  cloud:
    config:
      uri: ${config.server:http://some-server-where-config-resides}

Lorsque nous démarrons l'application, il essaie de se connecter au serveur donné et de lire la configuration basée sur le profil Spring mentionné dans la configuration run / debug. bootstrap.yml charge le premier

Si le serveur est inaccessible, l'application peut même ne pas pouvoir continuer. Cependant, si des configurations correspondant au profil sont présentes localement, les configurations de serveur sont remplacées.

Bonne approche:

Gérez un profil distinct pour le local et exécutez l'application à l'aide de différents profils.

Sudip Bhandari
la source
1

Une autre utilisation de bootstrap.yml est de charger la configuration à partir de kubernetes configmap et de ressources secrètes . L'application doit importer la dépendance Spring-Cloud-Starter-Kubernetes .

Comme pour Spring Cloud Config, cela doit avoir lieu pendant la phrase d'amorçage.

De la documentation:

spring:
  application:
    name: cloud-k8s-app
  cloud:
    kubernetes:
      config:
        name: default-name
        namespace: default-namespace
        sources:
         # Spring Cloud Kubernetes looks up a ConfigMap named c1 in namespace default-namespace
         - name: c1

Ainsi, les propriétés stockées dans la ressource configmap avec meta.name default-name peuvent être référencées de la même manière que les propriétés dans application.yml

Et le même processus s'applique aux secrets:

spring:
  application:
    name: cloud-k8s-app
  cloud:
    kubernetes:
      secrets:
        name: default-name
        namespace: default-namespace
        sources:
         # Spring Cloud Kubernetes looks up a Secret named s1 in namespace default-namespace
         - name: s1
Jack Beaken
la source
0

Bootstrap.yml est le premier fichier chargé au démarrage de l'application de démarrage printanier et application.property est chargé au démarrage de l'application. Ainsi, vous conservez, peut-être les informations d'identification de votre serveur de configuration, etc., dans bootstrap.yml qui est requis lors du chargement de l'application, puis dans application.properties que vous conservez peut être l'URL de la base de données, etc.

Anwar Sir
la source