Konfigürasyon ve Profiller — Bu Değer Nereden Geldi?
Önce şunu oku: Auto-configuration — Bu Bean Nereden Geldi?
30 saniyede özet
Boot aynı ayarı birçok yerden okuyabilir ve sırada sonra gelen kazanır: komut satırı ortam değişkenini, o da dosyaları ezer. Adını yanlış yazdığın bir değişken ise hata vermez, sessizce yok sayılır.
Canlı sistemde ödeme 3 saniyede zaman aşımına uğruyor, oysa ayarlarda açıkça 5 saniye yazıyor. İki saat boyunca herkes aynı soruyu sordu: bu değer nereden geliyor?
-
Bayt: Ayarlarda açıkça beş saniye yazıyor, ama ödeme üç saniyede zaman aşımına uğruyor!
-
Sen: Belki başka bir yerde üç saniye yazıyordur?
-
Bayt: Boot aynı ayarı birçok yerden okur. Asıl soru hangisinin kazandığı.
-
Bayt: Mutfakta tarif, şefin notu ve müşterinin isteği çarpışırsa kim kazanır?
Kim kimi ezer?
Boot bir ayarı tek bir yerden okumaz: dosyalar, ortam değişkenleri, komut satırı. Bunların her birine property sourceSpring'in ayar okuduğu bir kaynak: application.yml, profil dosyası, ortam değişkenleri, komut satırı. Aynı anahtar birden çok kaynakta varsa önceliği yüksek olan kazanır.Sözlükte gör → denir; aynı ayar birden çok yerde varsa listede daha aşağıda olan kazanır.
Zayıftan güçlüye doğru sıra şöyle:
- Koddaki varsayılan (
@DefaultValue) application.ymlapplication-prod.ymlgibi profil dosyası- Ortam değişkenleri
- Komut satırı argümanları
Bu sıra sayesinde aynı imaj her ortamda, dosyaya dokunmadan ortam değişkenleriyle ayarlanır.
Kafam karıştı, daha basit anlat
Aynı ayar birkaç yerde yazılıysa, en güçlü yerdeki kazanır. Komut satırı dosyayı ezer. Böylece kodu değiştirmeden ortam ayarını değiştirebilirsin.
payment.timeout hem application.yml'de (2s) hem application-prod.yml'de (3s) tanımlı. prod profili aktif. Uygulama hangi değeri kullanır?
Aynı anahtar application-prod.yml'de, bir ortam değişkeninde ve komut satırında tanımlı. Öncelik sırası (yüksekten düşüğe) hangisi?
Ortam değişkeninin adı
application-prod.yml'de payment.timeout: 3s var. Kubernetes PAYMENT_TIMOUT=5s veriyor. Uygulama hangi değeri kullanır? Cevabı göster
3s. Değişkenin adı hiçbir property’ye eşlenmiyor. Boot onu sessizce yok sayar; ne hata ne uyarı.
Adım adım oku
- application.yml tarif kitabıdır: timeout iki saniye.
- Aktif profilin dosyası application-prod.yml onu ezer: üç saniye.
- Ortam değişkeni PAYMENT_TIMEOUT ikisini de ezer: beş saniye.
- Değişkenin adında bir harf eksikse Boot onu hiçbir ayara bağlamaz, uyarmaz da. Üç saniye sessizce kazanır.
relaxed bindingBoot'un aynı property'yi farklı yazımlarla eşleştirmesi: payment.timeout ile PAYMENT_TIMEOUT aynı alana bağlanır. Eşleşmeyen ad sessizce yok sayılır.Sözlükte gör → payment.timeout’u PAYMENT_TIMEOUT ile eşleştirir. Kural: noktalar alt çizgi olur, tireler silinir, harfler büyür. my-service.base-url için doğru ad MYSERVICE_BASEURL’dür.
Değerin gerçekte nereden geldiğini tahmin etme. /actuator/env/payment.timeout, değeri ve kaynağını gösterir.
Kafam karıştı, daha basit anlat
payment.timeout ayarı ortam değişkeninde PAYMENT_TIMEOUT olur: nokta alt çizgi olur, harfler büyür. Adı yanlış yazarsan Spring hiçbir şey demeden yok sayar.
my-service.base-url property'sini Kubernetes'te ortam değişkeniyle vermek istiyorsun. Değişkenin adı ne olmalı?
Kubernetes'te PAYMENT_TIMOUT=5s (yazım hatasıyla) tanımlandı. Uygulama ne yapar?
Kendin gör
payment.timeout kaç?
Tohum 71298- Komut satırı…
- Ortam değişkeni…
- application-prod.yml…
- application.yml…
- @DefaultValue (kod)…
Oynat ya da adımla.
Şu an ne oldu?
Kaynaklar düşükten yükseğe okunuyor
Aynı property birden çok yerde tanımlı olabilir. Boot hepsine bakar; sıralamada sonra gelen kazanır.
Görevler0/3
Ortam değişkeni verdiğin hâlde değer dosyadan gelsinaçık
İpucu
Değişkenin adına bak.
prod profili açıkken değeri ortam değişkeninden alaçık
İpucu
Doğru ad, komut satırı yok.
Her kaynak açıkken kimin kazandığını göraçık
İpucu
Profil, doğru ortam değişkeni ve komut satırı.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
- Varsayılanla oynat. Ortam değişkeni var ama değer dosyadan geldi.
- Değişkeni “PAYMENT_TIMEOUT=5s” yap. Ortam değişkeni kazandı.
- Komut satırını aç. Hepsini ezdi.
- Profili “Yok” yap, diğerlerini kapat. application.yml’e düştü.
Her ayarın nerede durması gerektiğini seç.
Tipli ayarlar ve profiller
@ConfigurationProperties bir önekin altındaki ayarları tek bir record’a bağlar. @Validated ile birlikte kullanınca eksik ya da geçersiz bir değer uygulamayı başlangıçta durdurur.
Bir profileOrtama göre değişen ayar ve bean kümesi. spring.profiles.active=prod, application-prod.yml dosyasını ve @Profile("prod") bean'lerini devreye alır.Sözlükte gör →, “şu an hangi ortamdayım?” sorusunun cevabıdır: dev, test, prod. Profil değişince hem ayar dosyası hem de yüklenen bean’ler değişebilir; @Profile("dev") bir bean’i yalnızca geliştirme ortamında yükler.
Kafam karıştı, daha basit anlat
Profil, “şu an neredeyim” sorusunun cevabıdır: dev, test ya da prod. Hangi ayarların ve hangi bean’lerin yükleneceğini o belirler.
application.yml'de payment.timeout: 5 yazıyor ve ekip 5 saniye beklediğini düşünüyor. Ödeme çağrıları anında timeout alıyor. Hatalı satır hangisi?
@Value("${payment.timeout}") yerine @ConfigurationProperties + @Validated kullanmanın en önemli kazancı hangisi?
Tuzaklar
Birimsiz süre. Duration’a bağlanan timeout: 5, beş milisaniyedir. Birimi değerin içine yaz: 5s.
Varsayılan olarak tehlikeli bean. @Profile("!prod") ile işaretli sahte ödeme servisi, profil unutulan her ortamda çalışır. Sahte olanı açık bir profile bağla.
Git’te parola. application-prod.yml bir sır saklama yeri değildir. Sırlar ortam değişkeni, Kubernetes Secret ya da bir secret yöneticisiyle gelir.
Aşağıdaki örnek bir e-ticaret şirketinin bankanın sanal POS’una bağlandığı ödeme servisinden. Ayarlar tek bir tipli record’da toplanıyor, başlangıçta doğrulanıyor ve her ortam yalnızca farkları veriyor.
Derinleş · Sanal POS entegrasyonunun ayarları: uçtan uca 6 dosya · ~95 satır · ilk okumada atlayabilirsin
Kendini sına
Aynı ayar birden fazla yerde varsa listede sonra gelen kazanır.
Kodda @Profile("!prod") ile işaretli bir FakePaymentGateway bean'i var. Bir ortamda profil yanlışlıkla ayarlanmadı. Ne olur?
Aklında kalacak üç şey
- 1 Aynı ayar birden çok yerde varsa önceliği yüksek olan kazanır: komut satırı, sonra ortam değişkeni, sonra profil dosyası, sonra application.yml.
- 2 Ortam değişkeninin adı Boot'un beklediği biçime uymazsa hiçbir ayara bağlanmaz ve hiçbir hata görünmez.
- 3 @ConfigurationProperties ile @Validated, hatalı bir ayarı ilk kullanıcı isteğinde değil, uygulama açılırken yakalar.
5 kart sonraki derste seni bekliyor