ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ° конфигурация Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° систСма

Π’ Ρ‚Π°Π·ΠΈ публикация Π±ΠΈΡ…ΠΌΠ΅ искали Π΄Π° сподСлим Π΅Π΄ΠΈΠ½ интСрСсСн Π½Π°Ρ‡ΠΈΠ½ Π·Π° справянС с конфигурацията Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° систСма.
ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡΡ‚Π° Π΅ прСдставСна Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π½Π° Π΅Π·ΠΈΠΊΠ° Scala ΠΏΠΎ бСзопасСн Ρ‚ΠΈΠΏ Π½Π°Ρ‡ΠΈΠ½. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ изпълнСниС Π΅ описано ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ. ΠžΠ±ΡΡŠΠΆΠ΄Π°Ρ‚ сС Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ аспСкти Π½Π° ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ влияниС Π²ΡŠΡ€Ρ…Ρƒ цялостния процСс Π½Π° Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅.

ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ° конфигурация Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° систСма

(Π½Π° руски Π΅Π·ΠΈΠΊ)

Π’ΡŠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅

Π˜Π·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Π½Π° стабилни Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ систСми изисква ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»Π½Π° ΠΈ ΡΡŠΠ³Π»Π°ΡΡƒΠ²Π°Π½Π° конфигурация Π½Π° всички възли. Π’ΠΈΠΏΠΈΡ‡Π½ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° тСкстово описаниС Π½Π° внСдряванС (Ρ‚Π΅Ρ€Π°Ρ„ΠΎΡ€ΠΌΠ°, анзибъл ΠΈΠ»ΠΈ Π½Π΅Ρ‰ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ) ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ (чСсто β€” ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈ Π·Π° всСки възСл/роля). Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Π±ΠΈΡ…ΠΌΠ΅ искали Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π΅Π΄Π½ΠΈ ΠΈ ΡΡŠΡ‰ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΈ ΠΎΡ‚ Π΅Π΄Π½ΠΈ ΠΈ ΡΡŠΡ‰ΠΈ вСрсии Π½Π° всСки ΠΊΠΎΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π΅Π½ възСл (Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π΅Π½ случай Ρ‰Π΅ ΠΈΠ·ΠΏΠΈΡ‚Π°ΠΌΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ с Π½Π΅ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚Ρ‚Π°). Π’ свСта Π½Π° JVM Ρ‚ΠΎΠ²Π° ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ ΠΏΠΎΠ½Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Π·Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ трябва Π΄Π° бъдС с Π΅Π΄Π½Π° ΠΈ ΡΡŠΡ‰Π° вСрсия Π½Π° всички ΠΊΠΎΠΌΡƒΠ½ΠΈΠΊΠΈΡ€Π°Ρ‰ΠΈ възли.

Какво Ρ‰Π΅ ΠΊΠ°ΠΆΠ΅Ρ‚Π΅ Π·Π° тСстванСто Π½Π° систСмата? Π Π°Π·Π±ΠΈΡ€Π° сС, трябва Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ ΠΌΠΎΠ΄ΡƒΠ»Π½ΠΈ тСстовС Π·Π° всички ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ, ΠΏΡ€Π΅Π΄ΠΈ Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌ към ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ тСстовС. Π—Π° Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° СкстраполирамС Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ ΠΎΡ‚ тСстовСтС ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° изпълнСниС, трябва Π΄Π° смС сигурни, Ρ‡Π΅ вСрсиитС Π½Π° всички Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ сС ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΈ ΠΊΠ°ΠΊΡ‚ΠΎ Π² срСдата Π½Π° изпълнСниС, Ρ‚Π°ΠΊΠ° ΠΈ Π² срСдата Π·Π° тСстванС.

ΠšΠΎΠ³Π°Ρ‚ΠΎ ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚Π΅ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ тСстовС, чСсто Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-лСсно Π΄Π° ΠΈΠΌΠ°Ρ‚Π΅ Π΅Π΄Π½Π° ΠΈ ΡΡŠΡ‰Π° ΠΏΡŠΡ‚Π΅ΠΊΠ° Π½Π° класа Π½Π° всички възли. ΠŸΡ€ΠΎΡΡ‚ΠΎ трябва Π΄Π° сС ΡƒΠ²Π΅Ρ€ΠΈΠΌ, Ρ‡Π΅ ΠΏΡ€ΠΈ внСдряванСто сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΡŠΡ‰Π°Ρ‚Π° ΠΏΡŠΡ‚Π΅ΠΊΠ° към класа. (Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΏΡŠΡ‚Π΅ΠΊΠΈ Π½Π° класовС Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ възли, Π½ΠΎ Π΅ ΠΏΠΎ-Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π΄Π° сС прСдстави Ρ‚Π°Π·ΠΈ конфигурация ΠΈ Π΄Π° сС Ρ€Π°Π·Π³ΡŠΡ€Π½Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ.) Π’Π°ΠΊΠ° Ρ‡Π΅, Π·Π° Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈΠΌ Π½Π΅Ρ‰Π°Ρ‚Π° прости, Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ само ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΈ ΠΏΡŠΡ‚Π΅ΠΊΠΈ Π½Π° класовС Π½Π° всички възли.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡΡ‚Π° ΠΈΠΌΠ° тСндСнция Π΄Π° сС Ρ€Π°Π·Π²ΠΈΠ²Π° Π·Π°Π΅Π΄Π½ΠΎ със софтуСра. ОбикновСно ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ вСрсии, Π·Π° Π΄Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°ΠΌΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ
Π΅Ρ‚Π°ΠΏΠΈ ΠΎΡ‚ Π΅Π²ΠΎΠ»ΡŽΡ†ΠΈΡΡ‚Π° Π½Π° софтуСра. ИзглСТда Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ Π΄Π° сС ΠΎΠ±Ρ…Π²Π°Π½Π΅ конфигурацията Π² ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° вСрсиитС ΠΈ Π΄Π° сС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ с някои Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚ΠΈ. Ако ΠΈΠΌΠ° само Π΅Π΄Π½Π° конфигурация Π² производство, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π΅Π΄Π½Π° вСрсия ΠΊΠ°Ρ‚ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€. Понякога ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ мноТСство производствСни срСди. И Π·Π° всяка срСда ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½ΡƒΠΆΠ΄Π°Π΅ΠΌ ΠΎΡ‚ ΠΎΡ‚Π΄Π΅Π»Π΅Π½ ΠΊΠ»ΠΎΠ½ Π½Π° конфигурация. Π’Π°ΠΊΠ° Ρ‡Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈΡ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚ΠΈΡ€Π°Π½ΠΈ с ΠΊΠ»ΠΎΠ½ ΠΈ вСрсия, Π·Π° Π΄Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Ρ‚ ΡƒΠ½ΠΈΠΊΠ°Π»Π½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈΡ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. ВсСки Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚ ΠΈ вСрсия Π½Π° ΠΊΠ»ΠΎΠ½ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π° Π½Π° Π΅Π΄Π½Π° СдинствСна комбинация ΠΎΡ‚ Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ възли, ΠΏΠΎΡ€Ρ‚ΠΎΠ²Π΅, външни рСсурси, вСрсии Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π½Π° ΠΏΡŠΡ‚Ρ Π½Π° класа Π½Π° всСки възСл. Π’ΡƒΠΊ Ρ‰Π΅ ΠΏΠΎΠΊΡ€ΠΈΠ΅ΠΌ само Сдиничния ΠΊΠ»ΠΎΠ½ ΠΈ Ρ‰Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°ΠΌΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈΡ‚Π΅ Ρ‡Ρ€Π΅Π· Ρ‚Ρ€ΠΈΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π½Π° дСсСтична вСрсия (1.2.3), ΠΏΠΎ ΡΡŠΡ‰ΠΈΡ Π½Π°Ρ‡ΠΈΠ½, ΠΊΠ°ΠΊΡ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΈ.

Π’ ΡΡŠΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΈΡ‚Π΅ срСди ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π²Π΅Ρ‡Π΅ Π½Π΅ сС промСнят Ρ€ΡŠΡ‡Π½ΠΎ. ОбикновСно Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΠΌΠ΅
ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° внСдряванС ΠΈ Π½ΠΈΠΊΠΎΠ³Π° Π½Π΅ Π³ΠΈ докосвай слСд Ρ‚ΠΎΠ²Π°. Π’Π°ΠΊΠ° Ρ‡Π΅ някой ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΠΏΠΈΡ‚Π° Π·Π°Ρ‰ΠΎ всС ΠΎΡ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ тСкстов Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π·Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅? ЖизнСспособна опция Π΅ Π΄Π° поставитС конфигурацията Π² ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Ρ‰ ΠΌΠΎΠ΄ΡƒΠ» ΠΈ Π΄Π° сС Π²ΡŠΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ ΠΎΡ‚ Π²Π°Π»ΠΈΠ΄ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° конфигурацията ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° компилация.

Π’ Ρ‚Π°Π·ΠΈ публикация Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ идСята Π·Π° Π·Π°ΠΏΠ°Π·Π²Π°Π½Π΅ Π½Π° конфигурацията Π² компилирания Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚.

ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ° конфигурация

Π’ Ρ‚ΠΎΠ·ΠΈ Ρ€Π°Π·Π΄Π΅Π» Ρ‰Π΅ обсъдим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° статична конфигурация. Π”Π²Π΅ прости услуги - услугата Π΅Ρ…ΠΎ ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡŠΡ‚ Π½Π° услугата Π΅Ρ…ΠΎ сС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ‚ ΠΈ внСдряват. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° сС ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚ Π΄Π²Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ систСми с Π΄Π²Π΅Ρ‚Π΅ услуги. Единият Π΅ Π·Π° конфигурация с Π΅Π΄ΠΈΠ½ възСл, Π° другият Π·Π° конфигурация с Π΄Π²Π° възСла.

Π’ΠΈΠΏΠΈΡ‡Π½Π°Ρ‚Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° систСма сС ΡΡŠΡΡ‚ΠΎΠΈ ΠΎΡ‚ няколко възСла. Π’ΡŠΠ·Π»ΠΈΡ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½ΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° някакъв Ρ‚ΠΈΠΏ:

