ความแตกต่างระหว่างการใส่คุณสมบัติใน application.yml หรือ bootstrap.yml ใน spring boot คืออะไร? ในกรณี log.config แอปพลิเคชันจะทำงานแตกต่างกัน
ความแตกต่างระหว่างการใส่คุณสมบัติใน application.yml หรือ bootstrap.yml ใน spring boot คืออะไร? ในกรณี log.config แอปพลิเคชันจะทำงานแตกต่างกัน
คำตอบ:
ฉันเพิ่งถามSpring Cloud
คนและคิดว่าฉันควรแบ่งปันข้อมูลที่ฉันมีที่นี่
bootstrap.yml
application.yml
จะเต็มไปก่อน
โดยทั่วไปจะใช้สำหรับสิ่งต่อไปนี้:
spring.application.name
และspring.cloud.config.server.git.uri
ข้างในbootstrap.yml
encryption/decryption
ข้อมูลบางอย่างเทคนิคการโหลดโดยผู้ปกครองฤดูใบไม้ผลิbootstrap.yml
ApplicationContext
ผู้ปกครองที่มีการโหลดก่อนที่หนึ่งที่ใช้ApplicationContext
application.yml
bootstrap.yml
?
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
มีการกำหนดค่าแอปพลิเคชันมาตรฐาน - โดยทั่วไปแล้วการกำหนดค่าเริ่มต้นตั้งแต่การกำหนดค่าใด ๆ ที่ดึงมาในระหว่างกระบวนการบูทสแตรปจะแทนที่การกำหนดค่าที่นี่
คำตอบนี้ได้รับการอธิบายอย่างสวยงามในหนังสือ " 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
spring.application.name: "application-name" spring.cloud.config.server.git.uri: "git-uri-config"
spring.application.name: spring.cloud.config.uri:
เมื่อเริ่มต้น Spring Cloud จะทำการเรียก HTTP (S) ไปยัง Spring Cloud Config Server ด้วยชื่อของแอปพลิเคชันและดึงการกำหนดค่าของแอปพลิเคชันนั้นกลับมา
application.yml มีการกำหนดค่าเริ่มต้นสำหรับ microservice และการกำหนดค่าใด ๆ ที่ดึงมา (จากเซิร์ฟเวอร์คลาวด์ config) ในระหว่างกระบวนการ bootstrap จะแทนที่การกำหนดค่าที่กำหนดไว้ใน application.yml
เพียง 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
ดีฉันเห็นด้วยกับคำตอบอยู่แล้วในจุดนี้:
bootstrap.yml
ใช้เพื่อบันทึกพารามิเตอร์ที่ชี้ให้เห็นว่าการตั้งค่าระยะไกลอยู่ที่ไหนและBootstrap Application Contextถูกสร้างขึ้นด้วยการกำหนดค่าระยะไกลเหล่านี้ที่จริงแล้วมันสามารถเก็บคุณสมบัติปกติเหมือนกันกับสิ่งที่application.yml
ทำ แต่ให้ความสนใจกับสิ่งที่ยุ่งยากนี้:
bootstrap.yml
พวกเขาจะได้รับลำดับความสำคัญต่ำกว่าเกือบทุกแหล่งที่มาของคุณสมบัติอื่น ๆ รวมถึง application.yml ตามที่อธิบายไว้ที่นี่มาทำให้มันชัดเจนมีคุณสมบัติสองชนิดที่เกี่ยวข้องกับbootstrap.yml
:
bootstrap.yml
ในการค้นหาเจ้าของคุณสมบัติ (ระบบไฟล์, พื้นที่เก็บข้อมูล git หรืออย่างอื่น), และคุณสมบัติที่เราได้รับในลักษณะนี้มีความสำคัญสูงดังนั้นจึงไม่สามารถแทนที่ได้ด้วยการกำหนดค่าท้องถิ่น ตามที่อธิบายไว้ที่นี่bootstrap.yml
อสังหาริมทรัพย์ที่อยู่ใน ตามที่อธิบายไว้ก่อนหน้าพวกเขาจะได้รับความสำคัญต่ำกว่า ใช้พวกเขาเพื่อตั้งค่าเริ่มต้นอาจเป็นความคิดที่ดีดังนั้นความแตกต่างระหว่างการวางคุณสมบัติไว้บนapplication.yml
หรือbootstrap.yml
ในบูทสปริงคือ:
bootstrap.yml
ได้เท่านั้นapplication.yml
จะได้รับความสำคัญสูงกว่าBootstrap.yml ใช้เพื่อดึงข้อมูลการกำหนดค่าจากเซิร์ฟเวอร์ สามารถใช้กับแอปพลิเคชัน Spring cloud หรือเพื่อผู้อื่น โดยทั่วไปแล้วดูเหมือนว่า:
spring:
application:
name: "app-name"
cloud:
config:
uri: ${config.server:http://some-server-where-config-resides}
เมื่อเราเริ่มต้นแอปพลิเคชันมันจะพยายามเชื่อมต่อกับเซิร์ฟเวอร์ที่กำหนดและอ่านการกำหนดค่าตามโปรไฟล์ของสปริงที่กล่าวถึงในการกำหนดค่า run / debug
หากเซิร์ฟเวอร์ไม่สามารถเข้าถึงแอปพลิเคชันอาจไม่สามารถดำเนินการต่อไปได้ อย่างไรก็ตามหากการกำหนดค่าที่ตรงกับโปรไฟล์มีอยู่ในเครื่องเซิร์ฟเวอร์จะถูกแทนที่
แนวทางที่ดี:
รักษาโปรไฟล์แยกต่างหากสำหรับโลคัลและรันแอพโดยใช้โปรไฟล์ที่ต่างกัน
การใช้งานอื่นสำหรับ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
Bootstrap.yml เป็นไฟล์แรกที่ถูกโหลดเมื่อคุณเริ่มต้นแอพพลิเคชั่นบู๊ทสปริงและแอพพลิเคชั่นคุณสมบัติจะถูกโหลดเมื่อแอปพลิเคชันเริ่มทำงาน ดังนั้นคุณเก็บไว้อาจเป็นข้อมูลรับรองของเซิร์ฟเวอร์การกำหนดค่าของคุณเป็นต้นใน bootstrap.yml ซึ่งจำเป็นในระหว่างการโหลดแอปพลิเคชันและจากนั้นใน application.properties ที่คุณเก็บไว้อาจเป็น URL ฐานข้อมูลเป็นต้น
bootstrap.yml
เท่าที่ฉันเห็นเฉพาะ [spring-cloud-config
] ( cloud.spring.io/spring-cloud-config/ ...... ) และมันเป็นโครงแบบที่ใช้ในการค้นหาการกำหนดค่าที่เหมาะสม ดังนั้นการกำหนดค่าอาจมีการโหลดก่อน application.properties/yaml