ความแตกต่างระหว่างการใส่คุณสมบัติใน application.yml หรือ bootstrap.yml ใน spring boot คืออะไร?


251

ความแตกต่างระหว่างการใส่คุณสมบัติใน application.yml หรือ bootstrap.yml ใน spring boot คืออะไร? ในกรณี log.config แอปพลิเคชันจะทำงานแตกต่างกัน


14
bootstrap.yml เท่าที่ฉันเห็นเฉพาะ [ spring-cloud-config] ( cloud.spring.io/spring-cloud-config/ ...... ) และมันเป็นโครงแบบที่ใช้ในการค้นหาการกำหนดค่าที่เหมาะสม ดังนั้นการกำหนดค่าอาจมีการโหลดก่อน application.properties/yaml
zapl

คำตอบ:


297

ฉันเพิ่งถามSpring Cloudคนและคิดว่าฉันควรแบ่งปันข้อมูลที่ฉันมีที่นี่

bootstrap.ymlapplication.ymlจะเต็มไปก่อน

โดยทั่วไปจะใช้สำหรับสิ่งต่อไปนี้:

  • เมื่อใช้ Spring Cloud Config Server คุณควรระบุspring.application.nameและspring.cloud.config.server.git.uriข้างในbootstrap.yml
  • encryption/decryptionข้อมูลบางอย่าง

เทคนิคการโหลดโดยผู้ปกครองฤดูใบไม้ผลิbootstrap.yml ApplicationContextผู้ปกครองที่มีการโหลดก่อนที่หนึ่งที่ใช้ApplicationContextapplication.yml


6
คุณช่วยกรุณาอธิบายว่าทำไมการกำหนดค่าเซิร์ฟเวอร์จะต้องใส่พารามิเตอร์เหล่านี้เป็นbootstrap.yml?
Neo

31
เมื่อใช้ Spring Cloud ข้อมูลการกำหนดค่า 'ของจริง' มักจะถูกโหลดจากเซิร์ฟเวอร์ ในการรับ URL (และการกำหนดค่าการเชื่อมต่ออื่น ๆ เช่นรหัสผ่าน ฯลฯ ) คุณต้องมีการกำหนดค่าก่อนหน้าหรือ "bootstrap" ดังนั้นคุณใส่แอตทริบิวต์เซิร์ฟเวอร์การกำหนดค่าใน bootstrap.yml ซึ่งใช้ในการโหลดข้อมูลการกำหนดค่าจริง (ซึ่งโดยทั่วไปจะแทนที่สิ่งที่อยู่ใน application.yml [ถ้ามี])
Mike Mansell

10
บางครั้งฉันสงสัยเมื่อฤดูใบไม้ผลินำคุณสมบัติที่น่าตื่นเต้นใหม่มันทิ้งไว้ข้างหลังการประชุมเกี่ยวกับสเปคหรือพวกเขาถือว่าการประชุมแล้วและไม่มีอะไรที่ไม่จำเป็นต้องระบุและทุกอย่างจะได้รับการแก้ไขด้วยตัวเอง boot-boot;)
Saurabh

เมื่อคุณบอกว่า bootstrap.yml ถูกโหลดก่อน application.yml แต่เมื่อฉันลบ application.yml แอปพลิเคชันของฉันไม่อ่าน bootstrap.yml ทำไมถึงเป็นอย่างนั้น?
Jesse

เราจำเป็นต้องเน้นว่าไฟล์บูตสแตรปจะไม่แทนที่เพราะมีความสำคัญมากกว่า ตามเอกสารของทีม Spring
kelgwiin

84

bootstrap.yml หรือ bootstrap.properties

ใช้ / จำเป็นเฉพาะเมื่อคุณใช้Spring Cloudและการกำหนดค่าของแอปพลิเคชันของคุณจะถูกเก็บไว้ในเซิร์ฟเวอร์การกำหนดค่าระยะไกล (เช่น Spring Cloud Config Server)

จากเอกสาร:

แอปพลิเคชัน Spring Cloud ทำงานโดยสร้างบริบท "bootstrap" ซึ่งเป็นบริบทหลักสำหรับแอปพลิเคชันหลัก ออกจากกล่องรับผิดชอบการโหลดคุณสมบัติการกำหนดค่าจากแหล่งภายนอกและยังถอดรหัสคุณสมบัติในไฟล์การกำหนดค่าภายนอกภายในเครื่อง

โปรดทราบว่าbootstrap.ymlหรือbootstrap.properties สามารถมีการกำหนดค่าเพิ่มเติม (เช่นค่าเริ่มต้น) แต่โดยทั่วไปคุณจะต้องใส่ bootstrap config ที่นี่เท่านั้น

โดยทั่วไปแล้วจะมีคุณสมบัติสองอย่าง:

  • ตำแหน่งของเซิร์ฟเวอร์การกำหนดค่า ( spring.cloud.config.uri)
  • ชื่อแอปพลิเคชัน ( spring.application.name)

