Qual é a diferença entre colocar uma propriedade em application.yml ou bootstrap.yml na inicialização por mola?

251

Qual é a diferença entre colocar uma propriedade em application.yml ou bootstrap.yml na inicialização por mola? No caso logging.config, o aplicativo funciona diferente.

Rys
fonte
14
bootstrap.yml é o máximo que posso ver específico para [ spring-cloud-config] ( cloud.spring.io/spring-cloud-config/… )) e é a configuração usada para encontrar a configuração correta. Então configuração não é provavelmente carregado antes application.properties/yaml
zapl

Respostas:

296

Acabei de perguntar aos Spring Cloudcaras e pensei em compartilhar as informações que tenho aqui.

bootstrap.ymlé carregado antes application.yml.

É normalmente usado para o seguinte:

  • ao usar o Spring Cloud Config Server, você deve especificar spring.application.namee spring.cloud.config.server.git.uridentrobootstrap.yml
  • alguma encryption/decryptioninformação

Tecnicamente, bootstrap.ymlé carregado por um pai Spring ApplicationContext. Esse pai ApplicationContexté carregado antes daquele que usa application.yml.

Michael Isvy
fonte
6
Você poderia explicar por que o Config Server precisa colocar esses parâmetros bootstrap.yml?
Neo
30
Ao usar o Spring Cloud, os dados de configuração 'reais' geralmente são carregados de um servidor. Para obter o URL (e outras configurações de conexão, como senhas, etc.), você precisa de uma configuração anterior ou de "inicialização". Assim, você coloca os atributos do servidor de configuração no bootstrap.yml, que é usado para carregar os dados reais de configuração (que geralmente substituem o que está em um application.yml [se presente]).
Mike Mansell
10
algumas vezes me pergunto quando a primavera traz novos recursos interessantes que deixa para trás a convenção sobre a especificação ou eles assumem sua já convenção e nada precisa não ser especificado e tudo será resolvido por si próprio, se não na primavera, depois na bota e poderá ser no futuro. boot-boot;)
Saurabh
Quando você diz que o bootstrap.yml é carregado antes do application.yml. Mas quando eu removo application.yml. Meu aplicativo não lê bootstrap.yml. Por que é que?
Jesse
Precisamos destacar que o arquivo de autoinicialização nunca é substituído porque tem mais precedência. De acordo com a documentação Primavera da equipe
kelgwiin 7/01/19
84

bootstrap.yml ou bootstrap.properties

Ele é usado / necessário apenas se você estiver usando o Spring Cloud e a configuração do seu aplicativo estiver armazenada em um servidor de configuração remota (por exemplo, Spring Cloud Config Server).

A partir da documentação:

Um aplicativo Spring Cloud opera criando um contexto de "inicialização", que é um contexto pai para o aplicativo principal. Fora da caixa, ele é responsável por carregar as propriedades de configuração das fontes externas e também descriptografar as propriedades nos arquivos de configuração externos locais.

Observe que o bootstrap.ymlou bootstrap.properties pode conter configuração adicional (por exemplo, padrões), mas geralmente você só precisa colocar a configuração de autoinicialização aqui.

Normalmente, ele contém duas propriedades:

  • localização do servidor de configuração ( spring.cloud.config.uri)
  • nome do aplicativo ( spring.application.name)

Na inicialização, o Spring Cloud faz uma chamada HTTP para o servidor de configuração com o nome do aplicativo e recupera novamente a configuração desse aplicativo.

application.yml ou application.properties

Contém a configuração padrão do aplicativo - normalmente a configuração padrão, pois qualquer configuração recuperada durante o processo de inicialização substituirá a configuração definida aqui.

dustin.schultz
fonte
34

Esta resposta foi muito bem explicada no livro " Perguntas sobre entrevista de microsserviços, para desenvolvedores Java (Spring Boot, Spring Cloud, aplicativos nativos em nuvem) por Munish Chandel , versão 1.30, 25.03.2018.

O conteúdo a seguir foi retirado deste livro, e o crédito total para esta resposta é do autor do livro, ou seja, Munish Chandel

application.yml

O arquivo application.yml / application.properties é específico para aplicativos Spring Boot. A menos que você altere o local das propriedades externas de um aplicativo, a inicialização por mola sempre carregará application.yml no seguinte local:

/src/main/resources/application.yml

Você pode armazenar todas as propriedades externas para seu aplicativo neste arquivo. As propriedades comuns disponíveis em qualquer projeto Spring Boot podem ser encontradas em: https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html Você pode personalizar essas propriedades como de acordo com as necessidades do seu aplicativo. O arquivo de amostra é mostrado abaixo:

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

bootstrap.yml

O bootstrap.yml, por outro lado, é específico da spring-cloud-config e é carregado antes do application.yml

O bootstrap.yml será necessário apenas se você estiver usando o Spring Cloud e sua configuração de microsserviço estiver armazenada em um servidor remoto do Spring Cloud Config.

