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

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

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

(Английски)

въвСдСниС

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

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

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

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

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

Π’ Ρ‚Π°Π·ΠΈ публикация Ρ‰Π΅ ΠΏΡ€ΠΎΡƒΡ‡ΠΈΠΌ идСята Π·Π° прСдставянС Π½Π° конфигурация Π²ΡŠΡ‚Ρ€Π΅ Π² ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚.

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

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

ОбикновСно Π΅Π΄Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° систСма ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° няколко възСла. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Ρ‚Π΅ възли, ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ стойности ΠΎΡ‚ някакъв Ρ‚ΠΈΠΏ 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])

ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ Port - просто цяло число Int ΡƒΠΊΠ°Π·Π²Π°Ρ‰ ΠΎΠ±Ρ…Π²Π°Ρ‚Π° Π½Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ»ΠΈΠ²ΠΈΡ‚Π΅ стойности:

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

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

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

Π—Π° 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-s, Π°Π»Π³Π΅Π±Ρ€ΠΈΡ‡Π½ΠΈ Ρ‚ΠΈΠΏΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ). Π—Π° Ρ†Π΅Π»ΠΈΡ‚Π΅ Π½Π° Ρ‚Π°Π·ΠΈ публикация Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ шаблона Π·Π° Ρ‚ΠΎΡ€Ρ‚Π° ΠΈ Ρ‰Π΅ прСдставим ΠΌΠΎΠ΄ΡƒΠ»ΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° trait'ΠΎΠ². (ΠœΠΎΠ΄Π΅Π»ΡŠΡ‚ Π·Π° Ρ‚ΠΎΡ€Ρ‚Π° Π½Π΅ Π΅ Π·Π°Π΄ΡŠΠ»ΠΆΠΈΡ‚Π΅Π»Π΅Π½ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ ΠΎΡ‚ Ρ‚ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄. Π’ΠΎΠ²Π° Π΅ просто Π΅Π΄Π½ΠΎ възмоТно изпълнСниС.)

ЗависимоститС ΠΌΠ΅ΠΆΠ΄Ρƒ услугитС ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ прСдставСни ΠΊΠ°Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π²Ρ€ΡŠΡ‰Π°Ρ‚ ΠΏΠΎΡ€Ρ‚ΠΎΠ²Π΅ 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)
  }

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

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

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

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

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

НСобходима Π΅ функция Π·Π° стартиранС ΠΈ спиранС Π½Π° услугата. (Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Π·Π° спиранС Π½Π° услугата Π΅ ΠΎΡ‚ Ρ€Π΅ΡˆΠ°Π²Π°Ρ‰ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π·Π° тСстванСто.) ΠžΡ‚Π½ΠΎΠ²ΠΎ ΠΈΠΌΠ° няколко ΠΎΠΏΡ†ΠΈΠΈ Π·Π° внСдряванС Π½Π° Ρ‚Π°ΠΊΠ°Π²Π° функция (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Ρ‚ΠΈΠΏΠΎΠ²ΠΈ класовС въз основа Π½Π° Ρ‚ΠΈΠΏΠ° конфигурация). Π—Π° Ρ†Π΅Π»ΠΈΡ‚Π΅ Π½Π° Ρ‚Π°Π·ΠΈ публикация Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ шаблона Π·Π° Ρ‚ΠΎΡ€Ρ‚Π°. Π©Π΅ прСдставим услугата с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° клас 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 β€” клас Ρ‚ΠΈΠΏ Π΅Ρ„Π΅ΠΊΡ‚, ΠΊΠΎΠΉΡ‚ΠΎ Π²ΠΈ позволява Π΄Π° ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°Ρ‚Π΅ ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ Π΅Ρ„Π΅ΠΊΡ‚ΠΈ (ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΌΠΎΠ½Π°Π΄Π°). Π’ ΠΏΠΎ-слоТни прилоТСния ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Monad/ConcurrentEffect.

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

  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
}

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

Π Π΅Π·ΠΎΠ»ΡŽΡ†ΠΈΡ Π½Π° ΠΈΠΌΠ΅ Π½Π° хост

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

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

Има няколко Π½Π°Ρ‡ΠΈΠ½Π° Π·Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° Ρ‚Π°Π·ΠΈ функция:

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

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

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ Π΄Π²Π΅ ΠΎΠΏΡ†ΠΈΠΈ Π·Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° систСма:

  1. ΠŸΠΎΡΡ‚Π°Π²ΡΠ½Π΅ Π½Π° всички услуги Π½Π° Π΅Π΄ΠΈΠ½ възСл.
  2. И хостванС Π½Π° Π΅Ρ…ΠΎ услугата ΠΈ Π΅Ρ…ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ възли.

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

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

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 ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°. (Ctrl-C ΡΡŠΡ‰ΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΈ освобоТдава всички рСсурси ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ.)

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

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

  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'om ΠΈ клиСнтският възСл сС прСкратява слСд извСстно Π²Ρ€Π΅ΠΌΠ΅. Π‘ΠΌ. ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° стартиранС.

ΠžΠ±Ρ‰ процСс Π½Π° Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅

НСка Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ Ρ‚ΠΎΠ·ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π΅Π½ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ влияС Π½Π° цялостния процСс Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°.

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

Всяка промяна Π½Π° конфигурацията сС ΠΏΡ€Π΅Π²Ρ€ΡŠΡ‰Π° Π² промяна Π½Π° ΠΊΠΎΠ΄Π°. И слСдоватСлно всСки
промяната Ρ‰Π΅ бъдС ΠΏΠΎΠΊΡ€ΠΈΡ‚Π° ΠΎΡ‚ нормалния процСс Π·Π° осигуряванС Π½Π° качСството:

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

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

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

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

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

  4. ΠŸΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² конфигурацията Ρ‰Π΅ Π½Π°ΡΡ‚ΡŠΠΏΡΡ‚ ΠΊΠ°Ρ‚ΠΎ част ΠΎΡ‚ цялостния процСс Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈ Ρ‰Π΅ ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‚ Π½Π° ΠΏΡ€Π΅Π³Π»Π΅Π΄.

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

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

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

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

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

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

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

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

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

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

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

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

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

Π‘ΠΈΡ… искал Π΄Π° сС спра Π½Π° ΠΏΠ»ΡŽΡΠΎΠ²Π΅Ρ‚Π΅ ΠΈ минуситС Π½Π° ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π°Ρ‚Π° тСхнология.

прСдимства

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

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

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

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

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

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

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

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

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

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

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

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

ΠŸΡ€ΠΈΠ·Π½Π°Π½ΠΈΡ

Π‘ΠΈΡ… искал Π΄Π° благодаря Π½Π° АндрСй Баксонов, ПавСл Попов ΠΈ Антон НСхаСв Π·Π° тяхната Π³Ρ€Π°Π΄ΠΈΠ²Π½Π° ΠΊΡ€ΠΈΡ‚ΠΈΠΊΠ° към проСктостатията.

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€