Apa perbedaan antara meletakkan properti di application.yml atau bootstrap.yml di spring boot?

251

Apa perbedaan antara meletakkan properti di application.yml atau bootstrap.yml di spring boot? Dalam kasus logging.config, aplikasi bekerja berbeda.

Rys
sumber
14
bootstrap.yml sejauh yang saya bisa melihat khusus untuk [ spring-cloud-config] ( cloud.spring.io/spring-cloud-config/… )) dan itu konfigurasi yang digunakan untuk menemukan konfigurasi yang tepat. Jadi konfigurasi mungkin ada dimuat sebelum application.properties/yaml
zapl

Jawaban:

296

Saya baru saja bertanya kepada Spring Cloudteman - teman dan berpikir saya harus membagikan info yang saya miliki di sini.

bootstrap.ymldimuat sebelumnya application.yml.

Ini biasanya digunakan untuk yang berikut:

  • saat menggunakan Spring Cloud Config Server, Anda harus menentukan spring.application.namedan spring.cloud.config.server.git.uridi dalamnyabootstrap.yml
  • beberapa encryption/decryptioninformasi

Secara teknis, bootstrap.ymldimuat oleh Spring induk ApplicationContext. Orang tua ApplicationContextitu dimuat sebelum yang digunakan application.yml.

Michael Isvy
sumber
6
Bisakah Anda jelaskan mengapa Config Server perlu memasukkan parameter ini bootstrap.yml?
Neo
30
Saat menggunakan Spring Cloud, data konfigurasi 'nyata' biasanya diambil dari server. Untuk mendapatkan URL (dan konfigurasi koneksi lainnya, seperti kata sandi, dll.), Anda memerlukan konfigurasi yang lebih awal atau "bootstrap". Dengan demikian, Anda meletakkan atribut config server di bootstrap.yml, yang digunakan untuk memuat data konfigurasi nyata (yang umumnya menimpa apa yang ada di application.yml [jika ada]).
Mike Mansell
10
beberapa kali saya bertanya-tanya ketika musim semi menghadirkan fitur-fitur baru yang menarik, ia meninggalkan konvensi di atas spesifikasi atau mereka menganggap konvensi yang sudah ada dan tidak perlu ditentukan dan semuanya akan diselesaikan sendiri jika tidak pada musim semi lalu boot musim semi dan mungkin di musim semi mendatang- boot-boot;)
Saurabh
Ketika Anda mengatakan bootstrap.yml dimuat sebelum application.yml. Tetapi ketika saya menghapus application.yml. Aplikasi saya tidak membaca bootstrap.yml. Mengapa demikian?
Jesse
Kita perlu menyoroti bahwa file bootstrap tidak pernah menimpa karena memiliki lebih banyak prioritas. Menurut dokumentasi Musim Semi Tim
kelgwiin
84

bootstrap.yml atau bootstrap.properties

Ini hanya digunakan / diperlukan jika Anda menggunakan Spring Cloud dan konfigurasi aplikasi Anda disimpan pada server konfigurasi jarak jauh (misalnya Spring Cloud Config Server).

Dari dokumentasi:

Aplikasi Spring Cloud beroperasi dengan membuat konteks "bootstrap", yang merupakan konteks induk untuk aplikasi utama. Out of the box bertanggung jawab untuk memuat properti konfigurasi dari sumber eksternal , dan juga mendekripsi properti dalam file konfigurasi eksternal lokal.

Perhatikan bahwa bootstrap.ymlatau bootstrap.properties dapat berisi konfigurasi tambahan (misalnya default) tetapi umumnya Anda hanya perlu meletakkan konfigurasi bootstrap di sini.

Biasanya mengandung dua properti:

  • lokasi server konfigurasi ( spring.cloud.config.uri)
  • nama aplikasi ( spring.application.name)

Saat mulai, Spring Cloud melakukan panggilan HTTP ke server konfigurasi dengan nama aplikasi dan mengambil kembali konfigurasi aplikasi itu.

application.yml atau application.properties

Berisi konfigurasi aplikasi standar - biasanya konfigurasi default karena konfigurasi apa pun yang diambil selama proses bootstrap akan menimpa konfigurasi yang ditentukan di sini.

dustin.schultz
sumber
34

Jawaban ini telah dijelaskan dengan sangat indah dalam buku " Pertanyaan Wawancara microservices, Untuk Pengembang Java (Spring Boot, Spring Cloud, Aplikasi Cloud Asli) oleh Munish Chandel , Versi 1.30, 25.03.2018.

Konten berikut telah diambil dari buku ini, dan kredit total untuk jawaban ini jatuh ke Penulis buku yaitu Munish Chandel

application.yml

file application.yml / application.properties khusus untuk aplikasi Spring Boot. Kecuali Anda mengubah lokasi properti eksternal suatu aplikasi, spring boot akan selalu memuat application.yml dari lokasi berikut:

/src/main/resources/application.yml

Anda dapat menyimpan semua properti eksternal untuk aplikasi Anda dalam file ini. Properti umum yang tersedia di proyek Spring Boot dapat ditemukan di: https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html Anda dapat menyesuaikan properti ini sebagai sesuai kebutuhan aplikasi Anda. File sampel ditunjukkan di bawah ini:

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

bootstrap.yml

bootstrap.yml di sisi lain khusus untuk pegas-cloud-config dan dimuat sebelum application.yml

bootstrap.yml hanya diperlukan jika Anda menggunakan Spring Cloud dan konfigurasi microservice Anda disimpan pada Server Cloud Cloud jauh.