Pontos importantes sobre o bootstrap.yml

  1. Quando usado com o servidor Spring Cloud Config, você deve especificar o nome do aplicativo e o local do git de configuração usando as propriedades abaixo.
spring.application.name: "application-name"
spring.cloud.config.server.git.uri: "git-uri-config"

  1. Quando usado com microsserviços (exceto o servidor de configuração em nuvem), precisamos especificar o nome do aplicativo e o local do servidor de configuração usando as propriedades abaixo
spring.application.name: 
spring.cloud.config.uri: 
  1. Este arquivo de propriedades pode conter outra configuração relevante para o ambiente Spring Cloud, por exemplo, localização do servidor eureka, propriedades relacionadas à criptografia / descriptografia.

Na inicialização, o Spring Cloud faz uma chamada HTTP (S) para o Spring Cloud Config Server com o nome do aplicativo e recupera novamente a configuração desse aplicativo.

application.yml contém a configuração padrão para o microsserviço e qualquer configuração recuperada (do servidor de configuração em nuvem) durante o processo de inicialização substituirá a configuração definida em application.yml

Vaibhav Sharma
fonte
5

Apenas meus 2 centavos aqui ..

Bootstrap.yml ou Bootstrap.properties é usado para buscar a configuração do Spring Cloud Server.

Por exemplo, no arquivo My Bootstrap.properties, tenho o seguinte Config

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

Ao iniciar o aplicativo, ele tenta buscar a configuração do serviço conectando-se a http: // localhost: 8888 e consulta Calculation-service.properties presente no servidor Spring Cloud Config

Você pode validar o mesmo nos logs do Calcuation-Service ao iniciá-lo

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

dixit gangaiah
fonte
4

Bem, concordo totalmente com as respostas já existentes neste ponto:

  • bootstrap.ymlé usado para salvar parâmetros que apontam onde está a configuração remota e o Contexto do aplicativo Bootstrap é criado com essas configurações remotas.

Na verdade, ele também é capaz de armazenar propriedades normais da mesma forma que o que application.ymlfaz. Mas preste atenção nesta coisa complicada:

  • Se você inserir propriedades bootstrap.yml, elas terão uma precedência menor do que quase qualquer outra fonte de propriedades, incluindo application.yml. Como descrito aqui .

Vamos deixar claro, existem dois tipos de propriedades relacionadas a bootstrap.yml:

  • Propriedades que são carregadas durante a fase de auto-inicialização. Usamos bootstrap.ymlpara encontrar o detentor das propriedades (um sistema de arquivos, repositório git ou algo mais), e as propriedades que obtemos dessa maneira são de alta precedência, portanto elas não podem ser substituídas pela configuração local. Como descrito aqui .
  • Propriedades que estão no bootstrap.yml. Como explicado anteriormente, eles terão menor precedência. Use-os para definir os padrões, talvez uma boa ideia.

Portanto, as diferenças entre colocar uma propriedade na inicialização application.ymlou bootstrap.ymlna primavera são:

  • As propriedades para carregar arquivos de configuração na fase de auto-inicialização só podem ser inseridas bootstrap.yml.
  • Quanto a todos os outros tipos de propriedades, coloque-os em application.ymlmaior prioridade.
Lebecca
fonte
3

Bootstrap.yml é usado para buscar a configuração do servidor. Pode ser para um aplicativo em nuvem Spring ou para outros. Normalmente, parece com:

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

Quando iniciamos o aplicativo, ele tenta se conectar ao servidor especificado e ler a configuração com base no perfil de primavera mencionado na configuração de execução / depuração. bootstrap.yml carrega o primeiro

Se o servidor estiver inacessível, o aplicativo poderá não conseguir prosseguir. No entanto, se configurações correspondentes ao perfil estiverem presentes localmente, as configurações do servidor serão substituídas.

Boa abordagem:

Mantenha um perfil separado para local e execute o aplicativo usando perfis diferentes.

Sudip Bhandari
fonte
1

Outro uso do bootstrap.yml é carregar a configuração do kubernetes configmap e recursos secretos . O aplicativo deve importar a dependência spring-cloud-starter-kubernetes .

Assim como no Spring Cloud Config, isso deve ocorrer durante a frase de inicialização.

Dos documentos:

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

Portanto, as propriedades armazenadas no recurso configmap com meta.name default-name podem ser referenciadas da mesma forma que as propriedades em application.yml

E o mesmo processo se aplica aos segredos:

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
fonte
0

Bootstrap.yml é o primeiro arquivo carregado quando você inicia o aplicativo de inicialização da primavera e application.property é carregado quando o aplicativo é iniciado. Portanto, você deve manter as credenciais do servidor de configuração, etc., em bootstrap.yml, necessário durante o carregamento do aplicativo e, em application.properties, o URL do banco de dados, etc.

Anwar Sir
fonte