Mikroservislarni ishlab chiqish va keyinchalik ulardan foydalanishdagi asosiy muammolardan biri ularning namunalarini to'g'ri va aniq sozlashdir. Menimcha, yangi ramka bunga yordam berishi mumkin. Bu sizga ba'zi muntazam dastur konfiguratsiyasi vazifalarini juda oqlangan tarzda hal qilish imkonini beradi.
Agar sizda ko'plab mikroservislar mavjud bo'lsa, ularning har biri o'z konfiguratsiya fayl(lar)iga ega bo'lsa, ulardan birida xatolik paydo bo'lish xavfi yuqori bo'lib, tegishli treningsiz va ro'yxatga olish tizimisiz ushlash juda qiyin bo'lishi mumkin. Ramkaning asosiy maqsadi takroriy nusxa konfiguratsiya parametrlarini minimallashtirish va shu bilan xatolarni kiritish ehtimolini kamaytirishdir.
Keling, bir misolni ko'rib chiqaylik. Faraz qilaylik, konfiguratsiya fayliga ega oddiy dastur mavjud. yamlBu har qanday tildagi har qanday mikroservis bo'lishi mumkin. Keling, ushbu xizmatga ramka qanday qo'llanilishi mumkinligini ko'rib chiqaylik.
Ammo, avvalo, yanada qulayroq bo'lishi uchun, avval microconfig.io plaginini o'rnatgan holda Idea IDE-da bo'sh loyiha yarataylik:

Biz plaginni ishga tushirish konfiguratsiyasini sozlaymiz; yuqoridagi skrinshotda bo'lgani kabi standart konfiguratsiyadan foydalanishingiz mumkin.
Bizning xizmatimiz buyurtma deb ataladi, shuning uchun yangi loyihada biz shunga o'xshash tuzilmani yaratamiz:

Konfiguratsiya faylini xizmat nomi bilan papkaga joylashtiring - ilova.yamlBarcha mikroservislar qandaydir muhitda ishlaydi, shuning uchun xizmat konfiguratsiyasini o'zi yaratishdan tashqari, biz muhitning o'zini tasvirlashimiz kerak: buning uchun biz papka yaratamiz. envs va ish muhitimiz nomi bilan faylni qo'shing. Shunday qilib, ramka muhitdagi xizmatlar uchun konfiguratsiya fayllarini yaratadi. ulkan, chunki bu parametr plagin sozlamalarida o'rnatilgan.
Fayl tuzilishi dev.yaml juda oddiy bo'ladi:
mainorder:
components:
- orderRamka birgalikda guruhlangan konfiguratsiyalar bilan ishlaydi. Xizmatimiz uchun guruh nomini tanlaylik. asosiy tartibRamka har bir bunday ilovalar guruhini muhit faylida topadi va ularning barchasi uchun mos keladigan papkalarda topadigan konfiguratsiyalarni yaratadi.
Xizmat sozlamalari faylining o'zida tartib Hozircha faqat bitta parametrni belgilaymiz:
spring.application.name: orderEndi plaginni ishga tushiramiz va u xususiyatlarda ko'rsatilgan yo'lda xizmatimiz uchun kerakli konfiguratsiyani yaratadi:

mumkin va plaginni o'rnatmasdan, shunchaki ramka taqsimotini yuklab oling va uni buyruq satridan ishga tushiring.
Ushbu yechim qurilish serverida foydalanish uchun javob beradi.
Shuni ta'kidlash kerakki, ramka mukammal tushunadi mulk sintaksis, ya'ni birgalikda ishlatilishi mumkin bo'lgan oddiy xususiyat fayllari yaml konfiguratsiyalar.
Keling, yana bitta xizmatni qo'shamiz to'lov va bir vaqtning o'zida mavjudni murakkablashtiradi.
В tartib:
eureka:
instance.preferIpAddress: true
client:
serviceUrl:
defaultZone: http://192.89.89.111:6782/eureka/
server.port: 9999
spring.application.name: order
db.url: 192.168.0.100В to'lov:
eureka:
instance.preferIpAddress: true
client:
serviceUrl:
defaultZone: http://192.89.89.111:6782/eureka/
server.port: 9998
spring.application.name: payments
db.url: 192.168.0.100Ushbu konfiguratsiyalar bilan bog'liq asosiy muammo - bu xizmat sozlamalarida nusxa ko'chirishning katta miqdori. Keling, ramka buni bartaraf etishga qanday yordam berishini ko'rib chiqaylik. Eng aniq narsadan boshlaylik: konfiguratsiya mavjudligi. eureka har bir mikroservis tavsifida. Sozlamalar fayli bilan yangi katalog yaratamiz va unga yangi konfiguratsiya qo'shamiz:

Va endi biz har bir loyihamizga qator qo'shamiz. #evrikani o'z ichiga oladi.
Ramka avtomatik ravishda evrika konfiguratsiyasini topadi va uni xizmat konfiguratsiya fayllariga ko'chiradi, lekin biz uni muhit faylida ko'rsatmaganimiz uchun alohida evrika konfiguratsiyasi yaratilmaydi. dev.yaml. Xizmat tartib:
#include eureka
server.port: 9999
spring.application.name: order
db.url: 192.168.0.100Import qatorini oʻzgartirish orqali maʼlumotlar bazasi sozlamalarini alohida konfiguratsiyaga ham koʻchirishimiz mumkin #eureka, oracle kiradi.
Shuni ta'kidlash kerakki, ramka konfiguratsiya fayllarini qayta tiklashda qilingan har bir o'zgarishlarni kuzatib boradi va uni asosiy konfiguratsiya fayli yonidagi maxsus faylga joylashtiradi. Uning jurnalidagi yozuv quyidagicha ko'rinadi: "Saqlangan 1 xususiyat o'zgaradi order/diff-application.yaml”. Bu sizga katta konfiguratsiya fayllaridagi o'zgarishlarni tezda aniqlash imkonini beradi.
Umumiy konfiguratsiya qismlarini olib tashlash juda koʻp keraksiz nusxa koʻchirish va joylashtirishni yoʻq qiladi, lekin bu turli muhitlar uchun moslashuvchan konfiguratsiyaga ruxsat bermaydi — xizmatlarimizning soʻnggi nuqtalari bir tomonlama va qattiq kodlangan, bu yomon. Keling, buni bartaraf etishga harakat qilaylik.
Yaxshi yechim barcha so'nggi nuqtalarni boshqalar murojaat qilishi mumkin bo'lgan yagona konfiguratsiyada saqlashdir. Shu maqsadda, ramka to'ldiruvchilarni qo'llab-quvvatlashni amalga oshirdi. Bu erda konfiguratsiya fayli qanday o'zgarishi mumkin. eureka:
client:
serviceUrl:
defaultZone: http://${endpoints@eurekaip}:6782/eureka/Keling, ushbu to'ldiruvchi qanday ishlashini ko'rib chiqaylik. Tizim nomli komponentni topadi so'nggi nuqtalar va unda ma'no izlaydi evrikaip, va keyin uni konfiguratsiyamizga kiritadi. Ammo turli muhitlar haqida nima deyish mumkin? Buning uchun sozlamalar faylini yaratamiz so'nggi nuqtalar quyidagi turdagi application.dev.yamlRamka fayl kengaytmasiga asoslanib, berilgan konfiguratsiya qaysi muhitga tegishli ekanligini mustaqil ravishda hal qiladi va uni yuklaydi:

Dev faylining tarkibi:
eurekaip: 192.89.89.111
dbip: 192.168.0.100Xizmatlarimiz portlari uchun bir xil konfiguratsiyani yaratishimiz mumkin:
server.port: ${ports@order}.Barcha muhim sozlamalar bir joyda joylashgan bo'lib, parametrlar konfiguratsiya fayllari bo'ylab tarqalib ketganligi sababli xatolar ehtimolini kamaytiradi.
Ramka ko'plab tayyor to'ldiruvchilarni taqdim etadi, masalan, siz konfiguratsiya fayli joylashgan katalog nomini olishingiz va uni belgilashingiz mumkin:
#include eureka, oracle
server.port: ${ports@order}
spring.application.name: ${this@name}Buning yordamida konfiguratsiyada ilova nomini qo'shimcha ravishda ko'rsatishning hojati yo'q va uni umumiy modulga, masalan, bir xil evrikaga ko'chirish ham mumkin:
client:
serviceUrl:
defaultZone: http://${endpoints@eurekaip}:6782/eureka/
spring.application.name: ${this@name}Konfiguratsiya fayli tartib bir qatorga qisqartiriladi:
#include eureka, oracle
server.port: ${ports@order}Agar bizga ota-ona konfiguratsiyasidan sozlama kerak bo'lmasa, biz uni konfiguratsiyamizda belgilashimiz mumkin va u yaratish jarayonida qo'llaniladi. Shunday qilib, agar biron sababga ko'ra buyurtma xizmati uchun noyob nom kerak bo'lsa, biz shunchaki parametrni qoldiramiz. bahor.ilova.nomi.
Aytaylik, xizmatga alohida faylda saqlanadigan moslashtirilgan jurnal sozlamalarini qo'shishingiz kerak, masalan, logback.xmlBuning uchun alohida sozlamalar guruhini yaratamiz:

Asosiy konfiguratsiyada biz kerakli ro'yxatga olish sozlamalari faylini to'ldiruvchi yordamida qaerga joylashtirishni ramkaga aytamiz @ConfigDir:
microconfig.template.logback.fromFile: ${logback@configDir}/logback.xmlFayl ichida logback.xml Biz standart qo'shimchalarni sozlaymiz, ular o'z navbatida konfiguratsiyani yaratish jarayonida ramka o'zgaradigan to'ldiruvchilarni ham o'z ichiga olishi mumkin, masalan:
<file>logs/${this@name}.log</file>Xizmat konfiguratsiyalariga import qo'shilmoqda logback, biz har bir xizmat uchun avtomatik ravishda sozlangan jurnalni olamiz:
#include eureka, oracle, logback
server.port: ${ports@order}Frameworkning barcha mavjud to'ldiruvchilarini batafsil ko'rib chiqish vaqti keldi:
${this@env} — joriy muhit nomini qaytaradi.
${…@name} — komponent nomini qaytaradi.
${…@configDir} — komponentning konfiguratsiya katalogiga toʻliq yoʻlni qaytaradi.
${…@resultDir} — komponentning maqsadli katalogiga toʻliq yoʻlni qaytaradi (natijadagi fayllar ushbu katalogga joylashtiriladi).
${this@configRoot} — konfiguratsiya xotirasining ildiz katalogiga toʻliq yoʻlni qaytaradi.
Tizim, shuningdek, Java-ga yo'l kabi muhit o'zgaruvchilarini olish imkonini beradi:
${env@JAVA_HOME}
Yoki, ramka yozilganligi sababli JAVA, biz qo'ng'iroqqa o'xshash tizim o'zgaruvchilarini olishimiz mumkin System::getProperty Ushbu turdagi konstruktsiyadan foydalanish:
${system@os.name}
Kengaytma tilini qo'llab-quvvatlashni ta'kidlash kerak Bahor ELKonfiguratsiyada quyidagi iboralar qo'llaniladi:
connection.timeoutInMs: #{5 * 60 * 1000}
datasource.maximum-pool-size: #{${this@datasource.minimum-pool-size} + 10} va ifoda yordamida konfiguratsiya fayllarida mahalliy o'zgaruvchilardan foydalanishingiz mumkin #var:
#var feedRoot: ${system@user.home}/feed
folder:
root: ${this@feedRoot}
success: ${this@feedRoot}/archive
error: ${this@feedRoot}/errorShunday qilib, ramka nozik sozlash va moslashuvchan mikroservis konfiguratsiyasi uchun juda kuchli vositadir. Ramka o'zining asosiy maqsadini mukammal darajada bajaradi - nusxa ko'chirish va joylashtirish konfiguratsiyasini yo'q qilish, sozlamalarni birlashtirish va natijada yuzaga kelishi mumkin bo'lgan xatolarni minimallashtirish - shu bilan birga turli xil muhitlar uchun oson konfiguratsiya kombinatsiyalari va moslashtirish imkonini beradi.
Agar siz ushbu ramka bilan qiziqsangiz, uning rasmiy sahifasiga tashrif buyurishni va to'liq tanishishni tavsiya qilaman , yoki manba kodini qazib oling .
Manba: www.habr.com
