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

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

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

(english)

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

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

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

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

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

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

Π’ настоящия пост изслСдвамС идСята Π·Π° прСдставянС Π½Π° конфигурацията Π² Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° компилирания Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚.

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

Π’ Ρ‚ΠΎΠ·ΠΈ Ρ€Π°Π·Π΄Π΅Π» сС Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° статична ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ° конфигурация. Π Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚ сС Π΄Π²Π° прости услуги β€” echo услуга ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½Π° echo услугата. На Π±Π°Π·Π°Ρ‚Π° Π½Π° Ρ‚Π΅Π·ΠΈ Π΄Π²Π° услуги сС ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Ρ‚ Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π½Π° систСмата. Π’ Π΅Π΄ΠΈΠ½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΈ Π΄Π²Π΅Ρ‚Π΅ услуги сС Π½Π°ΠΌΠΈΡ€Π°Ρ‚ Π½Π° Π΅Π΄ΠΈΠ½ възСл, Π° Π² другия Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ β€” Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ възли.

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

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])

ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ ΠŸΠΎΡ€Ρ‚ β€” просто цяло число Int с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π½Π° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Π½Π° допустимитС стойности:

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

Π£Ρ‚ΠΎΡ‡Π½Π΅Π½ΠΈ Ρ‚ΠΈΠΏΠΎΠ²Π΅

Π’ΠΈΠΆΡ‚Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° refined ΠΈ ΠΌΠΎΠΉ Π΄ΠΎΠΊΠ»Π°Π΄. Накратко, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° позволява Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ ограничСния към Ρ‚ΠΈΠΏΠΎΠ²Π΅Ρ‚Π΅, провСрявани Π½Π° Π΅Ρ‚Π°ΠΏΠ° Π½Π° компилация. Π’ Ρ‚ΠΎΠ·ΠΈ случай допустимитС стойности Π½Π° Π½ΠΎΠΌΠ΅Ρ€Π° Π½Π° ΠΏΠΎΡ€Ρ‚Π° са Ρ†Π΅Π»ΠΈ 16-Π±ΠΈΡ‚ΠΎΠ²ΠΈ числа. Π—Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π°Ρ‚Π° конфигурация ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° refined Π½Π΅ Π΅ Π·Π°Π΄ΡŠΠ»ΠΆΠΈΡ‚Π΅Π»Π½ΠΎ, Π½ΠΎ позволява Π΄Π° сС ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΈ способността Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€Π° Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° конфигурацията.

Π—Π° HTTP (REST) ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΈΡ‚Π΅, освСн Π½ΠΎΠΌΠ΅Ρ€Π° Π½Π° ΠΏΠΎΡ€Ρ‚Π°, ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½ΡƒΠΆΠ΄Π°Π΅ΠΌ ΠΈ ΠΎΡ‚ ΠΏΡŠΡ‚Ρ към услугата:

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

Π€Π°Π½Ρ‚ΠΎΠΌΠ½ΠΈ Ρ‚ΠΈΠΏΠΎΠ²Π΅

Π—Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° Π½Π° Π΅Ρ‚Π°ΠΏΠ° Π½Π° компилация ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ ΠΎΡ‚ Ρ‚ΠΈΠΏ, ΠΊΠΎΠΉΡ‚ΠΎ Π½Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² самия клас. Π’Π°ΠΊΠΎΠ²Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π΅ ΡΠ²ΡŠΡ€Π·Π°Π½ΠΎ с Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ Π² Π²Ρ€Π΅ΠΌΠ΅ Π½Π° изпълнСниС Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ инстанцията Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°, Π½ΠΎ искамС ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€ΡŠΡ‚ Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈ ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚Ρ‚Π° Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΈΡ‚Π΅. Π§Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° няма Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡ€Π΅Π΄Π°Π΄Π΅ΠΌ нСподходяща услуга ΠΊΠ°Ρ‚ΠΎ зависимост.

Π•Π΄ΠΈΠ½ ΠΎΡ‚ разпространСнитС ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΈ Π΅ REST API с Json-сСриализация:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ RequestMessage β€” Ρ‚ΠΈΠΏ Π½Π° заявката, ResponseMessage β€” Ρ‚ΠΈΠΏ Π½Π° ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€Π°.
Π Π°Π·Π±ΠΈΡ€Π° сС, ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ описания Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ осигуряват Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ°Ρ‚Π° Π½ΠΈ прСцизност Π½Π° описаниСто.