Poin penting tentang bootstrap.yml

  1. Saat digunakan dengan server Spring Cloud Config, Anda harus menentukan nama aplikasi dan lokasi konfigurasi menggunakan properti di bawah ini.
spring.application.name: "application-name"
spring.cloud.config.server.git.uri: "git-uri-config"

  1. Ketika digunakan dengan microservices (selain cloud config server), kita perlu menentukan nama aplikasi dan lokasi server config menggunakan properti di bawah ini
spring.application.name: 
spring.cloud.config.uri: 
  1. File properti ini dapat berisi konfigurasi lain yang relevan dengan lingkungan Spring Cloud untuk misalnya lokasi server eureka, properti terkait enkripsi / dekripsi.

Saat mulai, Spring Cloud melakukan panggilan HTTP (S) ke Server Spring Cloud Config dengan nama aplikasi dan mengambil kembali konfigurasi aplikasi itu.

application.yml berisi konfigurasi default untuk layanan microser dan konfigurasi apa pun yang diambil (dari cloud config server) selama proses bootstrap akan menimpa konfigurasi yang ditentukan dalam application.yml

Vaibhav Sharma
sumber
5

Hanya 2 Cents saya di sini ..

Bootstrap.yml atau Bootstrap.properties digunakan untuk mengambil konfigurasi dari Spring Cloud Server.

Sebagai contoh, dalam file Bootstrap.properties Saya, saya memiliki Config berikut

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

Saat memulai aplikasi, ia mencoba mengambil konfigurasi untuk layanan dengan menghubungkan ke http: // localhost: 8888 dan melihat Calculation-service.properties yang ada di server Spring Cloud Config

Anda dapat memvalidasi yang sama dari log Calcuation-Service ketika Anda memulai

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

dixit gangaiah
sumber
4

Baiklah, saya sepenuhnya setuju dengan jawaban yang sudah ada tentang hal ini:

  • bootstrap.ymldigunakan untuk menyimpan parameter yang menunjukkan di mana konfigurasi jarak jauh berada dan Konteks Aplikasi Bootstrap dibuat dengan konfigurasi jarak jauh ini.

Sebenarnya, ia juga dapat menyimpan properti normal sama seperti apa yang application.ymldilakukan. Tapi perhatikan hal rumit ini:

  • Jika Anda menempatkan properti di bootstrap.yml, mereka akan mendapatkan prioritas lebih rendah daripada hampir semua sumber properti lainnya, termasuk application.yml. Seperti dijelaskan di sini .

Mari kita perjelas, ada dua jenis properti yang terkait dengan bootstrap.yml:

  • Properti yang dimuat selama fase bootstrap. Kami menggunakan bootstrap.ymluntuk menemukan pemilik properti (Sistem file, git repositori atau sesuatu yang lain), dan properti yang kami dapatkan dengan cara ini adalah dengan prioritas tinggi, sehingga tidak dapat ditimpa oleh konfigurasi lokal. Seperti dijelaskan di sini .
  • Properti yang ada di bootstrap.yml. Seperti yang dijelaskan lebih awal, mereka akan mendapatkan prioritas lebih rendah. Gunakan mereka untuk mengatur default mungkin ide yang bagus.

Jadi perbedaan antara meletakkan properti di application.ymlatau bootstrap.ymldi boot musim semi adalah:

  • Properti untuk memuat file konfigurasi dalam fase bootstrap hanya dapat ditempatkan di bootstrap.yml.
  • Sedangkan untuk semua jenis properti lainnya, menempatkan mereka di application.ymlakan mendapatkan prioritas lebih tinggi.
Lebecca
sumber
3

Bootstrap.yml digunakan untuk mengambil konfigurasi dari server. Ini bisa untuk aplikasi cloud Spring atau untuk orang lain. Biasanya terlihat seperti:

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

Ketika kita memulai aplikasi itu mencoba untuk terhubung ke server yang diberikan dan membaca konfigurasi berdasarkan profil pegas yang disebutkan dalam konfigurasi run / debug. bootstrap.yml memuat yang pertama

Jika server adalah aplikasi yang tidak terjangkau bahkan mungkin tidak dapat melanjutkan lebih jauh. Namun, jika konfigurasi yang cocok dengan profil hadir secara lokal, konfigurasi server akan diganti.

Pendekatan yang baik:

Pertahankan profil terpisah untuk lokal dan jalankan aplikasi menggunakan profil yang berbeda.

Sudip Bhandari
sumber
1

Penggunaan lain untuk bootstrap.yml adalah untuk memuat konfigurasi dari kubernetes configmap dan sumber daya rahasia . Aplikasi harus mengimpor spring-cloud-starter-kubernetes dependensi .

Seperti dengan Spring Cloud Config, ini harus terjadi selama frase bootstrap.

Dari dokumen:

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

Jadi properti yang disimpan dalam sumber daya configmap dengan meta.name nama-default dapat dirujuk sama seperti properti di application.yml

Dan proses yang sama berlaku untuk rahasia:

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

Bootstrap.yml adalah file pertama yang dimuat saat Anda memulai pegas boot aplikasi dan application.property dimuat saat aplikasi dimulai. Jadi, Anda tetap, mungkin kredensial server konfigurasi Anda, dll., Di bootstrap.yml yang diperlukan saat memuat aplikasi dan kemudian di application.properti yang Anda simpan mungkin berupa URL basis data dll.

Anwar Sir
sumber