sealed trait NodeId
case object Backend extends NodeId
case object Frontend extends NodeId

ΠΈΠ»ΠΈ просто

case class NodeId(hostName: String)

ΠΈΠ»ΠΈ Π΄ΠΎΡ€ΠΈ

object Singleton
type NodeId = Singleton.type

Π’Π΅Π·ΠΈ възли ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ€ΠΎΠ»ΠΈ, ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚ някои услуги ΠΈ трябва Π΄Π° ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° ΠΊΠΎΠΌΡƒΠ½ΠΈΠΊΠΈΡ€Π°Ρ‚ с Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ възли посрСдством TCP/HTTP Π²Ρ€ΡŠΠ·ΠΊΠΈ.

Π—Π° TCP Π²Ρ€ΡŠΠ·ΠΊΠ° Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ ΠΏΠΎΠ½Π΅ Π½ΠΎΠΌΠ΅Ρ€ Π½Π° ΠΏΠΎΡ€Ρ‚. Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° искамС Π΄Π° смС сигурни, Ρ‡Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ ΡΡŠΡ€Π²ΡŠΡ€ говорят ΠΏΠΎ Π΅Π΄ΠΈΠ½ ΠΈ ΡΡŠΡ‰ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ». Π—Π° Π΄Π° ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€Π°ΠΌΠ΅ Π²Ρ€ΡŠΠ·ΠΊΠ° ΠΌΠ΅ΠΆΠ΄Ρƒ възли, Π½Π΅ΠΊΠ° Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π°ΠΌΠ΅ слСдния клас:

case class TcpEndPoint[Protocol](node: NodeId, port: Port[Protocol])

ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ Port Π΅ просто Int Π² допустимия Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½:

type PortNumber = Refined[Int, Closed[_0, W.`65535`.T]]

Изискани видовС

Π²ΠΈΠΆΠ΄Π°ΠΌ Ρ€Π°Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°. Накратко, позволява Π΄Π° сС добавят ограничСния във Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π΅ към Π΄Ρ€ΡƒΠ³ΠΈ Ρ‚ΠΈΠΏΠΎΠ²Π΅. Π’ Ρ‚Π°ΠΊΡŠΠ² случай Int Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»Π΅Π½ΠΎ Π΄Π° ΠΈΠΌΠ° само 16-Π±ΠΈΡ‚ΠΎΠ²ΠΈ стойности, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° прСдставляват Π½ΠΎΠΌΠ΅Ρ€ Π½Π° ΠΏΠΎΡ€Ρ‚. Няма изискванС Ρ‚Π°Π·ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° Ρ‚ΠΎΠ·ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π΅Π½ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄. ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°, Ρ‡Π΅ стои ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠ±Ρ€Π΅.

Π—Π° HTTP (REST) ​​моТС Π΄Π° сС Π½ΡƒΠΆΠ΄Π°Π΅ΠΌ ΠΈ ΠΎΡ‚ ΠΏΡŠΡ‚ Π½Π° услугата:

type UrlPathPrefix = Refined[String, MatchesRegex[W.`"[a-zA-Z_0-9/]*"`.T]]
case class PortWithPrefix[Protocol](portNumber: PortNumber, pathPrefix: UrlPathPrefix)

Π’ΠΈΠΏ Ρ„Π°Π½Ρ‚ΠΎΠΌ

Π—Π° Π΄Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°ΠΌΠ΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° компилация, Π½ΠΈΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ функцията Π½Π° Scala Π·Π° Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ‚ΠΈΠΏ Protocol ΠΊΠΎΠΉΡ‚ΠΎ Π½Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² класа. Π’ΠΎΠ²Π° Π΅ Ρ‚.Π½Π°Ρ€ Ρ„Π°Π½Ρ‚ΠΎΠΌΠ΅Π½ Ρ‚ΠΈΠΏ. По Π²Ρ€Π΅ΠΌΠ΅ Π½Π° изпълнСниС рядко сС Π½ΡƒΠΆΠ΄Π°Π΅ΠΌ ΠΎΡ‚ СкзСмпляр Π½Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ», Π·Π°Ρ‚ΠΎΠ²Π° Π½Π΅ Π³ΠΎ ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°ΠΌΠ΅. По Π²Ρ€Π΅ΠΌΠ΅ Π½Π° компилация Ρ‚ΠΎΠ·ΠΈ Ρ‚ΠΈΠΏ Ρ„Π°Π½Ρ‚ΠΎΠΌ осигурява Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½Π° бСзопасност Π½Π° Ρ‚ΠΈΠΏΠ°. НС ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌ ΠΏΠΎΡ€Ρ‚ с Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π΅Π½ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ».

Π•Π΄ΠΈΠ½ ΠΎΡ‚ Π½Π°ΠΉ-ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΈ Π΅ REST API с Json сСриализация:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ RequestMessage Π΅ основният Ρ‚ΠΈΠΏ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡŠΡ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·ΠΏΡ€Π°Ρ‚ΠΈ Π΄ΠΎ ΡΡŠΡ€Π²ΡŠΡ€Π° ΠΈ ResponseMessage Π΅ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π·Π° ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ ΠΎΡ‚ ΡΡŠΡ€Π²ΡŠΡ€Π°. Π Π°Π·Π±ΠΈΡ€Π° сС, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° създадСм Π΄Ρ€ΡƒΠ³ΠΈ описания Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ опрСдСлят комуникационния ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» с ΠΆΠ΅Π»Π°Π½Π°Ρ‚Π° точност.

Π—Π° Ρ†Π΅Π»ΠΈΡ‚Π΅ Π½Π° Ρ‚Π°Π·ΠΈ публикация Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΏΠΎ-проста вСрсия Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°:

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

Π’ Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π·Π° заявка сС добавя към url ΠΈ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π·Π° ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ сС Π²Ρ€ΡŠΡ‰Π° ΠΊΠ°Ρ‚ΠΎ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ Π½ΠΈΠ·.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡΡ‚Π° Π½Π° услуга ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС описана Ρ‡Ρ€Π΅Π· ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° услугата, колСкция ΠΎΡ‚ ΠΏΠΎΡ€Ρ‚ΠΎΠ²Π΅ ΠΈ някои зависимости. Има няколко възмоТни Π½Π°Ρ‡ΠΈΠ½Π° Π·Π° прСдставянС Π½Π° всички Ρ‚Π΅Π·ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ Π² Scala (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, HList, Π°Π»Π³Π΅Π±Ρ€ΠΈΡ‡Π½ΠΈ Ρ‚ΠΈΠΏΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ). Π—Π° Ρ†Π΅Π»ΠΈΡ‚Π΅ Π½Π° Ρ‚Π°Π·ΠΈ публикация Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Cake Pattern ΠΈ Ρ‰Π΅ прСдставим ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°Π½ΠΈ части (ΠΌΠΎΠ΄ΡƒΠ»ΠΈ) ΠΊΠ°Ρ‚ΠΎ характСристики. (Cake Pattern Π½Π΅ Π΅ изискванС Π·Π° Ρ‚ΠΎΠ·ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π΅Π½ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄. Π’ΠΎΠ²Π° Π΅ само Π΅Π΄Π½Π° възмоТна рСализация Π½Π° идСята.)

ЗависимоститС ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ прСдставСни с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Cake Pattern ΠΊΠ°Ρ‚ΠΎ ΠΊΡ€Π°ΠΉΠ½ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈ възли:

  type EchoProtocol[A] = SimpleHttpGetRest[A, A]

  trait EchoConfig[A] extends ServiceConfig {
    def portNumber: PortNumber = 8081
    def echoPort: PortWithPrefix[EchoProtocol[A]] = PortWithPrefix[EchoProtocol[A]](portNumber, "echo")
    def echoService: HttpSimpleGetEndPoint[NodeId, EchoProtocol[A]] = providedSimpleService(echoPort)
  }

Услугата Echo сС Π½ΡƒΠΆΠ΄Π°Π΅ само ΠΎΡ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ ΠΏΠΎΡ€Ρ‚. И Π½ΠΈΠ΅ Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π°ΠΌΠ΅, Ρ‡Π΅ Ρ‚ΠΎΠ·ΠΈ ΠΏΠΎΡ€Ρ‚ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° Π΅Ρ…ΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ». ΠžΠ±ΡŠΡ€Π½Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Π΅ Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡƒΠΊΠ°Π·Π²Π°ΠΌΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π΅Π½ ΠΏΠΎΡ€Ρ‚ Π² Ρ‚ΠΎΠ·ΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ‚, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ характСристикитС позволяват Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ Π½Π° абстрактни ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ. Ако ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ абстрактни ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ, ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€ΡŠΡ‚ Ρ‰Π΅ изисква внСдряванС Π² СкзСмпляр Π½Π° конфигурация. Π’ΡƒΠΊ смС прСдоставили ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ (8081) ΠΈ Ρ‰Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ°Ρ‚ΠΎ стойност ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅, Π°ΠΊΠΎ Π³ΠΎ пропуснСм Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π° конфигурация.

МоТСм Π΄Π° Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π°ΠΌΠ΅ зависимост Π² конфигурацията Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π½Π° Π΅Ρ…ΠΎ услугата:

  trait EchoClientConfig[A] {
    def testMessage: String = "test"
    def pollInterval: FiniteDuration
    def echoServiceDependency: HttpSimpleGetEndPoint[_, EchoProtocol[A]]
  }

Зависимостта ΠΈΠΌΠ° ΡΡŠΡ‰ΠΈΡ Ρ‚ΠΈΠΏ ΠΊΠ°Ρ‚ΠΎ echoService. По-спСциално, Ρ‚ΠΎΠΉ изисква ΡΡŠΡ‰ΠΈΡ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ». Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° смС сигурни, Ρ‡Π΅ Π°ΠΊΠΎ ΡΠ²ΡŠΡ€ΠΆΠ΅ΠΌ Ρ‚Π΅Π·ΠΈ Π΄Π²Π΅ зависимости, Ρ‚Π΅ Ρ‰Π΅ работят ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ.