Π—Π° Ρ†Π΅Π»ΠΈΡ‚Π΅ Π½Π° настоящия пост Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ опростСна вСрсия Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°:

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

Π’ΡƒΠΊ заявката прСдставлява Π½ΠΈΠ·, Π΄ΠΎΠ±Π°Π²Π΅Π½ към url, Π° ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ΡŠΡ‚ β€” Π²Ρ€ΡŠΡ‰Π°Π½ Π½ΠΈΠ· Π² тялото Π½Π° HTTP ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€Π°.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡΡ‚Π° Π½Π° услугата сС описва с ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° услугата, ΠΏΠΎΡ€Ρ‚ΠΎΠ²Π΅Ρ‚Π΅ ΠΈ зависимоститС. Π’Π΅Π·ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ прСдставСни Π² Scala ΠΏΠΎ няколко Π½Π°Ρ‡ΠΈΠ½Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, HList-ΠΈΡ‚Π΅, Π°Π»Π³Π΅Π±Ρ€ΠΈΡ‡Π½ΠΈ Ρ‚ΠΈΠΏΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ). Π—Π° Ρ†Π΅Π»ΠΈΡ‚Π΅ Π½Π° настоящия пост Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Cake Pattern ΠΈ Ρ‰Π΅ прСдставим ΠΌΠΎΠ΄ΡƒΠ»ΠΈΡ‚Π΅ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° traitβ€˜ΠΈ. (Cake Pattern Π½Π΅ Π΅ Π·Π°Π΄ΡŠΠ»ΠΆΠΈΡ‚Π΅Π»Π΅Π½ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ ΠΎΡ‚ описания ΠΏΠΎΠ΄Ρ…ΠΎΠ΄. Π’ΠΎΠ²Π° Π΅ просто Π΅Π΄Π½Π° ΠΎΡ‚ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΈΡ‚Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.)

ЗависимоститС ΠΌΠ΅ΠΆΠ΄Ρƒ услугитС ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ прСдставСни ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π²Ρ€ΡŠΡ‰Π°Ρ‚ ΠΏΠΎΡ€Ρ‚ΠΎΠ²Π΅Ρ‚Π΅ Π½Π° EndPointβ€˜ΠΈΡ‚Π΅ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ възли:

  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)
  }

Π—Π° ΡΡŠΠ·Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π΅Ρ…ΠΎ-сСрвис Π΅ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ само Π½ΠΎΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° ΠΏΠΎΡ€Ρ‚Π° ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅Ρ‚ΠΎ, Ρ‡Π΅ Ρ‚ΠΎΠ·ΠΈ ΠΏΠΎΡ€Ρ‚ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° Π΅Ρ…ΠΎ-ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°. ΠœΠΎΠΆΠ΅Ρ…ΠΌΠ΅ Π΄Π° Π½Π΅ ΡƒΠΊΠ°Π·Π²Π°ΠΌΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π΅Π½ ΠΏΠΎΡ€Ρ‚, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ trait-ΠΎΠ²Π΅Ρ‚Π΅ позволяват Π΄Π° Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π°ΠΌΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π±Π΅Π· рСализация (абстрактни ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ). Π’ Ρ‚ΠΎΠ·ΠΈ случай ΠΏΡ€ΠΈ ΡΡŠΠ·Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π° конфигурация ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€ΡŠΡ‚ Ρ‰Π΅ΡˆΠ΅ Π΄Π° изисква ΠΎΡ‚ нас Π΄Π° прСдоставим рСализация Π½Π° абстрактния ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈ Π΄Π° посочим Π½ΠΎΠΌΠ΅Ρ€ Π½Π° ΠΏΠΎΡ€Ρ‚Π°. Въй ΠΊΠ°Ρ‚ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Ρ…ΠΌΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΏΡ€ΠΈ ΡΡŠΠ·Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π° конфигурация ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π΅ ΡƒΠΊΠ°Π·Π²Π°ΠΌΠ΅ Π΄Ρ€ΡƒΠ³ ΠΏΠΎΡ€Ρ‚. Π©Π΅ бъдС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π° стойността ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅.

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

  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]
  }

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

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