เมื่อเริ่มต้น Spring Cloud จะทำการเรียก HTTP ไปยังเซิร์ฟเวอร์การกำหนดค่าด้วยชื่อแอปพลิเคชันและดึงการกำหนดค่าของแอปพลิเคชันนั้นกลับมา

application.yml หรือ application.properties

มีการกำหนดค่าแอปพลิเคชันมาตรฐาน - โดยทั่วไปแล้วการกำหนดค่าเริ่มต้นตั้งแต่การกำหนดค่าใด ๆ ที่ดึงมาในระหว่างกระบวนการบูทสแตรปจะแทนที่การกำหนดค่าที่นี่


34

คำตอบนี้ได้รับการอธิบายอย่างสวยงามในหนังสือ " Microservices Interview Questions สำหรับนักพัฒนา Java (Spring Boot, Spring Cloud, แอปพลิเคชัน Native Cloud)โดยMunish Chandel , เวอร์ชั่น 1.30, 25.03.2018

เนื้อหาต่อไปนี้ถูกนำมาจากหนังสือเล่มนี้และเครดิตรวมสำหรับคำตอบนี้ไปที่ผู้แต่งหนังสือเช่นMunish Chandel

application.yml

ไฟล์application.yml / application.propertiesเป็นไฟล์เฉพาะสำหรับแอพพลิเคชั่น Spring Boot ถ้าคุณไม่เปลี่ยนตำแหน่งของคุณสมบัติภายนอกของแอปพลิเคชันสปริงบูตจะโหลดแอปพลิเคชันเสมอจากตำแหน่งต่อไปนี้:

/src/main/resources/application.yml

คุณสามารถจัดเก็บคุณสมบัติภายนอกทั้งหมดสำหรับแอปพลิเคชันของคุณในไฟล์นี้ คุณสมบัติทั่วไปที่มีอยู่ในโครงการ Spring Boot ใด ๆ สามารถดูได้ที่: https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.htmlคุณสามารถปรับแต่งคุณสมบัติเหล่านี้เป็น ตามความต้องการใช้งานของคุณ ไฟล์ตัวอย่างที่แสดงด้านล่าง:

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

bootstrap.yml

bootstrap.ymlในทางกลับกันนั้นจำเพาะกับspring-cloud-configและถูกโหลดก่อนapplication.yml

bootstrap.ymlจำเป็นเฉพาะเมื่อคุณใช้ Spring Cloud และการกำหนดค่า microservice ของคุณจะถูกเก็บไว้ใน Spring Cloud Config Server ระยะไกล

จุดสำคัญเกี่ยวกับ bootstrap.yml

  1. เมื่อใช้กับเซิร์ฟเวอร์ Spring Cloud Config คุณจะต้องระบุชื่อแอปพลิเคชันและกำหนดค่าตำแหน่งคอมไพล์โดยใช้คุณสมบัติด้านล่าง
spring.application.name: "application-name"
spring.cloud.config.server.git.uri: "git-uri-config"

  1. เมื่อใช้กับ microservices (นอกเหนือจากเซิร์ฟเวอร์คลาวด์ config) เราจำเป็นต้องระบุชื่อแอปพลิเคชันและตำแหน่งของเซิร์ฟเวอร์การกำหนดค่าโดยใช้คุณสมบัติด้านล่าง
spring.application.name: 
spring.cloud.config.uri: 
  1. ไฟล์คุณสมบัตินี้สามารถมีการกำหนดค่าอื่น ๆ ที่เกี่ยวข้องกับสภาพแวดล้อม Spring Cloud สำหรับเช่นตำแหน่งเซิร์ฟเวอร์ eureka คุณสมบัติการเข้ารหัส / ถอดรหัส

เมื่อเริ่มต้น Spring Cloud จะทำการเรียก HTTP (S) ไปยัง Spring Cloud Config Server ด้วยชื่อของแอปพลิเคชันและดึงการกำหนดค่าของแอปพลิเคชันนั้นกลับมา

application.yml มีการกำหนดค่าเริ่มต้นสำหรับ microservice และการกำหนดค่าใด ๆ ที่ดึงมา (จากเซิร์ฟเวอร์คลาวด์ config) ในระหว่างกระบวนการ bootstrap จะแทนที่การกำหนดค่าที่กำหนดไว้ใน application.yml


5

เพียง 2 เซ็นต์ของฉันที่นี่ ..

Bootstrap.yml หรือ Bootstrap.properties ใช้เพื่อดึงข้อมูลการกำหนดค่าจาก Spring Cloud Server

ตัวอย่างเช่นในไฟล์ Bootstrap.properties ของฉันฉันมีการกำหนดค่าต่อไปนี้

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

เมื่อเริ่มต้นแอปพลิเคชันจะพยายามดึงการกำหนดค่าสำหรับบริการโดยเชื่อมต่อกับhttp: // localhost: 8888และดูที่ Calculation-service.properties ที่มีอยู่ในเซิร์ฟเวอร์ Spring Cloud Config

คุณสามารถตรวจสอบความถูกต้องเดียวกันได้จากบันทึกการบริการการคำนวณเมื่อคุณเริ่มต้น

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


4