ИзпълнСниС Π½Π° услугитС

Π•Π΄Π½Π° услуга сС Π½ΡƒΠΆΠ΄Π°Π΅ ΠΎΡ‚ функция Π·Π° стартиранС ΠΈ Π΅Π»Π΅Π³Π°Π½Ρ‚Π½ΠΎ ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅. (Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Π·Π° ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅ Π½Π° услуга Π΅ ΠΎΡ‚ Ρ€Π΅ΡˆΠ°Π²Π°Ρ‰ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π·Π° тСстванС.) ΠžΡ‚Π½ΠΎΠ²ΠΎ ΠΈΠΌΠ° няколко ΠΎΠΏΡ†ΠΈΠΈ Π·Π° ΡƒΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° Ρ‚Π°ΠΊΠ°Π²Π° функция Π·Π° Π΄Π°Π΄Π΅Π½Π° конфигурация (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Ρ‚ΠΈΠΏΠΎΠ²ΠΈ класовС). Π—Π° Ρ‚Π°Π·ΠΈ публикация Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΎΡ‚Π½ΠΎΠ²ΠΎ Cake Pattern. МоТСм Π΄Π° прСдставим услуга, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ cats.Resource ΠΊΠΎΠΉΡ‚ΠΎ Π²Π΅Ρ‡Π΅ осигурява скоби ΠΈ освобоТдаванС Π½Π° рСсурси. Π—Π° Π΄Π° ΠΏΡ€ΠΈΠ΄ΠΎΠ±ΠΈΠ΅ΠΌ рСсурс, трябва Π΄Π° прСдоставим конфигурация ΠΈ някакъв контСкст Π½Π° изпълнСниС. Π’Π°ΠΊΠ° Ρ‡Π΅ функцията Π·Π° стартиранС Π½Π° услугата ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Ρ‚Π°ΠΊΠ°:

  type ResourceReader[F[_], Config, A] = Reader[Config, Resource[F, A]]

  trait ServiceImpl[F[_]] {
    type Config
    def resource(
      implicit
      resolver: AddressResolver[F],
      timer: Timer[F],
      contextShift: ContextShift[F],
      ec: ExecutionContext,
      applicative: Applicative[F]
    ): ResourceReader[F, Config, Unit]
  }

ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ

  • Config β€” Ρ‚ΠΈΠΏ конфигурация, която сС изисква ΠΎΡ‚ Ρ‚ΠΎΠ·ΠΈ стартСр Π½Π° услугата
  • AddressResolver β€” ΠΎΠ±Π΅ΠΊΡ‚ Π·Π° изпълнСниС, ΠΊΠΎΠΉΡ‚ΠΎ ΠΈΠΌΠ° способността Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π° Ρ€Π΅Π°Π»Π½ΠΈ адрСси Π½Π° Π΄Ρ€ΡƒΠ³ΠΈ възли (ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ΅Ρ‚Π΅ Π΄Π° Ρ‡Π΅Ρ‚Π΅Ρ‚Π΅ Π·Π° подробности).

Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ Π²ΠΈΠ΄ΠΎΠ²Π΅ ΠΈΠ΄Π²Π°Ρ‚ ΠΎΡ‚ cats:

  • F[_] β€” Ρ‚ΠΈΠΏ Π΅Ρ„Π΅ΠΊΡ‚ (Π’ Π½Π°ΠΉ-простия случай F[A] ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС просто () => A. Π’ Ρ‚Π°Π·ΠΈ публикация Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ cats.IO.)
  • Reader[A,B] β€” Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΈΠ»ΠΈ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ синоним Π½Π° функция A => B
  • cats.Resource β€” ΠΈΠΌΠ° Π½Π°Ρ‡ΠΈΠ½ΠΈ Π·Π° ΠΏΡ€ΠΈΠ΄ΠΎΠ±ΠΈΠ²Π°Π½Π΅ ΠΈ освобоТдаванС
  • Timer β€” позволява заспиванС/ΠΈΠ·ΠΌΠ΅Ρ€Π²Π°Π½Π΅ Π½Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ
  • ContextShift - Π°Π½Π°Π»ΠΎΠ³ Π½Π° ExecutionContext
  • Applicative β€” ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° Π½Π° дСйстващи Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΌΠΎΠ½Π°Π΄Π°) (Π² ΠΊΡ€Π°ΠΉΠ½Π° смСтка ΠΌΠΎΠΆΠ΅ Π΄Π° я Π·Π°ΠΌΠ΅Π½ΠΈΠΌ с Π½Π΅Ρ‰ΠΎ Π΄Ρ€ΡƒΠ³ΠΎ)

Π‘ ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Ρ‚ΠΎΠ·ΠΈ интСрфСйс ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ няколко услуги. НапримСр услуга, която Π½Π΅ ΠΏΡ€Π°Π²ΠΈ Π½ΠΈΡ‰ΠΎ:

  trait ZeroServiceImpl[F[_]] extends ServiceImpl[F] {
    type Config <: Any
    def resource(...): ResourceReader[F, Config, Unit] =
      Reader(_ => Resource.pure[F, Unit](()))
  }

(Π’ΠΈΠΆ Π˜Π·Ρ…ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π·Π° внСдряванС Π½Π° Π΄Ρ€ΡƒΠ³ΠΈ услуги β€” Π΅Ρ…ΠΎ услуга,
Π΅Ρ…ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ намлява Π΄ΠΎΠΆΠΈΠ²ΠΎΡ‚Π½ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€ΠΈ.)

Π’ΡŠΠ·Π΅Π»ΡŠΡ‚ Π΅ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π΅Π½ ΠΎΠ±Π΅ΠΊΡ‚, ΠΊΠΎΠΉΡ‚ΠΎ изпълнява няколко услуги (стартиранСто Π½Π° Π²Π΅Ρ€ΠΈΠ³Π° ΠΎΡ‚ рСсурси Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΠΎΡ‚ Cake Pattern):

object SingleNodeImpl extends ZeroServiceImpl[IO]
  with EchoServiceService
  with EchoClientService
  with FiniteDurationLifecycleServiceImpl
{
  type Config = EchoConfig[String] with EchoClientConfig[String] with FiniteDurationLifecycleConfig
}

Π˜ΠΌΠ°ΠΉΡ‚Π΅ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄, Ρ‡Π΅ във възСла Π½ΠΈΠ΅ ΡƒΠΊΠ°Π·Π²Π°ΠΌΠ΅ точния Ρ‚ΠΈΠΏ конфигурация, която Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° Π½Π° Ρ‚ΠΎΠ·ΠΈ възСл. ΠšΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€ΡŠΡ‚ няма Π΄Π° Π½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° ΠΈΠ·Π³Ρ€Π°Π΄ΠΈΠΌ ΠΎΠ±Π΅ΠΊΡ‚Π° (Cake) с Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π΅Π½ Ρ‚ΠΈΠΏ, Π·Π°Ρ‰ΠΎΡ‚ΠΎ всяка характСристика Π½Π° услугата Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° Config Π’ΠΈΠΏ. Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° няма Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° стартирамС възСл, Π±Π΅Π· Π΄Π° прСдоставим пълна конфигурация.

Π Π΅Π·ΠΎΠ»ΡŽΡ†ΠΈΡ Π½Π° адрСс Π½Π° възСл

Π—Π° Π΄Π° установим Π²Ρ€ΡŠΠ·ΠΊΠ°, сС Π½ΡƒΠΆΠ΄Π°Π΅ΠΌ ΠΎΡ‚ Ρ€Π΅Π°Π»Π΅Π½ хост адрСс Π·Π° всСки възСл. МоТС Π΄Π° станС извСстно ΠΏΠΎ-късно ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈ части Π½Π° конфигурацията. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ, ΠΈΠΌΠ°ΠΌΠ΅ Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ Π½Π°Ρ‡ΠΈΠ½ Π΄Π° осигурим ΡΡŠΠΏΠΎΡΡ‚Π°Π²ΡΠ½Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Π½Π° възСл ΠΈ нСговия дСйствитСлСн адрСс. Π’ΠΎΠ²Π° ΠΊΠ°Ρ€Ρ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ€Π°Π½Π΅ Π΅ функция:

case class NodeAddress[NodeId](host: Uri.Host)
trait AddressResolver[F[_]] {
  def resolve[NodeId](nodeId: NodeId): F[NodeAddress[NodeId]]
}