ΠΈ останалитС Ρ‚ΠΈΠΏΠΎΠ²Π΅ ΠΎΡ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° cats:

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

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

  trait ZeroServiceImpl[F[_]] extends ServiceImpl[F] {
    type Config  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
}

ΠžΠ±ΡŠΡ€Π½Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Π΅ посочвамС точния Ρ‚ΠΈΠΏ конфигурация, която Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° Π·Π° Ρ‚ΠΎΠ·ΠΈ възСл. Ако пропуснСм Π΄Π° посочим някой ΠΎΡ‚ Ρ‚ΠΈΠΏΠΎΠ²Π΅Ρ‚Π΅ конфигурация, изисквани ΠΎΡ‚ ΠΎΡ‚Π΄Π΅Π»Π½Π° услуга, Ρ‰Π΅ възникнС Π³Ρ€Π΅ΡˆΠΊΠ° ΠΏΡ€ΠΈ компилацията. Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ°, Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° стартирамС възСл, Π°ΠΊΠΎ Π½Π΅ прСдоставим някакъв ΠΎΠ±Π΅ΠΊΡ‚ с подходящ Ρ‚ΠΈΠΏ, ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰ всички Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ Π΄Π°Π½Π½ΠΈ.

Π Π°Π·Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅ Π½Π° ΠΈΠΌΠ΅Π½Π° Π½Π° възли

Π—Π° Π΄Π° сС ΡΠ²ΡŠΡ€ΠΆΠ΅ΠΌ с ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ възСл, Π½ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ Ρ€Π΅Π°Π»Π΅Π½ IP адрСс. Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅ Π°Π΄Ρ€Π΅ΡΡŠΡ‚ Π΄Π° станС извСстСн ΠΏΠΎ-късно ΠΎΡ‚ останалитС части Π½Π° конфигурацията. Π•Ρ‚ΠΎ Π·Π°Ρ‰ΠΎ Π½ΠΈ трябва функция, която Π΄Π° отразява ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Π½Π° възСла Π² адрСс:

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

МоТСм Π΄Π° ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠΌ няколко Π½Π°Ρ‡ΠΈΠ½Π° Π·Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° Ρ‚Π°ΠΊΠ°Π²Π° функция:

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

Π’ Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° настоящото пост Π½ΠΈΠ΅ няма Π΄Π° Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ Ρ‚Π΅Π·ΠΈ случаи ΠΏΠΎ-ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ. Π—Π° нашия
ΠΈΠ³Ρ€Π°Ρ‡ΠΊΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ всички възли Ρ‰Π΅ ΠΈΠΌΠ°Ρ‚ Π΅Π΄ΠΈΠ½ IP адрСс β€” 127.0.0.1.

По-Π΄ΠΎΠ»Ρƒ Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° систСма:

  1. Π Π°Π·ΠΏΠΎΠ»Π°Π³Π°Π½Π΅ Π½Π° всички услуги Π½Π° Π΅Π΄ΠΈΠ½ възСл.
  2. И Ρ€Π°Π·ΠΏΠΎΠ»Π°Π³Π°Π½Π΅ Π½Π° Π΅Ρ…ΠΎ услугата ΠΈ Π΅Ρ…ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ възли.

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

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