ดีฉันเห็นด้วยกับคำตอบอยู่แล้วในจุดนี้:

  • bootstrap.ymlใช้เพื่อบันทึกพารามิเตอร์ที่ชี้ให้เห็นว่าการตั้งค่าระยะไกลอยู่ที่ไหนและBootstrap Application Contextถูกสร้างขึ้นด้วยการกำหนดค่าระยะไกลเหล่านี้

ที่จริงแล้วมันสามารถเก็บคุณสมบัติปกติเหมือนกันกับสิ่งที่application.ymlทำ แต่ให้ความสนใจกับสิ่งที่ยุ่งยากนี้:

  • หากคุณวางคุณสมบัติไว้bootstrap.ymlพวกเขาจะได้รับลำดับความสำคัญต่ำกว่าเกือบทุกแหล่งที่มาของคุณสมบัติอื่น ๆ รวมถึง application.yml ตามที่อธิบายไว้ที่นี่

มาทำให้มันชัดเจนมีคุณสมบัติสองชนิดที่เกี่ยวข้องกับbootstrap.yml:

  • คุณสมบัติที่โหลดระหว่างเฟส bootstrap เราใช้bootstrap.ymlในการค้นหาเจ้าของคุณสมบัติ (ระบบไฟล์, พื้นที่เก็บข้อมูล git หรืออย่างอื่น), และคุณสมบัติที่เราได้รับในลักษณะนี้มีความสำคัญสูงดังนั้นจึงไม่สามารถแทนที่ได้ด้วยการกำหนดค่าท้องถิ่น ตามที่อธิบายไว้ที่นี่
  • bootstrap.ymlอสังหาริมทรัพย์ที่อยู่ใน ตามที่อธิบายไว้ก่อนหน้าพวกเขาจะได้รับความสำคัญต่ำกว่า ใช้พวกเขาเพื่อตั้งค่าเริ่มต้นอาจเป็นความคิดที่ดี

ดังนั้นความแตกต่างระหว่างการวางคุณสมบัติไว้บนapplication.ymlหรือbootstrap.ymlในบูทสปริงคือ:

  • คุณสมบัติสำหรับการโหลดไฟล์กำหนดค่าในเฟสบูทสแตรปสามารถวางbootstrap.ymlได้เท่านั้น
  • สำหรับคุณสมบัติอื่น ๆ ทั้งหมดวางไว้ในapplication.ymlจะได้รับความสำคัญสูงกว่า

3

Bootstrap.yml ใช้เพื่อดึงข้อมูลการกำหนดค่าจากเซิร์ฟเวอร์ สามารถใช้กับแอปพลิเคชัน Spring cloud หรือเพื่อผู้อื่น โดยทั่วไปแล้วดูเหมือนว่า:

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

เมื่อเราเริ่มต้นแอปพลิเคชันมันจะพยายามเชื่อมต่อกับเซิร์ฟเวอร์ที่กำหนดและอ่านการกำหนดค่าตามโปรไฟล์ของสปริงที่กล่าวถึงในการกำหนดค่า run / debug bootstrap.yml ทำการโหลดครั้งแรก

หากเซิร์ฟเวอร์ไม่สามารถเข้าถึงแอปพลิเคชันอาจไม่สามารถดำเนินการต่อไปได้ อย่างไรก็ตามหากการกำหนดค่าที่ตรงกับโปรไฟล์มีอยู่ในเครื่องเซิร์ฟเวอร์จะถูกแทนที่

แนวทางที่ดี:

รักษาโปรไฟล์แยกต่างหากสำหรับโลคัลและรันแอพโดยใช้โปรไฟล์ที่ต่างกัน


1

การใช้งานอื่นสำหรับbootstrap.ymlคือการโหลดการกำหนดค่าจาก kubernetes configmapและทรัพยากรลับ แอปพลิเคชันจะต้องนำเข้าการพึ่งพาของspring-cloud-starter-kubernetes

เช่นเดียวกับการกำหนดค่า Spring Cloud สิ่งนี้จะต้องเกิดขึ้นระหว่างวลีบูตสแตรป

จากเอกสาร:

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

คุณสมบัติที่เก็บไว้ในทรัพยากร configmap ด้วยชื่อเริ่มต้น meta.name สามารถอ้างอิงได้เช่นเดียวกับคุณสมบัติในapplication.yml

และกระบวนการเดียวกันนี้นำไปใช้กับความลับ:

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.yml เป็นไฟล์แรกที่ถูกโหลดเมื่อคุณเริ่มต้นแอพพลิเคชั่นบู๊ทสปริงและแอพพลิเคชั่นคุณสมบัติจะถูกโหลดเมื่อแอปพลิเคชันเริ่มทำงาน ดังนั้นคุณเก็บไว้อาจเป็นข้อมูลรับรองของเซิร์ฟเวอร์การกำหนดค่าของคุณเป็นต้นใน bootstrap.yml ซึ่งจำเป็นในระหว่างการโหลดแอปพลิเคชันและจากนั้นใน application.properties ที่คุณเก็บไว้อาจเป็น URL ฐานข้อมูลเป็นต้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.