Има няколко възмоТни Π½Π°Ρ‡ΠΈΠ½Π° Π·Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° Ρ‚Π°ΠΊΠ°Π²Π° функция.

  1. Ако Π·Π½Π°Π΅ΠΌ дСйствитСлнитС адрСси ΠΏΡ€Π΅Π΄ΠΈ Ρ€Π°Π·Π³Ρ€ΡŠΡ‰Π°Π½Π΅Ρ‚ΠΎ, ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° инстанциранС Π½Π° хостовС Π½Π° възли, Ρ‚ΠΎΠ³Π°Π²Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΠΌΠ΅ Scala ΠΊΠΎΠ΄ с дСйствитСлнитС адрСси ΠΈ Π΄Π° изпълним компилацията слСд Ρ‚ΠΎΠ²Π° (която ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π΅ ΠΈ слСд Ρ‚ΠΎΠ²Π° изпълнява тСстов ΠΏΠ°ΠΊΠ΅Ρ‚ Π·Π° интСграция). Π’ Ρ‚ΠΎΠ·ΠΈ случай Π½Π°ΡˆΠ°Ρ‚Π° функция Π·Π° ΠΊΠ°Ρ€Ρ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ€Π°Π½Π΅ Π΅ извСстна статично ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС опростСна Π΄ΠΎ Π½Π΅Ρ‰ΠΎ ΠΊΠ°Ρ‚ΠΎ a Map[NodeId, NodeAddress].
  2. Понякога ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ дСйствитСлни адрСси само Π½Π° ΠΏΠΎ-късСн Π΅Ρ‚Π°ΠΏ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π²ΡŠΠ·Π΅Π»ΡŠΡ‚ дСйствитСлно Π΅ стартиран, ΠΈΠ»ΠΈ нямамС адрСси Π½Π° възли, ΠΊΠΎΠΈΡ‚ΠΎ всС ΠΎΡ‰Π΅ Π½Π΅ са стартирани. Π’ Ρ‚ΠΎΠ·ΠΈ случай ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ услуга Π·Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π°Π½Π΅, която сС стартира ΠΏΡ€Π΅Π΄ΠΈ всички Π΄Ρ€ΡƒΠ³ΠΈ възли ΠΈ всСки възСл ΠΌΠΎΠΆΠ΅ Π΄Π° Ρ€Π΅ΠΊΠ»Π°ΠΌΠΈΡ€Π° своя адрСс Π² Ρ‚Π°Π·ΠΈ услуга ΠΈ Π΄Π° сС Π°Π±ΠΎΠ½ΠΈΡ€Π° Π·Π° зависимости.
  3. Ако ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΠΌ /etc/hosts, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΈ ΠΈΠΌΠ΅Π½Π° Π½Π° хостовС (ΠΊΠ°Ρ‚ΠΎ my-project-main-node намлява echo-backend) ΠΈ просто ΡΠ²ΡŠΡ€ΠΆΠ΅Ρ‚Π΅ Ρ‚ΠΎΠ²Π° ΠΈΠΌΠ΅ с ip адрСса ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° внСдряванС.

Π’ Ρ‚Π°Π·ΠΈ публикация Π½Π΅ Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ Ρ‚Π΅Π·ΠΈ случаи Π² ΠΏΠΎΠ²Π΅Ρ‡Π΅ подробности. Π’ΡΡŠΡ‰Π½ΠΎΡΡ‚ Π² нашия ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° ΠΈΠ³Ρ€Π°Ρ‡ΠΊΠ° всички възли Ρ‰Π΅ ΠΈΠΌΠ°Ρ‚ Π΅Π΄ΠΈΠ½ ΠΈ ΡΡŠΡ‰ IP адрСс - 127.0.0.1.

Π’ Ρ‚Π°Π·ΠΈ публикация Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π΄Π²Π΅ оформлСния Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ систСми:

  1. ΠžΡ„ΠΎΡ€ΠΌΠ»Π΅Π½ΠΈΠ΅ Π½Π° Π΅Π΄ΠΈΠ½ възСл, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ всички услуги са Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈ Π½Π° Π΅Π΄ΠΈΠ½ възСл.
  2. ΠžΡ„ΠΎΡ€ΠΌΠ»Π΅Π½ΠΈΠ΅ с Π΄Π²Π° възСла, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ услугата ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡŠΡ‚ са Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ възли.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡΡ‚Π° Π·Π° a Π΅Π΄ΠΈΠ½ΠΈΡ‡Π΅Π½ възСл ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π΅ ΠΊΠ°ΠΊΡ‚ΠΎ слСдва:

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ с Π΅Π΄ΠΈΠ½ възСл

object SingleNodeConfig extends EchoConfig[String] 
  with EchoClientConfig[String] with FiniteDurationLifecycleConfig
{
  case object Singleton // identifier of the single node 
  // configuration of server
  type NodeId = Singleton.type
  def nodeId = Singleton

  /** Type safe service port specification. */
  override def portNumber: PortNumber = 8088

  // configuration of client

  /** We'll use the service provided by the same host. */
  def echoServiceDependency = echoService

  override def testMessage: UrlPathElement = "hello"

  def pollInterval: FiniteDuration = 1.second

  // lifecycle controller configuration
  def lifetime: FiniteDuration = 10500.milliseconds // additional 0.5 seconds so that there are 10 requests, not 9.
}

Π’ΡƒΠΊ създавамС Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Π° конфигурация, която Ρ€Π°Π·ΡˆΠΈΡ€ΡΠ²Π° ΠΊΠ°ΠΊΡ‚ΠΎ ΡΡŠΡ€Π²ΡŠΡ€Π½Π°Ρ‚Π°, Ρ‚Π°ΠΊΠ° ΠΈ клиСнтската конфигурация. Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°ΠΌΠ΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€ Π½Π° ТизнСния Ρ†ΠΈΠΊΡŠΠ», ΠΊΠΎΠΉΡ‚ΠΎ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Ρ‰Π΅ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ ΡΡŠΡ€Π²ΡŠΡ€ слСд Ρ‚ΠΎΠ²Π° lifetime ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π½ΠΈ пасовС.

Π‘ΡŠΡ‰ΠΈΡΡ‚ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½Π° услуги ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° създаванС Π½Π° ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½ΠΈΠ΅ Π½Π° систСмата с Π΄Π²Π° ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ възСла. НиС просто трябва Π΄Π° създавамС Π΄Π²Π΅ ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½Π° възСл със ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ‚Π΅ услуги:

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Π½Π° Π΄Π²Π° възСла

  object NodeServerConfig extends EchoConfig[String] with SigTermLifecycleConfig
  {
    type NodeId = NodeIdImpl

    def nodeId = NodeServer

    override def portNumber: PortNumber = 8080
  }

  object NodeClientConfig extends EchoClientConfig[String] with FiniteDurationLifecycleConfig
  {
    // NB! dependency specification
    def echoServiceDependency = NodeServerConfig.echoService

    def pollInterval: FiniteDuration = 1.second

    def lifetime: FiniteDuration = 10500.milliseconds // additional 0.5 seconds so that there are 10 request, not 9.

    def testMessage: String = "dolly"
  }

Π’ΠΈΠΆΡ‚Π΅ ΠΊΠ°ΠΊ опрСдСлямС зависимостта. Π‘ΠΏΠΎΠΌΠ΅Π½Π°Π²Π°ΠΌΠ΅ прСдоставСната услуга Π½Π° другия възСл ΠΊΠ°Ρ‚ΠΎ зависимост ΠΎΡ‚ тСкущия възСл. Π’ΠΈΠΏΡŠΡ‚ Π½Π° зависимостта сС провСрява, Π·Π°Ρ‰ΠΎΡ‚ΠΎ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Ρ„Π°Π½Ρ‚ΠΎΠΌΠ΅Π½ Ρ‚ΠΈΠΏ, ΠΊΠΎΠΉΡ‚ΠΎ описва ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°. И ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° изпълнСниС Ρ‰Π΅ ΠΈΠΌΠ°ΠΌΠ΅ правилния ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½Π° възСл. Π’ΠΎΠ²Π° Π΅ Π΅Π΄ΠΈΠ½ ΠΎΡ‚ Π²Π°ΠΆΠ½ΠΈΡ‚Π΅ аспСкти Π½Π° прСдлоТСния ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π΅Π½ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄. Π’ΠΎΠΉ Π½ΠΈ Π΄Π°Π²Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΠΌ ΠΏΠΎΡ€Ρ‚ само вСднъТ ΠΈ Π΄Π° сС ΡƒΠ²Π΅Ρ€ΠΈΠΌ, Ρ‡Π΅ ΠΏΡ€Π΅ΠΏΡ€Π°Ρ‰Π°ΠΌΠ΅ към правилния ΠΏΠΎΡ€Ρ‚.

РСализация Π½Π° Π΄Π²Π° възСла

Π—Π° Ρ‚Π°Π·ΠΈ конфигурация ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ ΡΡŠΡ‰ΠΈΡ‚Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° услуги. Никакви ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ. НиС ΠΎΠ±Π°Ρ‡Π΅ създавамС Π΄Π²Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° възСл, ΠΊΠΎΠΈΡ‚ΠΎ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ услуги:

  object TwoJvmNodeServerImpl extends ZeroServiceImpl[IO] with EchoServiceService with SigIntLifecycleServiceImpl {
    type Config = EchoConfig[String] with SigTermLifecycleConfig
  }

  object TwoJvmNodeClientImpl extends ZeroServiceImpl[IO] with EchoClientService with FiniteDurationLifecycleServiceImpl {
    type Config = EchoClientConfig[String] with FiniteDurationLifecycleConfig
  }

ΠŸΡŠΡ€Π²ΠΈΡΡ‚ възСл внСдрява ΡΡŠΡ€Π²ΡŠΡ€ ΠΈ сС Π½ΡƒΠΆΠ΄Π°Π΅ само ΠΎΡ‚ конфигурация ΠΎΡ‚ страна Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π°. Вторият възСл внСдрява ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ сС Π½ΡƒΠΆΠ΄Π°Π΅ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° част ΠΎΡ‚ конфигурацията. И Π΄Π²Π°Ρ‚Π° възСла изискват спСцификация Π·Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΡ‚Π΅Π»Π½ΠΎΡΡ‚Ρ‚Π° Π½Π° ΠΆΠΈΠ²ΠΎΡ‚Π°. Π—Π° Ρ†Π΅Π»ΠΈΡ‚Π΅ Π½Π° Ρ‚Π°Π·ΠΈ пощСнска услуга Π²ΡŠΠ·Π΅Π»ΡŠΡ‚ Ρ‰Π΅ ΠΈΠΌΠ° Π±Π΅Π·ΠΊΡ€Π°Π΅Π½ ΠΆΠΈΠ²ΠΎΡ‚, ΠΊΠΎΠΉΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚Π΅Π½ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° SIGTERM, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ Π΅Ρ…ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡŠΡ‚ Ρ‰Π΅ ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡ΠΈ слСд ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π°Ρ‚Π° ΠΊΡ€Π°ΠΉΠ½Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΡ‚Π΅Π»Π½ΠΎΡΡ‚. Π’ΠΈΠΆΡ‚Π΅ стартово ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅.

ЦялостСн процСс Π½Π° Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅

НСка Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ Ρ‚ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ промСня Π½Π°Ρ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΠΉΡ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΈΠΌ с конфигурацията.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡΡ‚Π° ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΠ΄ Ρ‰Π΅ бъдС ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π° ΠΈ Ρ‰Π΅ създадС Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚. ИзглСТда Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ Π΄Π° сС ΠΎΡ‚Π΄Π΅Π»ΠΈ конфигурационният Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ ΠΊΠΎΠ΄ΠΎΠ²ΠΈ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΈ. ЧСсто ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ мноТСство ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½Π° Π΅Π΄Π½Π° ΠΈ ΡΡŠΡ‰Π° ΠΊΠΎΠ΄ΠΎΠ²Π° Π±Π°Π·Π°. И Ρ€Π°Π·Π±ΠΈΡ€Π° сС, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ мноТСство вСрсии Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅. Π’ конфигурация ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·Π±Π΅Ρ€Π΅ΠΌ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΈ вСрсии Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ Ρ‚ΠΎΠ²Π° Ρ‰Π΅ останС постоянно, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π²Π½Π΅Π΄Ρ€ΠΈΠΌ Ρ‚Π°Π·ΠΈ конфигурация.

ΠŸΡ€ΠΎΠΌΡΠ½Π°Ρ‚Π° Π½Π° конфигурацията става промяна Π½Π° ΠΊΠΎΠ΄Π°. Π’Π°ΠΊΠ° Ρ‡Π΅ трябва Π΄Π° бъдС ΠΎΠ±Ρ…Π²Π°Π½Π°Ρ‚ ΠΎΡ‚ ΡΡŠΡ‰ΠΈΡ процСс Π·Π° осигуряванС Π½Π° качСство:

Π‘ΠΈΠ»Π΅Ρ‚ -> PR -> ΠΏΡ€Π΅Π³Π»Π΅Π΄ -> сливанС -> Π½Π΅ΠΏΡ€Π΅ΠΊΡŠΡΠ½Π°Ρ‚Π° интСграция -> Π½Π΅ΠΏΡ€Π΅ΠΊΡŠΡΠ½Π°Ρ‚ΠΎ внСдряванС

Има слСднитС послСдствия ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°:

  1. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡΡ‚Π° Π΅ ΡΡŠΠ³Π»Π°ΡΡƒΠ²Π°Π½Π° Π·Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π΅Π½ СкзСмпляр Π½Π° систСмата. ИзглСТда, Ρ‡Π΅ няма Π½Π°Ρ‡ΠΈΠ½ Π΄Π° ΠΈΠΌΠ° Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠ° ΠΌΠ΅ΠΆΠ΄Ρƒ Π²ΡŠΠ·Π»ΠΈΡ‚Π΅.
  2. НС Π΅ лСсно Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ конфигурацията само Π² Π΅Π΄ΠΈΠ½ възСл. ИзглСТда Π½Π΅Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ Π΄Π° Π²Π»ΠΈΠ·Π°Ρ‚Π΅ ΠΈ Π΄Π° промСнятС някои тСкстови Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅. Π’Π°ΠΊΠ° ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π² конфигурацията става ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ възмоТно.
  3. ΠœΠ°Π»ΠΊΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² конфигурацията Π½Π΅ сС правят лСсно.
  4. ΠŸΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ ΠΎΡ‚ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π² конфигурацията Ρ‰Π΅ слСдват ΡΡŠΡ‰ΠΈΡ процСс Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈ Ρ‰Π΅ ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Ρ‚ извСстСн ΠΏΡ€Π΅Π³Π»Π΅Π΄.

ИмамС Π»ΠΈ Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ ΠΎΡ‚Π΄Π΅Π»Π½ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π·Π° производствСна конфигурация? ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡ‚Π²Π΅Π½Π°Ρ‚Π° конфигурация ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° чувствитСлна информация, която Π±ΠΈΡ…ΠΌΠ΅ искали Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈΠΌ Π΄Π°Π»Π΅Ρ‡ ΠΎΡ‚ обсСга Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ Ρ…ΠΎΡ€Π°. Π’Π°ΠΊΠ° Ρ‡Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° си струва Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈΡ‚Π΅ ΠΎΡ‚Π΄Π΅Π»Π½ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ Π΄ΠΎΡΡ‚ΡŠΠΏ, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° производствСната конфигурация. МоТСм Π΄Π° Ρ€Π°Π·Π΄Π΅Π»ΠΈΠΌ конфигурацията Π½Π° Π΄Π²Π΅ части - Π΅Π΄Π½Π°, която ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Π½Π°ΠΉ-ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ΠΈΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ Π½Π° производството, ΠΈ Π΅Π΄Π½Π°, която ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Ρ‚Π°ΠΉΠ½Π°Ρ‚Π° част Π½Π° конфигурацията. Π’ΠΎΠ²Π° Π±ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ Π΄ΠΎΡΡ‚ΡŠΠΏ Π½Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈ Π΄ΠΎ ΠΏΠΎ-голямата част ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅, ΠΊΠ°Ρ‚ΠΎ ΡΡŠΡ‰Π΅Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π°Π²Π° Π΄ΠΎΡΡ‚ΡŠΠΏΠ° Π΄ΠΎ наистина чувствитСлни Π½Π΅Ρ‰Π°. ЛСсно Π΅ Π΄Π° постигнСтС Ρ‚ΠΎΠ²Π°, ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π½ΠΈ характСристики със стойности Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅.

Π’Π°Ρ€ΠΈΠ°Ρ†ΠΈΠΈ

НСка Π²ΠΈΠ΄ΠΈΠΌ ΠΏΠ»ΡŽΡΠΎΠ²Π΅Ρ‚Π΅ ΠΈ минуситС Π½Π° прСдлоТСния ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π² сравнСниС с Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° конфигурацията.

ΠŸΡŠΡ€Π²ΠΎ, Ρ‰Π΅ ΠΈΠ·Π±Ρ€ΠΎΠΈΠΌ няколко Π°Π»Ρ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²ΠΈ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈΡ‚Π΅ аспСкти Π½Π° прСдлоТСния Π½Π°Ρ‡ΠΈΠ½ Π·Π° справянС с конфигурацията:

  1. ВСкстов Ρ„Π°ΠΉΠ» Π½Π° Ρ†Π΅Π»Π΅Π²Π°Ρ‚Π° машина.
  2. Π¦Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΎ ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠ»ΡŽΡ‡-стойност (ΠΊΠ°Ρ‚ΠΎ etcd/zookeeper).
  3. ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ Π½Π° подпроцСс, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΏΡ€Π΅ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ΠΈ/рСстартирани Π±Π΅Π· рСстартиранС Π½Π° процСса.
  4. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ извън Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ» Π½Π° вСрсиитС.

ВСкстовият Ρ„Π°ΠΉΠ» Π΄Π°Π²Π° извСстна Π³ΡŠΠ²ΠΊΠ°Π²ΠΎΡΡ‚ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Π½Π° ad-hoc ΠΊΠΎΡ€Π΅ΠΊΡ†ΠΈΠΈ. ΠΠ΄ΠΌΠΈΠ½ΠΈΡΡ‚Ρ€Π°Ρ‚ΠΎΡ€ΡŠΡ‚ Π½Π° систСмата ΠΌΠΎΠΆΠ΅ Π΄Π° Π²Π»Π΅Π·Π΅ Π² цСлСвия възСл, Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈ промяна ΠΈ просто Π΄Π° рСстартира услугата. Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ Π΅ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° Π΄ΠΎΠ±Ρ€ΠΎ Π·Π° ΠΏΠΎ-Π³ΠΎΠ»Π΅ΠΌΠΈ систСми. Π‘Π»Π΅Π΄ промяната Π½Π΅ остават Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ слСди. ΠŸΡ€ΠΎΠΌΡΠ½Π°Ρ‚Π° Π½Π΅ сС ΠΏΡ€Π΅Π³Π»Π΅ΠΆΠ΄Π° ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ Ρ‡ΠΈΡ„Ρ‚ ΠΎΡ‡ΠΈ. МоТС Π΄Π° Π΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ ΠΊΠ°ΠΊΠ²ΠΎ Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΈΠ»ΠΎ промяната. НС Π΅ тСстван. ΠžΡ‚ Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°Ρ‚Π° систСма Π°Π΄ΠΌΠΈΠ½ΠΈΡΡ‚Ρ€Π°Ρ‚ΠΎΡ€ΡŠΡ‚ ΠΌΠΎΠΆΠ΅ просто Π΄Π° Π·Π°Π±Ρ€Π°Π²ΠΈ Π΄Π° Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π° конфигурацията Π² някой ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ възли.

(ΠœΠ΅ΠΆΠ΄Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΡ‚ΠΎ, Π°ΠΊΠΎ Π² ΠΊΡ€Π°ΠΉΠ½Π° смСтка сС Π½Π°Π»ΠΎΠΆΠΈ Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ тСкстови ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, Ρ‰Π΅ трябва само Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ парсСр + Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€, ΠΊΠΎΠΉΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅ ΡΡŠΡ‰ΠΎΡ‚ΠΎ Config Ρ‚ΠΈΠΏ ΠΈ Ρ‚ΠΎΠ²Π° Π±ΠΈ Π±ΠΈΠ»ΠΎ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ, Π·Π° Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ тСкстови ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Π’ΠΎΠ²Π° ΡΡŠΡ‰ΠΎ ΠΏΠΎΠΊΠ°Π·Π²Π°, Ρ‡Π΅ слоТността Π½Π° конфигурацията ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π΅ Π΅ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠ° ΠΎΡ‚ слоТността Π½Π° тСкстово Π±Π°Π·ΠΈΡ€Π°Π½ΠΈΡ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π² тСкстово Π±Π°Π·ΠΈΡ€Π°Π½Π°Ρ‚Π° вСрсия сС Π½ΡƒΠΆΠ΄Π°Π΅ΠΌ ΠΎΡ‚ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π΅Π½ ΠΊΠΎΠ΄.)

