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

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

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

(Π½Π° Π±ΡŠΠ»Π³Π°Ρ€ΡΠΊΠΈ)

Introduction

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

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

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

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

where ΠŸΠΎΡ€Ρ‚ Π΅ просто Π΅Π΄ΠΈΠ½ Int Π² допускания Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½:

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

Refined Ρ‚ΠΈΠΏΠΎΠ²Π΅

Π’ΠΈΠΆ refined Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°. Π‘ ΠΊΡ€Π°Ρ‚ΠΊΠΎ ΠΊΠ°Π·Π°Π½ΠΎ, тя позволява Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ ограничСния Π·Π° Π²Ρ€Π΅ΠΌΠ΅ Π½Π° компилация към Π΄Ρ€ΡƒΠ³ΠΈ Ρ‚ΠΈΠΏΠΎΠ²Π΅. Π’ Ρ‚ΠΎΠ·ΠΈ случай 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 Π·Π° Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° Ρ‚ΠΈΠΏΠΎΠ² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΊΠΎΠΉΡ‚ΠΎ Π½Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² класа. Π’ΠΎΠ²Π° Π΅ Ρ‚Π°ΠΊΠ° нарСчСният Ρ„Π°Π½Ρ‚ΠΎΠΌΠ΅Π½ Ρ‚ΠΈΠΏ. Π’Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° рядко ΠΈΠΌΠ°ΠΌΠ΅ Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ инстанция Π½Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ», ΠΏΠΎΡ€Π°Π΄ΠΈ ΠΊΠΎΠ΅Ρ‚ΠΎ Π½Π΅ я ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°ΠΌΠ΅. По Π²Ρ€Π΅ΠΌΠ΅ Π½Π° компилация Ρ‚ΠΎΠ·ΠΈ Ρ„Π°Π½Ρ‚ΠΎΠΌΠ΅Π½ Ρ‚ΠΈΠΏ Π΄Π°Π²Π° Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½Π° Ρ‚ΠΈΠΏΠΎΠ²Π° бСзопасност. НС ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡ€Π΅Π΄Π°Π΄Π΅ΠΌ ΠΏΠΎΡ€Ρ‚ с Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π΅Π½ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ».

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

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

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

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

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

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

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡΡ‚Π° Π½Π° услугата ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС описана Ρ‡Ρ€Π΅Π· ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° услугата, колСкция ΠΎΡ‚ ΠΏΠΎΡ€Ρ‚ΠΎΠ²Π΅ ΠΈ някои зависимости. Има няколко възмоТни Π½Π°Ρ‡ΠΈΠ½Π° Π·Π° прСдставянС Π½Π° всички Ρ‚Π΅Π·ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ Π² Scala (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, HList, Π°Π»Π³Π΅Π±Ρ€ΠΈΡ‡Π½ΠΈ Ρ‚ΠΈΠΏΠΎΠ²Π΅ Π΄Π°Π½Π½ΠΈ). Π—Π° Ρ†Π΅Π»ΠΈΡ‚Π΅ Π½Π° Ρ‚Π°Π·ΠΈ публикация Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Cake Pattern ΠΈ Ρ‰Π΅ прСдставим ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°Π»Π½ΠΈ части (ΠΌΠΎΠ΄ΡƒΠ»ΠΈ) ΠΊΠ°Ρ‚ΠΎ traits. (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 услугата просто сС Π½ΡƒΠΆΠ΄Π°Π΅ ΠΎΡ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ ΠΏΠΎΡ€Ρ‚. И Π½ΠΈΠ΅ Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π°ΠΌΠ΅, Ρ‡Π΅ Ρ‚ΠΎΠ·ΠΈ ΠΏΠΎΡ€Ρ‚ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° echo ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ». ΠžΠ±ΡŠΡ€Π½Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Π΅ Π½Π° Ρ‚ΠΎΠ·ΠΈ Π΅Ρ‚Π°ΠΏ Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° спСцифицирамС ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π΅Π½ ΠΏΠΎΡ€Ρ‚, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ traits Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π²Π°Ρ‚ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ Π½Π° абстрактни ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ. Ако ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ абстрактни ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ, ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€ΡŠΡ‚ Ρ‰Π΅ изисква имплСмСнтация Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π΅Π½ инстанс. Π’ΡƒΠΊ прСдоставихмС имплСмСнтацията (8081) ΠΈ тя Ρ‰Π΅ бъдС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π° ΠΊΠ°Ρ‚ΠΎ стойност ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅, Π°ΠΊΠΎ я пропуснСм Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π° конфигурация.

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

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

where

  • ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ β€” Ρ‚ΠΈΠΏ конфигурация, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° Π·Π° стартиранСто Π½Π° Ρ‚Π°Π·ΠΈ услуга
  • 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  Resource.pure[F, Unit]( ()))
  }

(Π’ΠΈΠΆΡ‚Π΅ Π˜Π·Ρ…ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° услуги β€” echo услуга,
echo ΠΊΠ»ΠΈΠ΅Π½Ρ‚ and управляващи ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈ.)

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

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

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

Π Π°Π·Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅ Π½Π° адрСса Π½Π° възСла

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

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 and 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.
}

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

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

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

  ΠΎΠ±Π΅ΠΊΡ‚ 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, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡŠΡ‚ echo Ρ‰Π΅ бъдС ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚Π΅Π½ слСд конфигурирания ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄. Π’ΠΈΠΆΡ‚Π΅ стартовото ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° подробности.

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

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

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

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

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

Π‘ΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‚ слСднитС послСдици ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Благодаря

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

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

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