ΠΎΠ±Π΅ΠΊΡ‚ SingleNodeConfig Ρ€Π°Π·ΡˆΠΈΡ€ΡΠ²Π° EchoConfig[String] 
  с EchoClientConfig[String] с FiniteDurationLifecycleConfig
{
  случайСн ΠΎΠ±Π΅ΠΊΡ‚ Singleton \/\/ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½Π° СдинствСния възСл 
  \/\/ конфигурация Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π°
  Ρ‚ΠΈΠΏ NodeId = Singleton.type
  Π΄Π΅Ρ„ nodeId = Singleton

  \/** БпСцификация Π½Π° бСзопасСн Ρ‚ΠΈΠΏ Π·Π° ΠΏΠΎΡ€Ρ‚ Π½Π° услугата. *\/ 
  ΠΏΡ€Π΅ΠΎΠ²Π΅Ρ€Π΅Ρ‚Π΅ Π΄Π΅Ρ„ portNumber: PortNumber = 8088

  \/\/ конфигурация Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°

  \/** Π©Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ услугата, прСдоставяна ΠΎΡ‚ ΡΡŠΡ‰ΠΈΡ хост. *\/ 
  Π΄Π΅Ρ„ echoServiceDependency = echoService

  ΠΏΡ€Π΅ΠΎΠ²Π΅Ρ€Π΅Ρ‚Π΅ Π΄Π΅Ρ„ testMessage: UrlPathElement = "hello"

  Π΄Π΅Ρ„ pollInterval: FiniteDuration = 1.second

  \/\/ конфигурация Π½Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€Π° Π½Π° ТизнСния Ρ†ΠΈΠΊΡŠΠ»
  Π΄Π΅Ρ„ lifetime: FiniteDuration = 10500.milliseconds \/\/ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ 0.5 сСкунди, Π·Π° Π΄Π° сС постигнат 10 заявки, Π° Π½Π΅ 9.
}

ΠžΠ±Π΅ΠΊΡ‚ΡŠΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π° конфигурацията ΠΈ Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, ΠΈ Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π°. Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° конфигурация Π½Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΆΠΈΠ²ΠΎΡ‚, Π·Π° Π΄Π° ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° слСд ΠΈΠ·Ρ‚ΠΈΡ‡Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» ΠΆΠΈΠ·Π½Π΅Π½ Ρ†ΠΈΠΊΡŠΠ» ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Π΄Π° сС Π·Π°Ρ‚Π²ΠΎΡ€ΠΈ. (Ctrl-C ΡΡŠΡ‰ΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ освобоТдава всички рСсурси.)

Π‘ΡŠΡ‰ΠΈΡΡ‚ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ trait'ΠΎΠ²Π΅ Π·Π° конфигурация ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° създаванС Π½Π° систСма, ΡΡŠΡΡ‚ΠΎΡΡ‰Π° сС ΠΎΡ‚ Π΄Π²Π΅ ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ възли:

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

  ΠΎΠ±Π΅ΠΊΡ‚ NodeServerConfig Ρ€Π°Π·ΡˆΠΈΡ€ΡΠ²Π° EchoConfig[String] с SigTermLifecycleConfig
  {
    Ρ‚ΠΈΠΏ NodeId = NodeIdImpl

    Π΄Π΅Ρ„ nodeId = NodeServer

    ΠΏΡ€Π΅ΠΎΠ²Π΅Ρ€Π΅Ρ‚Π΅ Π΄Π΅Ρ„ portNumber: PortNumber = 8080
  }

  ΠΎΠ±Π΅ΠΊΡ‚ NodeClientConfig Ρ€Π°Π·ΡˆΠΈΡ€ΡΠ²Π° EchoClientConfig[String] с FiniteDurationLifecycleConfig
  {
    \/\/ NB! спСцификация Π½Π° зависимост
    Π΄Π΅Ρ„ echoServiceDependency = NodeServerConfig.echoService

    Π΄Π΅Ρ„ pollInterval: FiniteDuration = 1.second

    Π΄Π΅Ρ„ lifetime: FiniteDuration = 10500.milliseconds \/\/ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ 0.5 сСкунди, Π·Π° Π΄Π° сС постигнат 10 заявки, Π° Π½Π΅ 9.

    Π΄Π΅Ρ„ testMessage: String = "dolly"
  }

Π’Π°ΠΆΠ½ΠΎ! ΠžΠ±ΡŠΡ€Π½Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΊΠ°ΠΊ сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° услуги. ΠŸΠΎΡΠΎΡ‡Π²Π°ΠΌΠ΅ услугата, Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π° ΠΎΡ‚ Π΅Π΄ΠΈΠ½ възСл, ΠΊΠ°Ρ‚ΠΎ рСализация Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°-зависимост Π½Π° другия възСл. Π’ΠΈΠΏΡŠΡ‚ Π½Π° зависимостта сС провСрява ΠΎΡ‚ ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€Π°, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Ρ‚ΠΈΠΏΠ° Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°. ΠŸΡ€ΠΈ стартиранС зависимостта Ρ‰Π΅ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° правилния ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½Π° цСлСвия възСл. Π‘Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½ΠΈΠ΅ Π½Π° Ρ‚Π°Π·ΠΈ схСма посочвамС Π½ΠΎΠΌΠ΅Ρ€Π° Π½Π° ΠΏΠΎΡ€Ρ‚Π° само вСднъТ ΠΈ Π²ΠΈΠ½Π°Π³ΠΈ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π°Π½ΠΎ посочвамС правилния ΠΏΠΎΡ€Ρ‚.

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

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

  ΠΎΠ±Π΅ΠΊΡ‚ TwoJvmNodeServerImpl Ρ€Π°Π·ΡˆΠΈΡ€ΡΠ²Π° ZeroServiceImpl[IO] с EchoServiceService ΠΈ SigIntLifecycleServiceImpl {
    Ρ‚ΠΈΠΏ Config = EchoConfig[String] с SigTermLifecycleConfig
  }

  ΠΎΠ±Π΅ΠΊΡ‚ TwoJvmNodeClientImpl Ρ€Π°Π·ΡˆΠΈΡ€ΡΠ²Π° ZeroServiceImpl[IO] с EchoClientService ΠΈ FiniteDurationLifecycleServiceImpl {
    Ρ‚ΠΈΠΏ Config = EchoClientConfig[String] с FiniteDurationLifecycleConfig
  }

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

ΠžΠ±Ρ‰ΠΈΡΡ‚ процСс Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°

Π”Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ Ρ‚ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ към ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ влияС Π½Π° общия процСс Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°.

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

Всяка промяна Π² конфигурацията сС ΠΏΡ€Π΅Π²Ρ€ΡŠΡ‰Π° Π² промяна Π² ΠΊΠΎΠ΄Π°. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ, всяка Ρ‚Π°ΠΊΠ°Π²Π°
промяна Ρ‰Π΅ бъдС ΠΎΠ±Ρ…Π²Π°Π½Π°Ρ‚Π° ΠΎΡ‚ обичайния процСс Π½Π° осигуряванС Π½Π° качСство:

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

ΠžΡΠ½ΠΎΠ²Π½ΠΈΡ‚Π΅ послСдствия ΠΎΡ‚ внСдряванСто Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ° конфигурация:

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

  2. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Π΅ Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ конфигурацията само Π² Π΅Π΄ΠΈΠ½ ΠΎΡ‚ Π²ΡŠΠ·Π»ΠΈΡ‚Π΅. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ β€žΠ΄ΠΈΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡΡ‚Π°β€œ (configuration drift) Π΅ ΠΌΠ°Π»ΠΊΠΎ вСроятна.

  3. Π‘Ρ‚Π°Π²Π° всС ΠΏΠΎ-Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π΄Π° сС правят ΠΌΠ°Π»ΠΊΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² конфигурацията.

  4. По-голямата част ΠΎΡ‚ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π² конфигурацията Ρ‰Π΅ сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Ρ‚ Π² Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° общия процСс Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈ Ρ‰Π΅ ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‚ Π½Π° Ρ€Π΅Π²ΡŽ.

НуТСн Π»ΠΈ Π΅ ΠΎΡ‚Π΄Π΅Π»Π΅Π½ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° production конфигурацията? Π’ Ρ‚Π°ΠΊΠ°Π²Π° конфигурация ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‚ ΠΏΠ°Ρ€ΠΎΠ»ΠΈ ΠΈ Π΄Ρ€ΡƒΠ³Π° сСкрСтна информация, Π΄ΠΎΡΡ‚ΡŠΠΏΡŠΡ‚ Π΄ΠΎ която Π±ΠΈΡ…ΠΌΠ΅ искали Π΄Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠΌ. Π˜ΡΡ…ΠΎΠ΄Ρ ΠΎΡ‚ Ρ‚ΠΎΠ²Π°, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ ΠΈΠΌΠ° смисъл Π΄Π° сС ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° ΠΊΡ€Π°ΠΉΠ½Π°Ρ‚Π° конфигурация Π² ΠΎΡ‚Π΄Π΅Π»Π΅Π½ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ. МоТС Π΄Π° сС Ρ€Π°Π·Π΄Π΅Π»ΠΈ конфигурацията Π½Π° Π΄Π²Π΅ части β€” Π΅Π΄Π½Π°, ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰Π° ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΈΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ Π½Π° конфигурацията, ΠΈ Π΄Ρ€ΡƒΠ³Π°, ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅ с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ Π΄ΠΎΡΡ‚ΡŠΠΏ. Π’ΠΎΠ²Π° Ρ‰Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π½Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈ Π΄Π° ΠΈΠΌΠ°Ρ‚ Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ ΠΎΠ±Ρ‰ΠΈΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ. Π’Π°ΠΊΠΎΠ²Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π΅ Π΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π΄Π° сС постигнС, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π½ΠΈ trait-ΠΎΠ²Π΅, ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰ΠΈ стойности ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅.

Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΈ Π²Π°Ρ€ΠΈΠ°Ρ†ΠΈΠΈ

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

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

ВСкстовитС Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ прСдоставят Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½Π° Π³ΡŠΠ²ΠΊΠ°Π²ΠΎΡΡ‚ относно ΠΌΠ°Π»ΠΊΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ. БистСмният администратор ΠΌΠΎΠΆΠ΅ Π΄Π° Π²Π»Π΅Π·Π΅ Π² ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ възСл, Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΈ Π΄Π° рСстартира услугата. Π—Π° Π³ΠΎΠ»Π΅ΠΌΠΈ систСми ΠΎΠ±Π°Ρ‡Π΅ Ρ‚Π°ΠΊΠ°Π²Π° Π³ΡŠΠ²ΠΊΠ°Π²ΠΎΡΡ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»Π½Π°. ΠžΡ‚ Π½Π°ΠΏΡ€Π°Π²Π΅Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π½Π΅ остават слСди Π² Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ систСми. Никой Π½Π΅ ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° ΠΏΡ€Π΅Π³Π»Π΅Π΄ Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅. Π’Ρ€ΡƒΠ΄Π½ΠΎ Π΅ Π΄Π° сС установи ΠΊΠΎΠΉ Ρ‚ΠΎΡ‡Π½ΠΎ Π΅ Π½Π°ΠΏΡ€Π°Π²ΠΈΠ» ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΈ ΠΏΠΎ ΠΊΠ°ΠΊΠ²Π° ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°. ΠŸΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π½Π΅ сС тСстват. Ако систСмата Π΅ Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, Π°Π΄ΠΌΠΈΠ½ΠΈΡΡ‚Ρ€Π°Ρ‚ΠΎΡ€ΡŠΡ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°Π±Ρ€Π°Π²ΠΈ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½Π°Ρ‚Π° промяна Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ възли.

(Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° сС ΠΎΡ‚Π±Π΅Π»Π΅ΠΆΠΈ, Ρ‡Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π° конфигурация Π½Π΅ ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π²Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° тСкстови Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π² Π±ΡŠΠ΄Π΅Ρ‰Π΅. Π”ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ Π΅ Π΄Π° сС Π΄ΠΎΠ±Π°Π²ΠΈ парсСр ΠΈ Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€, ΠΊΠΎΠΈΡ‚ΠΎ Π΄Π° Π΄Π°Π²Π°Ρ‚ Π½Π° ΠΈΠ·Ρ…ΠΎΠ΄Π° ΡΡŠΡ‰ΠΈΡ Ρ‚ΠΈΠΏ ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ, ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ тСкстови Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅. ΠžΡ‚Ρ‚ΡƒΠΊ слСдва, Ρ‡Π΅ слоТността Π½Π° систСмата с ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π° конфигурация Π΅ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠ° ΠΎΡ‚ слоТността Π½Π° систСма, която ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° тСкстови Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π·Π° тСкстовитС Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π΅Π½ ΠΊΠΎΠ΄.)

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

Ако ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ рядко сС промСнят, трябва Π΄Π° сС обновяват Π±Π΅Π· рСстартиранС Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, Ρ‚ΠΎ чСсто Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ услоТнСниС Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Ρ‰Π΅ Π½ΠΈ трябва ΠΏΠΎ някакъв Π½Π°Ρ‡ΠΈΠ½ Π΄Π° доставямС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅, Π΄Π° Π³ΠΈ ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°ΠΌΠ΅, парсвамС ΠΈ провСрявамС, ΠΈ Π΄Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°ΠΌΠ΅ Π½Π΅ΠΊΠΎΡ€Π΅ΠΊΡ‚Π½ΠΈ стойности. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ, ΠΎΡ‚ Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° намаляванС Π½Π° слоТността Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, ΠΈΠΌΠ° смисъл Π΄Π° сС Π½Π°ΠΌΠ°Π»ΠΈ броят Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС промСнят ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° (ΠΈΠ»ΠΈ ΠΈΠ·ΠΎΠ±Ρ‰ΠΎ Π΄Π° Π½Π΅ сС ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‚ Ρ‚Π°ΠΊΠΈΠ²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ).

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

Π•Π΄ΠΈΠ½ ΠΎΡ‚ Π²Π°ΠΆΠ½ΠΈΡ‚Π΅ аспСкти Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° статична конфигурация, ΠΊΠΎΠΉΡ‚ΠΎ ΠΊΠ°Ρ€Π° Ρ…ΠΎΡ€Π°Ρ‚Π° Π΄Π° Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π°Ρ‚ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΎΡ‚ΠΎ Ρ€Π΅ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π΅, Π΅ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π° систСмата Π΄Π° сС рСстартира слСд актуализация Π½Π° конфигурацията (downtime). Π’ΡΡŠΡ‰Π½ΠΎΡΡ‚, Π°ΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² статичната конфигурация, Ρ‰Π΅ трябва Π΄Π° рСстартирамС систСмата, Π·Π° Π΄Π° влязат Π½ΠΎΠ²ΠΈΡ‚Π΅ стойности Π² сила. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚ с downtime-Π° ΠΈΠΌΠ° Ρ€Π°Π·Π»ΠΈΡ‡Π½Π° острота Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ систСми. Π’ някои случаи рСстартиранСто ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΠ»Π°Π½ΠΈΡ€Π°Π½ΠΎ Π·Π° Π²Ρ€Π΅ΠΌΠ΅, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅Ρ‚ΠΎ Π΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΎ. Π’ случай, Ρ‡Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° сС осигури Π½Π΅ΠΏΡ€Π΅ΠΊΡŠΡΠ½Π°Ρ‚Π° услуга, ΠΌΠΎΠΆΠ΅ Π΄Π° сС Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π° «отводняванС Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠΈΡ‚Π΅Β» (AWS ELB connection draining). ΠšΠΎΠ³Π°Ρ‚ΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° рСстартирамС систСмата, стартирамС ΠΏΠ°Ρ€Π°Π»Π΅Π»Π΅Π½ СкзСмпляр Π½Π° Ρ‚Π°Π·ΠΈ систСма, прСнасочвамС балансиращия ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ към Π½Π΅Π³ΠΎ ΠΈ ΠΈΠ·Ρ‡Π°ΠΊΠ²Π°ΠΌΠ΅, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ старитС Π²Ρ€ΡŠΠ·ΠΊΠΈ ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡Π°Ρ‚. Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ всички стари Π²Ρ€ΡŠΠ·ΠΊΠΈ ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡Π°Ρ‚, ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π²Π°ΠΌΠ΅ стария СкзСмпляр Π½Π° систСмата.

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

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

Π—Π° ΠΈ ΠΏΡ€ΠΎΡ‚ΠΈΠ²

Π‘ΠΈΡ… искал Π΄Π° сС спра Π½Π° прСдимствата ΠΈ Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ†ΠΈΡ‚Π΅ Π½Π° ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π½Π°Ρ‚Π° тСхнология.

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

По-Π΄ΠΎΠ»Ρƒ Π΅ списък с основнитС Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π°Ρ‚Π° конфигурация Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° систСма:

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

ΠΠ΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ†ΠΈ ΠΈ ограничСния

ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π°Ρ‚Π° конфигурация сС Ρ€Π°Π·Π»ΠΈΡ‡Π°Π²Π° ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈ Π·Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π΅ ΠΈ Π·Π° някои прилоТСния ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ Π΅ подходяща. По-Π΄ΠΎΠ»Ρƒ са ΠΈΠ·Π±Ρ€ΠΎΠ΅Π½ΠΈ някои Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ†ΠΈ:

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

Π©Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Ρ€Π΅Π΄ΠΈΡ†Π° ограничСния Π½Π° разглСТдания ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ са ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ с идСята Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π° конфигурация:

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

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

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

ЕстСствСно, ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ‚Π° конфигурация изисква висококачСствСн процСс Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°. Π’ замяна сС осигурява високо качСство ΠΈ надСТдност Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈΡ‚Π΅.

РазглСданият ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½:

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

Благодарности

Благодаря Π½Π° АндрСй Баксонов, ПавСл Попов ΠΈ Антон НСхаСв Π·Π° конструктивната ΠΊΡ€ΠΈΡ‚ΠΈΠΊΠ° Π½Π° Ρ‡Π΅Ρ€Π½ΠΎΠ²Π°Ρ‚Π° Π½Π° статията.

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

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster