Sự khác biệt giữa việc đặt một thuộc tính trên application.yml hoặc bootstrap.yml trong spring boot là gì?


250

Sự khác biệt giữa việc đặt một thuộc tính trên application.yml hoặc bootstrap.yml trong spring boot là gì? Trong trường hợp log.config, ứng dụng hoạt động khác nhau.


14
bootstrap.yml theo như tôi có thể thấy cụ thể đối với [ spring-cloud-config] ( cloud.spring.io/spring-cloud-config/iêu )) và đó là cấu hình được sử dụng để tìm cấu hình phù hợp. Vì vậy, cấu hình có thể được tải trước application.properIES
yaml

Câu trả lời:


295

Tôi vừa hỏi các Spring Cloudbạn và nghĩ rằng tôi nên chia sẻ thông tin tôi có ở đây.

bootstrap.ymlđược tải trước application.yml.

Nó thường được sử dụng cho các mục sau:

  • Khi sử dụng Spring Cloud Config Server, bạn nên chỉ định spring.application.namespring.cloud.config.server.git.uribên trongbootstrap.yml
  • một số encryption/decryptionthông tin

Về mặt kỹ thuật, bootstrap.ymlđược tải bởi một cha mẹ Spring ApplicationContext. Đó là cha mẹ ApplicationContextđược tải trước khi sử dụng application.yml.


6
Bạn có thể giải thích tại sao Máy chủ Cấu hình cần đặt các tham số này vào bootstrap.ymlkhông?
Neo

30
Khi sử dụng Spring Cloud, dữ liệu cấu hình 'thực' thường được tải từ máy chủ. Để có được URL (và cấu hình kết nối khác, chẳng hạn như mật khẩu, v.v.), bạn cần có cấu hình sớm hơn hoặc "bootstrap". Do đó, bạn đặt các thuộc tính máy chủ cấu hình trong bootstrap.yml, được sử dụng để tải dữ liệu cấu hình thực (thường ghi đè lên những gì trong application.yml [nếu có]).
Mike Mansell

10
đôi khi tôi tự hỏi khi mùa xuân mang đến những tính năng thú vị mới, nó bỏ lại quy ước so với đặc điểm kỹ thuật hoặc họ cho rằng đó là quy ước và không có gì không cần phải chỉ định và mọi thứ sẽ được giải quyết nếu không phải là mùa xuân sau đó là mùa xuân và có thể là vào mùa xuân trong tương lai boot-boot;)
Saurabh

Khi bạn nói bootstrap.yml được tải trước application.yml. Nhưng khi tôi gỡ bỏ application.yml. Ứng dụng của tôi không đọc bootstrap.yml. Tại sao vậy?
Jesse

Chúng ta cần nhấn mạnh rằng tệp bootstrap không bao giờ được ghi đè vì nó có nhiều quyền ưu tiên hơn. Theo tài liệu Mùa xuân của Đội
kelgwiin

84

bootstrap.yml hoặc là bootstrap.properties

Nó chỉ được sử dụng / cần thiết nếu bạn đang sử dụng Spring Cloud và cấu hình ứng dụng của bạn được lưu trữ trên một máy chủ cấu hình từ xa (ví dụ: Spring Cloud Config Server).

Từ tài liệu:

Ứng dụng Spring Cloud hoạt động bằng cách tạo bối cảnh "bootstrap", là bối cảnh chính cho ứng dụng chính. Ngoài hộp, nó chịu trách nhiệm tải các thuộc tính cấu hình từ các nguồn bên ngoài và cũng giải mã các thuộc tính trong các tệp cấu hình bên ngoài cục bộ.

Lưu ý rằng bootstrap.ymlhoặc bootstrap.properties có thể chứa cấu hình bổ sung (ví dụ: mặc định) nhưng nhìn chung bạn chỉ cần đặt cấu hình bootstrap ở đây.

Thông thường, nó chứa hai thuộc tính:

  • vị trí của máy chủ cấu hình (spring.cloud.config.uri )
  • tên của ứng dụng ( spring.application.name)

Khi khởi động, Spring Cloud thực hiện cuộc gọi HTTP đến máy chủ cấu hình với tên của ứng dụng và lấy lại cấu hình của ứng dụng đó.

application.yml hoặc là application.properties

Chứa cấu hình ứng dụng tiêu chuẩn - cấu hình mặc định điển hình vì mọi cấu hình được truy xuất trong quá trình bootstrap sẽ ghi đè cấu hình được xác định tại đây.


34

Câu trả lời này đã được giải thích rất hay trong cuốn sách " Câu hỏi phỏng vấn microservice, dành cho nhà phát triển Java (Spring Boot, Spring Cloud, Cloud Native) của Munish Chandel , Phiên bản 1.30, 25.03.2018.

Nội dung sau đây đã được lấy từ cuốn sách này và tổng số tín dụng cho câu trả lời này được gửi đến Tác giả của cuốn sách, tức là Munish Chandel

application.yml

Tệp application.yml / application.properIES dành riêng cho các ứng dụng Spring Boot. Trừ khi bạn thay đổi vị trí của các thuộc tính bên ngoài của một ứng dụng, spring boot sẽ luôn tải application.yml từ vị trí sau:

/src/main/resources/application.yml

Bạn có thể lưu trữ tất cả các thuộc tính bên ngoài cho ứng dụng của bạn trong tệp này. Các thuộc tính phổ biến có sẵn trong bất kỳ dự án Spring Boot nào có thể được tìm thấy tại: https://docs.spring.io/spring-boot/docs/civerse/reference/html/common-application-properIES.html Bạn có thể tùy chỉnh các thuộc tính này như theo nhu cầu ứng dụng của bạn. Tệp mẫu được hiển thị dưới đây:

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

bootstrap.yml

mặt khác, bootstrap.yml dành riêng cho spring-cloud-config và được tải trước application.yml

bootstrap.yml chỉ cần thiết nếu bạn đang sử dụng Spring Cloud và cấu hình microservice của bạn được lưu trữ trên Máy chủ Cấu hình Spring Cloud từ xa.

Những điểm quan trọng về bootstrap.yml

  1. Khi được sử dụng với máy chủ Spring Cloud Config, bạn sẽ chỉ định vị trí tên ứng dụng và cấu hình git bằng các thuộc tính bên dưới.
spring.application.name: "tên ứng dụng"
spring.cloud.config.server.git.uri: "git-uri-config"

  1. Khi được sử dụng với microservice (trừ máy chủ cấu hình đám mây), chúng tôi cần chỉ định tên ứng dụng và vị trí của máy chủ cấu hình bằng các thuộc tính bên dưới
spring.application.name: 
mùa xuân.cloud.config.uri: 
  1. Tệp thuộc tính này có thể chứa cấu hình khác có liên quan đến môi trường Spring Cloud, ví dụ như vị trí máy chủ eureka, thuộc tính liên quan đến mã hóa / giải mã.

Khi khởi động, Spring Cloud thực hiện cuộc gọi HTTP (S) đến Máy chủ cấu hình Spring Cloud với tên của ứng dụng và lấy lại cấu hình của ứng dụng đó.

application.yml chứa cấu hình mặc định cho microservice và mọi cấu hình được truy xuất (từ máy chủ cấu hình đám mây) trong quá trình bootstrap sẽ ghi đè cấu hình được xác định trong application.yml


5

Chỉ cần 2 Cents của tôi ở đây ..

Bootstrap.yml hoặc Bootstrap.properIES được sử dụng để tìm nạp cấu hình từ Spring Cloud Server.

Ví dụ: trong tệp Bootstrap.properIES của tôi, tôi có Cấu hình sau

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

Khi khởi động ứng dụng, Nó cố gắng tìm nạp cấu hình cho dịch vụ bằng cách kết nối với http: // localhost: 8888 và xem Tính toán-service.properies có trong máy chủ Spring Cloud Config