Π¦Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΎΡ‚ΠΎ ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠ»ΡŽΡ‡-стойност Π΅ Π΄ΠΎΠ±ΡŠΡ€ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ Π·Π° разпространСниС Π½Π° ΠΌΠ΅Ρ‚Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ. Π’ΡƒΠΊ трябва Π΄Π° помислим ΠΊΠ°ΠΊΠ²ΠΎ смятамС Π·Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ стойности ΠΈ ΠΊΠ°ΠΊΠ²ΠΎ са само Π΄Π°Π½Π½ΠΈ. Π”Π°Π΄Π΅Π½Π° функция C => A => B ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π½Π°Ρ€ΠΈΡ‡Π°ΠΌΠ΅ рядко промСнящи сС стойности C "конфигурация", Π΄ΠΎΠΊΠ°Ρ‚ΠΎ чСсто промСнянитС Π΄Π°Π½Π½ΠΈ A - просто Π²ΡŠΠ²Π΅Π΄Π΅Ρ‚Π΅ Π΄Π°Π½Π½ΠΈ. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡΡ‚Π° трябва Π΄Π° бъдС прСдоставСна Π½Π° функцията ΠΏΠΎ-Ρ€Π°Π½ΠΎ ΠΎΡ‚ Π΄Π°Π½Π½ΠΈΡ‚Π΅ A. ΠšΠ°Ρ‚ΠΎ сС ΠΈΠΌΠ° ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ Ρ‚Π°Π·ΠΈ идСя, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌ, Ρ‡Π΅ ΠΎΡ‡Π°ΠΊΠ²Π°Π½Π°Ρ‚Π° чСстота Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° Ρ€Π°Π·Π³Ρ€Π°Π½ΠΈΡ‡Π°Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ. ОсвСн Ρ‚ΠΎΠ²Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΈΠ΄Π²Π°Ρ‚ ΠΎΡ‚ Π΅Π΄ΠΈΠ½ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ (ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»), Π° конфигурацията ΠΈΠ΄Π²Π° ΠΎΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ (администратор). Π Π°Π±ΠΎΡ‚Π°Ρ‚Π° с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½ΠΈ слСд процСса Π½Π° инициализация, Π²ΠΎΠ΄ΠΈ Π΄ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡Π°Π²Π°Π½Π΅ Π½Π° слоТността Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ. Π—Π° Ρ‚Π°ΠΊΠΈΠ²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ Ρ‰Π΅ трябва Π΄Π° сС справим с тСхния ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ Π·Π° доставка, Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ ΠΈ Π²Π°Π»ΠΈΠ΄ΠΈΡ€Π°Π½Π΅, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΈ стойности. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ, Π·Π° Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈΠΌ слоТността Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅ Π΅ Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈΠΌ броя Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС промСнят ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° изпълнСниС (ΠΈΠ»ΠΈ Π΄ΠΎΡ€ΠΈ Π΄Π° Π³ΠΈ ΠΏΡ€Π΅ΠΌΠ°Ρ…Π½Π΅ΠΌ напълно).

ΠžΡ‚ Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° Ρ‚Π°Π·ΠΈ публикация трябва Π΄Π° ΠΏΡ€Π°Π²ΠΈΠΌ Ρ€Π°Π·Π»ΠΈΠΊΠ° ΠΌΠ΅ΠΆΠ΄Ρƒ статични ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ. Ако Π»ΠΎΠ³ΠΈΠΊΠ°Ρ‚Π° Π½Π° услугата изисква рядка промяна Π½Π° някои ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° изпълнСниС, Ρ‚ΠΎΠ³Π°Π²Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π³ΠΈ Π½Π°Ρ€Π΅Ρ‡Π΅ΠΌ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π΅Π½ случай Ρ‚Π΅ са статични ΠΈ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° прСдлоТСния ΠΏΠΎΠ΄Ρ…ΠΎΠ΄. Π—Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΎ ΠΏΡ€Π΅ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° са Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ Π΄Ρ€ΡƒΠ³ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈ. НапримСр части ΠΎΡ‚ систСмата ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ рСстартирани с Π½ΠΎΠ²ΠΈΡ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ ΠΏΠΎ Π½Π°Ρ‡ΠΈΠ½, ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π° рСстартиранСто Π½Π° ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ процСси Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° систСма.
(ΠœΠΎΠ΅Ρ‚ΠΎ скромно ΠΌΠ½Π΅Π½ΠΈΠ΅ Π΅ Π΄Π° сС избягва ΠΏΡ€Π΅ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π·Π° изпълнСниС, Π·Π°Ρ‰ΠΎΡ‚ΠΎ Ρ‚ΠΎΠ²Π° ΡƒΠ²Π΅Π»ΠΈΡ‡Π°Π²Π° слоТността Π½Π° систСмата.
МоТС Π΄Π° Π΅ ΠΏΠΎ-лСсно просто Π΄Π° Ρ€Π°Π·Ρ‡ΠΈΡ‚Π°Ρ‚Π΅ Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°Ρ‚Π° Π½Π° ОБ Π·Π° рСстартиранС Π½Π° процСси. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ Π²ΠΈΠ½Π°Π³ΠΈ Π΅ възмоТно.)

Π•Π΄ΠΈΠ½ Π²Π°ΠΆΠ΅Π½ аспСкт Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° статична конфигурация, ΠΊΠΎΠΉΡ‚ΠΎ понякога ΠΊΠ°Ρ€Π° Ρ…ΠΎΡ€Π°Ρ‚Π° Π΄Π° обмислят Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½Π° конфигурация (Π±Π΅Π· Π΄Ρ€ΡƒΠ³ΠΈ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΈ), Π΅ ΠΏΡ€Π΅ΠΊΡŠΡΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° услугата ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° конфигурацията. Наистина, Π°ΠΊΠΎ трябва Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² статичната конфигурация, трябва Π΄Π° рСстартирамС систСмата, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Π½ΠΎΠ²ΠΈΡ‚Π΅ стойности Π΄Π° влязат Π² сила. Π˜Π·ΠΈΡΠΊΠ²Π°Π½ΠΈΡΡ‚Π° Π·Π° прСстой Π²Π°Ρ€ΠΈΡ€Π°Ρ‚ Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈΡ‚Π΅ систСми, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ Π΅ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ. Ако Π΅ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ, Ρ‚ΠΎΠ³Π°Π²Π° трябва Π΄Π° ΠΏΠ»Π°Π½ΠΈΡ€Π°ΠΌΠ΅ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ всяко рСстартиранС Π½Π° систСмата. НапримСр, Π±ΠΈΡ…ΠΌΠ΅ ΠΌΠΎΠ³Π»ΠΈ Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈΠΌ Π˜Π·Ρ‚ΠΎΡ‡Π²Π°Π½Π΅ Π½Π° AWS ELB Π²Ρ€ΡŠΠ·ΠΊΠ°. Π’ Ρ‚ΠΎΠ·ΠΈ сцСнарий всСки ΠΏΡŠΡ‚, ΠΊΠΎΠ³Π°Ρ‚ΠΎ трябва Π΄Π° рСстартирамС систСмата, стартирамС ΠΏΠ°Ρ€Π°Π»Π΅Π»Π½ΠΎ Π½ΠΎΠ² СкзСмпляр Π½Π° систСмата, слСд ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΏΡ€Π΅Π²ΠΊΠ»ΡŽΡ‡Π²Π°ΠΌΠ΅ ELB към Π½Π΅Π³ΠΎ, ΠΊΠ°Ρ‚ΠΎ ΡΡŠΡ‰Π΅Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ оставямС старата систСма Π΄Π° Π·Π°Π²ΡŠΡ€ΡˆΠΈ обслуТванСто Π½Π° ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰ΠΈΡ‚Π΅ Π²Ρ€ΡŠΠ·ΠΊΠΈ.

Какво Ρ‰Π΅ ΠΊΠ°ΠΆΠ΅Ρ‚Π΅ Π·Π° Π·Π°ΠΏΠ°Π·Π²Π°Π½Π΅ Π½Π° конфигурацията Π²ΡŠΡ‚Ρ€Π΅ Π² вСрсионния Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ ΠΈΠ»ΠΈ извън Π½Π΅Π³ΠΎ? ΠŸΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π½Π΅Ρ‚ΠΎ Π½Π° конфигурация Π²ΡŠΡ‚Ρ€Π΅ Π² Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ ΠΎΠ·Π½Π°Ρ‡Π°Π²Π° Π² ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ случаи, Ρ‡Π΅ Ρ‚Π°Π·ΠΈ конфигурация Π΅ ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π»Π° ΠΏΡ€Π΅Π· ΡΡŠΡ‰ΠΈΡ процСс Π·Π° осигуряванС Π½Π° качСство ΠΊΠ°Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΈ. Π’Π°ΠΊΠ° Ρ‡Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° стС сигурни, Ρ‡Π΅ конфигурацията Π΅ качСствСна ΠΈ Π½Π°Π΄Π΅ΠΆΠ΄Π½Π°. Напротив, конфигурацията Π² ΠΎΡ‚Π΄Π΅Π»Π΅Π½ Ρ„Π°ΠΉΠ» ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ няма слСди ΠΊΠΎΠΉ ΠΈ Π·Π°Ρ‰ΠΎ Π΅ Π½Π°ΠΏΡ€Π°Π²ΠΈΠ» ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² Ρ‚ΠΎΠ·ΠΈ Ρ„Π°ΠΉΠ». Π²Π°ΠΆΠ½ΠΎ Π»ΠΈ Π΅ Ρ‚ΠΎΠ²Π° ВярвамС, Ρ‡Π΅ Π·Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ производствСни систСми Π΅ ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅ Π΄Π° ΠΈΠΌΠ°Ρ‚Π΅ стабилна ΠΈ висококачСствСна конфигурация.

ВСрсията Π½Π° Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Π° позволява Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ ΠΊΠΎΠ³Π° Π΅ създадСн, ΠΊΠ°ΠΊΠ²ΠΈ стойности ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°, ΠΊΠ°ΠΊΠ²ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ са Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½ΠΈ/Π΄Π΅Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½ΠΈ, ΠΊΠΎΠΉ Π΅ ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€Π΅Π½ Π·Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° всяка промяна Π² конфигурацията. МоТС Π΄Π° изисква извСстно усилиС, Π·Π° Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈΡ‚Π΅ конфигурацията Π²ΡŠΡ‚Ρ€Π΅ Π² Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ ΠΈ Ρ‚ΠΎΠ²Π° Π΅ дизайнСрски ΠΈΠ·Π±ΠΎΡ€, ΠΊΠΎΠΉΡ‚ΠΎ трябва Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅.

ПлюсовС минуси

Π’ΡƒΠΊ Π±ΠΈΡ…ΠΌΠ΅ искали Π΄Π° ΠΏΠΎΠ΄Ρ‡Π΅Ρ€Ρ‚Π°Π΅ΠΌ някои прСдимства ΠΈ Π΄Π° обсъдим някои Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ†ΠΈ Π½Π° прСдлоТСния ΠΏΠΎΠ΄Ρ…ΠΎΠ΄.

ΠŸΡ€Π΅Π΄ΠΈΠΌΡΡ‚Π²Π°

Π₯арактСристики Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ‚Π° конфигурация Π½Π° пълна Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° систСма:

  1. Π‘Ρ‚Π°Ρ‚ΠΈΡ‡Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° конфигурацията. Π’ΠΎΠ²Π° Π΄Π°Π²Π° високо Π½ΠΈΠ²ΠΎ Π½Π° увСрСност, Ρ‡Π΅ конфигурацията Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π½Π° ΠΏΡ€ΠΈ Π΄Π°Π΄Π΅Π½ΠΈ ограничСния Π½Π° Ρ‚ΠΈΠΏΠ°.
  2. Π‘ΠΎΠ³Π°Ρ‚ Π΅Π·ΠΈΠΊ Π½Π° конфигурация. ОбикновСно Π΄Ρ€ΡƒΠ³ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈ Π·Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π΅ са ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈ Π½Π°ΠΉ-ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎ замСстванС Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ.
    Π‘ ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Scala ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ ΡˆΠΈΡ€ΠΎΠΊ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Π΅Π·ΠΈΠΊΠΎΠ²ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π·Π° Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ конфигурацията ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π°. НапримСр, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Ρ‡Π΅Ρ€Ρ‚ΠΈ, Π·Π° Π΄Π° прСдоставим стойности ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅, ΠΎΠ±Π΅ΠΊΡ‚ΠΈ, Π·Π° Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΠΌ Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½ ΠΎΠ±Ρ…Π²Π°Ρ‚, към ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° сС ΠΏΠΎΠ·ΠΎΠ²Π°Π²Π°ΠΌΠ΅ valΠ΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΈ само вСднъТ във външния ΠΎΠ±Ρ…Π²Π°Ρ‚ (DRY). Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π±ΡƒΠΊΠ²Π°Π»Π½ΠΈ ΠΏΠΎΡ€Π΅Π΄ΠΈΡ†ΠΈ ΠΈΠ»ΠΈ СкзСмпляри Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ класовС (Seq, MapИ Ρ‚.Π½.).
  3. DSL. Scala ΠΈΠΌΠ° ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° DSL писатСли. Π§ΠΎΠ²Π΅ΠΊ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Ρ‚Π΅Π·ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π·Π° Π΄Π° създадС Π΅Π·ΠΈΠΊ Π·Π° конфигурация, ΠΊΠΎΠΉΡ‚ΠΎ Π΅ ΠΏΠΎ-ΡƒΠ΄ΠΎΠ±Π΅Π½ ΠΈ ΡƒΠ΄ΠΎΠ±Π΅Π½ Π·Π° крайния ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π», Ρ‚Π°ΠΊΠ° Ρ‡Π΅ ΠΊΡ€Π°ΠΉΠ½Π°Ρ‚Π° конфигурация Π΄Π° Π΅ ΠΏΠΎΠ½Π΅ Ρ‡Π΅Ρ‚ΠΈΠΌΠ° ΠΎΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ Π½Π° Π΄ΠΎΠΌΠ΅ΠΉΠ½Π°.
  4. Цялостност ΠΈ ΡΡŠΠ³Π»Π°ΡΡƒΠ²Π°Π½ΠΎΡΡ‚ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²ΡŠΠ·Π»ΠΈΡ‚Π΅. Π•Π΄Π½ΠΎ ΠΎΡ‚ прСдимствата Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅Ρ‚ΠΎ Π½Π° конфигурация Π·Π° цялата Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° систСма Π½Π° Π΅Π΄Π½ΠΎ място Π΅, Ρ‡Π΅ всички стойности сС Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Ρ‚ стриктно вСднъТ ΠΈ слСд Ρ‚ΠΎΠ²Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π½Π° всички мСста, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ ΠΈΠΌΠ°ΠΌΠ΅ Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ тях. Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Π²ΡŠΠ²Π΅Π΄Π΅Ρ‚Π΅ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈΡ‚Π΅ Π·Π° бСзопасСн ΠΏΠΎΡ€Ρ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π°Ρ‚, Ρ‡Π΅ във всички възмоТни ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π²ΡŠΠ·Π»ΠΈΡ‚Π΅ Π½Π° систСмата Ρ‰Π΅ говорят Π½Π° Π΅Π΄ΠΈΠ½ ΠΈ ΡΡŠΡ‰ΠΈ Π΅Π·ΠΈΠΊ. Има ΠΈΠ·Ρ€ΠΈΡ‡Π½ΠΈ зависимости ΠΌΠ΅ΠΆΠ΄Ρƒ Π²ΡŠΠ·Π»ΠΈΡ‚Π΅, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π΄Π° Π·Π°Π±Ρ€Π°Π²ΠΈΡ‚Π΅ Π΄Π° прСдоставитС някои услуги.
  5. Високо качСство Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅. Цялостният ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π·Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π²Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π² конфигурацията ΠΏΡ€Π΅Π· Π½ΠΎΡ€ΠΌΠ°Π»Π΅Π½ PR процСс установява високи стандарти Π·Π° качСство ΠΈ Π² конфигурацията.
  6. Π•Π΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² конфигурацията. ВсСки ΠΏΡŠΡ‚, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠΌ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² конфигурацията, Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎΡ‚ΠΎ внСдряванС Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π°, Ρ‡Π΅ всички възли сС Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚.
  7. ΠžΠΏΡ€ΠΎΡΡ‚ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π΅ трябва Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π° ΠΈ Π²Π°Π»ΠΈΠ΄ΠΈΡ€Π° конфигурацията ΠΈ Π΄Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π° Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΈ стойности Π½Π° конфигурацията. Π’ΠΎΠ²Π° опростява цялостното ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. (Π˜Π·Π²Π΅ΡΡ‚Π½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° слоТността Π΅ Π² самата конфигурация, Π½ΠΎ Ρ‚ΠΎΠ²Π° Π΅ ΡΡŠΠ·Π½Π°Ρ‚Π΅Π»Π΅Π½ компромис с бСзопасността.) Доста лСсно Π΅ Π΄Π° сС Π²ΡŠΡ€Π½Π΅Ρ‚Π΅ към ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½Π°Ρ‚Π° конфигурация - просто Π΄ΠΎΠ±Π°Π²Π΅Ρ‚Π΅ липсващитС части. По-лСсно Π΅ Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ с ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π° конфигурация ΠΈ Π΄Π° ΠΎΡ‚Π»ΠΎΠΆΠΈΡ‚Π΅ внСдряванСто Π½Π° Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ части Π·Π° ΠΏΠΎ-късни Π²Ρ€Π΅ΠΌΠ΅Π½Π°.
  8. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ с вСрсии. ΠŸΠΎΡ€Π°Π΄ΠΈ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π² конфигурацията слСдват ΡΡŠΡ‰ΠΈΡ процСс Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°, Π² Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ с ΡƒΠ½ΠΈΠΊΠ°Π»Π½Π° вСрсия. Π’ΠΎΠ²Π° Π½ΠΈ позволява Π΄Π° ΠΏΡ€Π΅Π²ΠΊΠ»ΡŽΡ‡ΠΈΠΌ конфигурацията ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ, Π°ΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ. МоТСм Π΄ΠΎΡ€ΠΈ Π΄Π° Π²Π½Π΅Π΄Ρ€ΠΈΠΌ конфигурация, която Π΅ Π±ΠΈΠ»Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π° ΠΏΡ€Π΅Π΄ΠΈ Π³ΠΎΠ΄ΠΈΠ½Π° ΠΈ тя Ρ‰Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΏΠΎ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ ΡΡŠΡ‰ΠΈΡ Π½Π°Ρ‡ΠΈΠ½. Π‘Ρ‚Π°Π±ΠΈΠ»Π½Π°Ρ‚Π° конфигурация подобрява прСдвидимостта ΠΈ надСТдността Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°Ρ‚Π° систСма. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡΡ‚Π° Π΅ фиксирана ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π΅ ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅ лСсно Π΄Π° бъдС ΠΏΠΎΠ΄ΠΏΡ€Π°Π²Π΅Π½Π° Π² производствСна систСма.
  9. ΠœΠΎΠ΄ΡƒΠ»Π½ΠΎΡΡ‚. ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π°Ρ‚Π° Ρ€Π°ΠΌΠΊΠ° Π΅ ΠΌΠΎΠ΄ΡƒΠ»Π½Π° ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΠΈΡ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°Ρ‚ ΠΏΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π½Π°Ρ‡ΠΈΠ½ΠΈ
    ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ (настройки/оформлСния). По-спСциално, възмоТно Π΅ Π΄Π° ΠΈΠΌΠ°Ρ‚Π΅ ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½ΠΈΠ΅ с Π΅Π΄ΠΈΠ½ΠΈΡ‡Π΅Π½ възСл Π² малък ΠΌΠ°Ρ‰Π°Π± ΠΈ настройка с мноТСство възли Π² голям ΠΌΠ°Ρ‰Π°Π±. Π Π°Π·ΡƒΠΌΠ½ΠΎ Π΅ Π΄Π° ΠΈΠΌΠ°Ρ‚Π΅ няколко производствСни оформлСния.
  10. ВСстванС. Π—Π° Ρ†Π΅Π»ΠΈΡ‚Π΅ Π½Π° тСстванСто ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈ ΠΌΠ°ΠΊΠ΅Ρ‚Π½Π° услуга ΠΈ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ°Ρ‚ΠΎ зависимост ΠΏΠΎ бСзопасСн Ρ‚ΠΈΠΏ Π½Π°Ρ‡ΠΈΠ½. Няколко Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ оформлСния Π·Π° тСстванС с Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ части, Π·Π°ΠΌΠ΅Π½Π΅Π½ΠΈ ΠΎΡ‚ ΠΌΠ°ΠΊΠ΅Ρ‚ΠΈ, ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‚ Π΅Π΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.
  11. Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎ тСстванС. Понякога Π² Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ систСми Π΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π΄Π° сС ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ тСстовС. Използвайки описания ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π·Π° бСзопасна конфигурация Π½Π° Ρ‚ΠΈΠΏΠ° Π½Π° ΠΏΡŠΠ»Π½Π°Ρ‚Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° систСма, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° изпълнявамС всички Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ части Π½Π° Π΅Π΄ΠΈΠ½ ΡΡŠΡ€Π²ΡŠΡ€ ΠΏΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌ Π½Π°Ρ‡ΠΈΠ½. ЛСсно Π΅ Π΄Π° ΡΠΈΠΌΡƒΠ»ΠΈΡ€Π°Ρˆ ситуацията
    ΠΊΠΎΠ³Π°Ρ‚ΠΎ някоя ΠΎΡ‚ услугитС станС Π½Π΅Π΄ΠΎΡΡ‚ΡŠΠΏΠ½Π°.

ΠΠ΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ†ΠΈ

ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ΡŠΡ‚ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π°Ρ‚Π° конфигурация Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½ ΠΎΡ‚ β€žΠ½ΠΎΡ€ΠΌΠ°Π»Π½Π°Ρ‚Π°β€œ конфигурация ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ отговаря Π½Π° всички Π½ΡƒΠΆΠ΄ΠΈ. Π•Ρ‚ΠΎ някои ΠΎΡ‚ Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ†ΠΈΡ‚Π΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π°Ρ‚Π° конфигурация:

  1. Π‘Ρ‚Π°Ρ‚ΠΈΡ‡Π½Π° конфигурация. МоТС Π΄Π° Π½Π΅ Π΅ подходящо Π·Π° всички прилоТСния. Π’ някои случаи ΠΈΠΌΠ° Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ Π±ΡŠΡ€Π·ΠΎ ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π°Π½Π΅ Π½Π° конфигурацията Π² производството, заобикаляйки всички ΠΌΠ΅Ρ€ΠΊΠΈ Π·Π° бСзопасност. Π’ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π³ΠΎ ΠΏΡ€Π°Π²ΠΈ ΠΏΠΎ-Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ. ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΡ‚ΠΎ Ρ€Π°Π·ΠΏΠΎΠ»Π°Π³Π°Π½Π΅ са Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ слСд ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅ Π½Π° всяка промяна Π² конфигурацията. Π’ΠΎΠ²Π° Π΅ Π΅Π΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ характСристиката ΠΈ тСТСстта.
  2. Π“Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° конфигурация. ΠšΠΎΠ³Π°Ρ‚ΠΎ конфигурацията сС Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° ΠΎΡ‚ някакъв инструмСнт Π·Π° автоматизация, Ρ‚ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ изисква послСдващо ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π΅ (ΠΊΠΎΠ΅Ρ‚ΠΎ Π½Π° свой Ρ€Π΅Π΄ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΡ€ΠΎΠ²Π°Π»ΠΈ). МоТС Π΄Π° са Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ усилия Π·Π° ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚Π°Π·ΠΈ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½Π° ΡΡ‚ΡŠΠΏΠΊΠ° Π² систСмата Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅.
  3. инструмСнти. Има ΠΌΠ½ΠΎΠ³ΠΎ инструмСнти, ΠΊΠΎΠΈΡ‚ΠΎ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ днСс, ΠΊΠΎΠΈΡ‚ΠΎ Ρ€Π°Π·Ρ‡ΠΈΡ‚Π°Ρ‚ Π½Π° тСкстови ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Някои ΠΎΡ‚ тях
    няма Π΄Π° Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈΠΌΠΎ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ конфигурацията Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π°.
  4. НСобходима Π΅ промяна Π² мислСнСто. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ ΠΈ DevOps са Π·Π°ΠΏΠΎΠ·Π½Π°Ρ‚ΠΈ с тСкстовитС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅. Π˜Π΄Π΅ΡΡ‚Π° Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π΅ Π½Π° конфигурация ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌ сС стори странна.
  5. ΠŸΡ€Π΅Π΄ΠΈ Π²ΡŠΠ²Π΅ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ° конфигурация Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ процСс Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° висококачСствСн софтуСр.

Има някои ограничСния Π½Π° внСдрСния ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

  1. Ако прСдоставим Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½Π° конфигурация, която Π½Π΅ сС изисква ΠΎΡ‚ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° възСла, ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€ΡŠΡ‚ няма Π΄Π° Π½ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π΄Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ΅ΠΌ липсващото изпълнСниС. Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС Ρ€Π΅ΡˆΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° HList ΠΈΠ»ΠΈ ADTs (класовС Π½Π° случай) Π·Π° конфигурация Π½Π° възСл вмСсто характСристики ΠΈ Cake Pattern.
  2. Врябва Π΄Π° прСдоставим някакъв шаблон Π² конфигурационния Ρ„Π°ΠΉΠ»: (package, import, object Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ;
    override defΠ·Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠΌΠ°Ρ‚ стойности ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅). Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС частично адрСсирано с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° DSL.
  3. Π’ Ρ‚Π°Π·ΠΈ публикация Π½Π΅ Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΎΡ‚ΠΎ ΠΏΡ€Π΅ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ΠΈ ΠΎΡ‚ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ възли.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ Ρ‚Π°Π·ΠΈ публикация ΠΎΠ±ΡΡŠΠ΄ΠΈΡ…ΠΌΠ΅ идСята Π·Π° прСдставянС Π½Π° конфигурация Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π² изходния ΠΊΠΎΠ΄ ΠΏΠΎ бСзопасСн Π½Π°Ρ‡ΠΈΠ½. ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ΡŠΡ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² ΠΌΠ½ΠΎΠ³ΠΎ прилоТСния ΠΊΠ°Ρ‚ΠΎ замСститСл Π½Π° xml ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ тСкстови ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ Π½Π°ΡˆΠΈΡΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ Π² Scala, Ρ‚ΠΎΠΉ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΡ€Π΅Π²Π΅Π΄Π΅Π½ ΠΈ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠΈ Π΅Π·ΠΈΡ†ΠΈ (ΠΊΠ°Ρ‚ΠΎ Kotlin, C#, Swift ΠΈ Π΄Ρ€.). Π§ΠΎΠ²Π΅ΠΊ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΠΏΠΈΡ‚Π° Ρ‚ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π² Π½ΠΎΠ² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ, Π² случай Ρ‡Π΅ Π½Π΅ пасва Π΄ΠΎΠ±Ρ€Π΅, Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ към старомодния Π½Π°Ρ‡ΠΈΠ½.

Π Π°Π·Π±ΠΈΡ€Π° сС, ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ‚Π° конфигурация изисква висококачСствСн процСс Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°. Π’ замяна ΠΎΠ±Π΅Ρ‰Π°Π²Π° Π΄Π° осигури ΡΡŠΡ‰ΠΎ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° висококачСствСна Π·Π΄Ρ€Π°Π²Π° конфигурация.

Π’ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ ΠΏΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π½Π°Ρ‡ΠΈΠ½ΠΈ:

  1. Π§ΠΎΠ²Π΅ΠΊ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° макроси Π·Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅ Π½Π° Π²Π°Π»ΠΈΠ΄ΠΈΡ€Π°Π½Π΅ Π½Π° конфигурация ΠΈ Π΄Π° сС ΠΏΡ€ΠΎΠ²Π°Π»ΠΈ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π΅ Π² случай Π½Π° нСуспСхи Π½Π° ограничСнията Π½Π° бизнСс Π»ΠΎΠ³ΠΈΠΊΠ°Ρ‚Π°.
  2. DSL ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Π²Π½Π΅Π΄Ρ€Π΅Π½, Π·Π° Π΄Π° прСдстави конфигурацията ΠΏΠΎ ΡƒΠ΄ΠΎΠ±Π΅Π½ Π·Π° потрСбитСля Π½Π°Ρ‡ΠΈΠ½.
  3. Π”ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° рСсурситС с Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΈ настройки Π½Π° конфигурацията. НапримСр, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π°ΠΌΠ΅ броя Π½Π° ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π½ΠΈΡ‚Π΅ възли, ΠΌΠΎΠΆΠ΅ Π΄Π° искамС (1) Π²ΡŠΠ·Π»ΠΈΡ‚Π΅ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ Π»Π΅ΠΊΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½Π° конфигурация; (2) ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡŠΡ€ Π½Π° ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ΠΈ Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° информация Π·Π° Π½ΠΎΠ²ΠΈ възли.

Благодаря

Π‘ΠΈΡ… искал Π΄Π° благодаря Π½Π° АндрСй Баксонов, ПавСл Попов, Антон НСхаСв Π·Π° Π²Π΄ΡŠΡ…Π½ΠΎΠ²ΡΠ²Π°Ρ‰ΠΈΡ‚Π΅ ΠΎΡ‚Π·ΠΈΠ²ΠΈ Π·Π° Ρ‡Π΅Ρ€Π½ΠΎΠ²Π°Ρ‚Π° Π½Π° Ρ‚ΠΎΠ·ΠΈ пост, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π°Ρ…Π° Π΄Π° Π³ΠΎ направя ΠΏΠΎ-ясСн.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com