Bạn có thể xác thực tương tự từ nhật ký của Dịch vụ tính toán khi bạn khởi động nó

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


4

Vâng, tôi hoàn toàn đồng ý với câu trả lời đã tồn tại ở điểm này:

  • bootstrap.ymlđược sử dụng để lưu các tham số chỉ ra nơi cấu hình từ xa và Bối cảnh ứng dụng Bootstrap được tạo với các cấu hình từ xa này.

Trên thực tế, nó cũng có thể lưu trữ các thuộc tính bình thường giống như những gì application.ymllàm. Nhưng hãy chú ý đến điều khó khăn này:

  • Nếu bạn đặt các thuộc tính vào bootstrap.yml, chúng sẽ có mức độ ưu tiên thấp hơn hầu hết các nguồn thuộc tính khác, bao gồm application.yml. Theo mô tả ở đây .

Hãy làm rõ, có hai loại thuộc tính liên quan đến bootstrap.yml:

  • Các thuộc tính được tải trong giai đoạn bootstrap. Chúng tôi sử dụng bootstrap.ymlđể tìm chủ sở hữu thuộc tính (Hệ thống tệp, kho git hoặc thứ gì khác) và các thuộc tính chúng tôi nhận được theo cách này có độ ưu tiên cao, do đó chúng không thể bị ghi đè bởi cấu hình cục bộ. Theo mô tả ở đây .
  • Các thuộc tính có trong bootstrap.yml. Như được giải thích sớm, họ sẽ được ưu tiên thấp hơn. Sử dụng chúng để đặt mặc định có thể là một ý tưởng tốt.

Vì vậy, sự khác biệt giữa việc đặt một tài sản trên application.ymlhoặc bootstrap.ymltrong khởi động mùa xuân là:

  • Các thuộc tính để tải các tệp cấu hình trong pha bootstrap chỉ có thể được đặt trong bootstrap.yml.
  • Đối với tất cả các loại tài sản khác, đặt chúng vào application.ymlsẽ được ưu tiên cao hơn.

3

Bootstrap.yml được sử dụng để tìm nạp cấu hình từ máy chủ. Nó có thể cho một ứng dụng đám mây mùa xuân hoặc cho những người khác. Thông thường nó trông giống như:

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

Khi chúng tôi khởi động ứng dụng, nó cố gắng kết nối với máy chủ đã cho và đọc cấu hình dựa trên cấu hình mùa xuân được đề cập trong cấu hình chạy / gỡ lỗi. bootstrap.yml tải đầu tiên

Nếu máy chủ không truy cập được, ứng dụng thậm chí không thể tiếp tục. Tuy nhiên, nếu cấu hình phù hợp với cấu hình được trình bày cục bộ thì cấu hình máy chủ sẽ bị ghi đè.

Cách tiếp cận tốt:

Duy trì một hồ sơ riêng cho địa phương và chạy ứng dụng bằng các cấu hình khác nhau.


1

Một cách sử dụng khác cho bootstrap.yml là tải cấu hình từ cấu hình kubernetes và tài nguyên bí mật . Ứng dụng phải nhập phụ thuộc spring-cloud-starter-kubernetes .

Như với Spring Cloud Config, điều này phải diễn ra trong cụm từ bootstrap.

Từ các tài liệu:

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

Vì vậy, các thuộc tính được lưu trữ trong tài nguyên configmap với tên mặc định của meta.name có thể được tham chiếu giống như các thuộc tính trong application.yml

Và quy trình tương tự áp dụng cho các bí mật:

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

0

Bootstrap.ymal là tệp đầu tiên được tải khi bạn khởi động ứng dụng khởi động mùa xuân và application.property được tải khi ứng dụng khởi động. Vì vậy, bạn giữ, có thể là thông tin máy chủ cấu hình của bạn, v.v. trong bootstrap.ymal được yêu cầu trong khi tải ứng dụng và sau đó trong application.properations bạn giữ có thể là url cơ sở dữ liệu, v.v.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.