ΠΠΈ ΡΠ°ΠΊΠ°Π» Π΄Π° Π²ΠΈ ΠΊΠ°ΠΆΠ°ΠΌ Π΅Π΄Π΅Π½ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ΅Π½ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·Π°ΠΌ Π·Π° ΡΠ°Π±ΠΎΡΠ° ΡΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° Π½Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½ ΡΠΈΡΡΠ΅ΠΌ. ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π΅ ΠΏΡΠ΅ΡΡΡΠ°Π²Π΅Π½Π° Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π²ΠΎ ΠΊΠΎΠΌΠΏΠ°ΡΠ»ΠΈΡΠ°Π½ ΡΠ°Π·ΠΈΠΊ (Scala) ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π±Π΅Π·Π±Π΅Π΄Π½ΠΈ ΡΠΈΠΏΠΎΠ²ΠΈ. ΠΠ²ΠΎΡ ΠΏΠΎΡΡ Π΄Π°Π²Π° ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠ°ΠΊΠ²Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° ΠΈ Π΄ΠΈΡΠΊΡΡΠΈΡΠ° Π·Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π°ΡΠΏΠ΅ΠΊΡΠΈ Π½Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π½Π° ΠΊΠΎΠΌΠΏΠ°ΡΠ»ΠΈΡΠ°Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° Π²ΠΎ ΡΠ΅Π²ΠΊΡΠΏΠ½ΠΈΠΎΡ ΡΠ°Π·Π²ΠΎΡΠ΅Π½ ΠΏΡΠΎΡΠ΅Ρ.
ΠΠΎΠ²Π΅Π΄
ΠΠ·Π³ΡΠ°Π΄Π±Π°ΡΠ° Π½Π° ΡΠΈΠ³ΡΡΠ΅Π½ Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½ ΡΠΈΡΡΠ΅ΠΌ Π·Π½Π°ΡΠΈ Π΄Π΅ΠΊΠ° ΡΠΈΡΠ΅ ΡΠ°Π·Π»ΠΈ ΡΠ° ΠΊΠΎΡΠΈΡΡΠ°Ρ ΠΏΡΠ°Π²ΠΈΠ»Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°, ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠ°Π½Π° ΡΠΎ Π΄ΡΡΠ³ΠΈ ΡΠ°Π·Π»ΠΈ. DevOps ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈΡΠ΅ (terraform, 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]]
Π Π°ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ ΡΠΈΠΏΠΎΠ²ΠΈ
ΠΠΈΠ΄ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°
ΠΠ° ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈΡΠ΅ 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.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ° Π΅ ΠΎΠΏΠΈΡΠ°Π½Π° ΡΠΎ ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ°, ΠΏΠΎΡΡΠΈΡΠ΅ ΠΈ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠΈΡΠ΅. ΠΠ²ΠΈΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ ΠΌΠΎΠΆΠ°Ρ Π΄Π° Π±ΠΈΠ΄Π°Ρ ΠΏΡΠ΅ΡΡΡΠ°Π²Π΅Π½ΠΈ Π²ΠΎ Π‘ΠΊΠ°Π»Π° Π½Π° Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π½Π°ΡΠΈΠ½ΠΈ (Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, 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)
}
ΠΠ° Π΄Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΡΡΠ»ΡΠ³Π° Π·Π° Π΅Ρ ΠΎ, ΡΠ΅ ΡΡΠΎ Π²ΠΈ ΡΡΠ΅Π±Π° Π΅ Π±ΡΠΎΡ Π½Π° ΠΏΠΎΡΡΠ° ΠΈ ΠΈΠ½Π΄ΠΈΠΊΠ°ΡΠΈΡΠ° Π΄Π΅ΠΊΠ° ΠΏΡΠΈΡΡΠ°Π½ΠΈΡΡΠ΅ΡΠΎ Π³ΠΎ ΠΏΠΎΠ΄Π΄ΡΠΆΡΠ²Π° ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΡ Π·Π° Π΅Ρ ΠΎ. ΠΠΎΠΆΠ΅Π±ΠΈ Π½Π΅ΠΌΠ° Π΄Π° Π½Π°Π²Π΅Π΄Π΅ΠΌΠ΅ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½Π° ΠΏΠΎΡΡΠ°, Π±ΠΈΠ΄Π΅ΡΡΠΈ ... ΠΊΠ°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈΡΠ΅ Π²ΠΈ Π΄ΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Π°Ρ Π΄Π° Π΄Π΅ΠΊΠ»Π°ΡΠΈΡΠ°ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π±Π΅Π· ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° (Π°ΠΏΡΡΡΠ°ΠΊΡΠ½ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ). ΠΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ, ΠΏΡΠΈ ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°, ΠΊΠΎΠΌΠΏΠ°ΡΠ»Π΅ΡΠΎΡ ΡΠ΅ Π±Π°ΡΠ° ΠΎΠ΄ Π½Π°Ρ Π΄Π° ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈΠΌΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π½Π° Π°ΠΏΡΡΡΠ°ΠΊΡΠ½ΠΈΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΈ Π΄Π° ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈΠΌΠ΅ Π±ΡΠΎΡ Π½Π° ΠΏΠΎΡΡΠ°. ΠΠΈΠ΄Π΅ΡΡΠΈ Π³ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π²ΠΌΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΎΡ, ΠΏΡΠΈ ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ Π½Π° ΠΎΠ΄ΡΠ΅Π΄Π΅Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°, ΠΌΠΎΠΆΠ΅Π±ΠΈ Π½Π΅ΠΌΠ° Π΄Π° Π½Π°Π²Π΅Π΄Π΅ΠΌΠ΅ Π΄ΡΡΠ³Π° ΠΏΠΎΡΡΠ°. ΠΠ΅ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½Π°ΡΠ° Π²ΡΠ΅Π΄Π½ΠΎΡΡ.
ΠΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΡ, ΠΏΡΠΎΠ³Π»Π°ΡΡΠ²Π°ΠΌΠ΅ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡ ΠΎΠ΄ ΡΡΠ»ΡΠ³Π°ΡΠ° Π΅Ρ ΠΎ:
trait EchoClientConfig[A] {
def testMessage: String = "test"
def pollInterval: FiniteDuration
def echoServiceDependency: HttpSimpleGetEndPoint[_, EchoProtocol[A]]
}
ΠΠ°Π²ΠΈΡΠ½ΠΎΡΡΠ° Π΅ ΠΎΠ΄ ΠΈΡΡ ΡΠΈΠΏ ΠΊΠ°ΠΊΠΎ ΠΈ ΠΈΠ·Π²Π΅Π·Π΅Π½Π°ΡΠ° ΡΡΠ»ΡΠ³Π° echoService
. ΠΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ, Π²ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΡ echo Π³ΠΎ Π±Π°ΡΠ°ΠΌΠ΅ ΠΈΡΡΠΈΠΎΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ». ΠΠ°ΡΠΎΠ°, ΠΏΡΠΈ ΠΏΠΎΠ²ΡΠ·ΡΠ²Π°ΡΠ΅ Π½Π° Π΄Π²Π΅ ΡΡΠ»ΡΠ³ΠΈ, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ΠΌΠ΅ ΡΠΈΠ³ΡΡΠ½ΠΈ Π΄Π΅ΠΊΠ° ΡΓ¨ ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ.
ΠΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π½Π° ΡΡΠ»ΡΠ³ΠΈ
ΠΠΎΡΡΠ΅Π±Π½Π° Π΅ ΡΡΠ½ΠΊΡΠΈΡΠ° Π·Π° Π·Π°ΠΏΠΎΡΠ½ΡΠ²Π°ΡΠ΅ ΠΈ Π·Π°ΠΏΠΈΡΠ°ΡΠ΅ Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ°. (Π‘ΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠ° Π΄Π° ΡΠ΅ Π·Π°ΠΏΡΠ΅ ΡΡΠ»ΡΠ³Π°ΡΠ° Π΅ ΠΊΡΠΈΡΠΈΡΠ½Π° Π·Π° ΡΠ΅ΡΡΠΈΡΠ°ΡΠ΅.) ΠΠΎΠ²ΡΠΎΡΠ½ΠΎ, ΠΏΠΎΡΡΠΎΡΠ°Ρ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΎΠΏΡΠΈΠΈ Π·Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π½Π° ΡΠ°ΠΊΠ²Π° ΡΡΠ½ΠΊΡΠΈΡΠ° (Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, Π±ΠΈ ΠΌΠΎΠΆΠ΅Π»Π΅ Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ ΠΊΠ»Π°ΡΠΈ Π½Π° ΡΠΈΠΏΠΎΠ²ΠΈ Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΡΠΈΠΏΠΎΡ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°). ΠΠ° ΡΠ΅Π»ΠΈΡΠ΅ Π½Π° ΠΎΠ²Π°Π° ΠΎΠ±ΡΠ°Π²Π° ΡΠ΅ Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΎΡ Π·Π° ΡΠΎΡΡΠ°. ΠΠ΅ ΡΠ° ΠΏΡΠ΅ΡΡΡΠ°Π²ΡΠ²Π°ΠΌΠ΅ ΡΡΠ»ΡΠ³Π°ΡΠ° ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΠΊΠ»Π°ΡΠ° 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](()))
}
(Π¦ΠΌ.
ΠΈ
ΠΠ°Π·ΠΎΠ» Π΅ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ°ΡΡΡΠ²Π° Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΡΡΠ»ΡΠ³ΠΈ (ΠΏΠΎΠΊΡΠ΅Π½ΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΡΠΈΠ½ΡΠΈΡ Π½Π° ΡΠ΅ΡΡΡΡΠΈ Π΅ ΠΎΠ±Π΅Π·Π±Π΅Π΄Π΅Π½ΠΎ ΡΠΎ ΠΌΠΎΠ΄Π΅Π»ΠΎΡ Π½Π° ΡΠΎΡΡΠ°):
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]]
}
ΠΠΎΡΡΠΎΡΠ°Ρ Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π½Π°ΡΠΈΠ½ΠΈ Π·Π° ΡΠΏΡΠΎΠ²Π΅Π΄ΡΠ²Π°ΡΠ΅ Π½Π° ΠΎΠ²Π°Π° ΡΡΠ½ΠΊΡΠΈΡΠ°:
- ΠΠΊΠΎ Π°Π΄ΡΠ΅ΡΠΈΡΠ΅ Π½ΠΈ ΡΡΠ°Π½Π°Ρ ΠΏΠΎΠ·Π½Π°ΡΠΈ ΠΏΡΠ΅Π΄ ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅ΡΠΎ, ΡΠΎΠ³Π°Ρ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°ΠΌΠ΅ Scala ΠΊΠΎΠ΄ ΡΠΎ
Π°Π΄ΡΠ΅ΡΠΈ ΠΈ ΠΏΠΎΡΠΎΠ° ΠΈΠ·Π²ΡΡΠ΅ΡΠ΅ ΡΠ° ΠΈΠ·Π³ΡΠ°Π΄Π±Π°ΡΠ°. ΠΠ²Π° ΡΠ΅ ΠΊΠΎΠΌΠΏΠ°ΡΠ»ΠΈΡΠ° ΠΈ ΡΠ΅ ΠΈΠ·Π²ΡΡΠΈ ΡΠ΅ΡΡΠΎΠ²ΠΈ.
ΠΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ, ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° ΡΠ΅ Π±ΠΈΠ΄Π΅ ΠΏΠΎΠ·Π½Π°ΡΠ° ΡΡΠ°ΡΠΈΡΠΊΠΈ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ ΠΏΡΠ΅ΡΡΡΠ°Π²Π΅Π½Π° Π²ΠΎ ΠΊΠΎΠ΄ ΠΊΠ°ΠΊΠΎ ΠΌΠ°ΠΏΠΈΡΠ°ΡΠ΅Map[NodeId, NodeAddress]
. - ΠΠΎ Π½Π΅ΠΊΠΎΠΈ ΡΠ»ΡΡΠ°ΠΈ, Π²ΠΈΡΡΠΈΠ½ΡΠΊΠ°ΡΠ° Π°Π΄ΡΠ΅ΡΠ° Π΅ ΠΏΠΎΠ·Π½Π°ΡΠ° ΡΠ°ΠΌΠΎ ΠΎΡΠΊΠ°ΠΊΠΎ ΡΠ΅ Π·Π°ΠΏΠΎΡΠ½Π΅ ΡΠ°Π·ΠΎΠ»ΠΎΡ.
ΠΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°ΠΌΠ΅ βΡΡΠ»ΡΠ³Π° Π·Π° ΠΎΡΠΊΡΠΈΠ²Π°ΡΠ΅β ΠΊΠΎΡΠ° ΡΠ°Π±ΠΎΡΠΈ ΠΏΡΠ΅Π΄ Π΄ΡΡΠ³ΠΈΡΠ΅ ΡΠ°Π·Π»ΠΈ ΠΈ ΡΠΈΡΠ΅ ΡΠ°Π·Π»ΠΈ ΡΠ΅ ΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π°Ρ ΡΠΎ ΠΎΠ²Π°Π° ΡΡΠ»ΡΠ³Π° ΠΈ ΡΠ΅ ΠΏΠΎΠ±Π°ΡΠ°Π°Ρ Π°Π΄ΡΠ΅ΡΠΈ Π½Π° Π΄ΡΡΠ³ΠΈ ΡΠ°Π·Π»ΠΈ. - ΠΠΊΠΎ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌΠ΅
/etc/hosts
, ΡΠΎΠ³Π°Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ ΠΏΡΠ΅ΡΡ ΠΎΠ΄Π½ΠΎ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ ΠΈΠΌΠΈΡΠ° Π½Π° Π΄ΠΎΠΌΠ°ΡΠΈΠ½ΠΈ (ΠΊΠ°ΠΊΠΎmy-project-main-node
ΠΈecho-backend
) ΠΈ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ ΠΏΠΎΠ²ΡΠ·Π΅ΡΠ΅ Π³ΠΈ ΠΎΠ²ΠΈΠ΅ ΠΈΠΌΠΈΡΠ°
ΡΠΎ IP Π°Π΄ΡΠ΅ΡΠΈ Π·Π° Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅ΡΠΎ.
ΠΠΎ ΠΎΠ²ΠΎΡ ΠΏΠΎΡΡ Π½Π΅ΠΌΠ° Π΄Π° Π³ΠΈ ΡΠ°Π·Π³Π»Π΅Π΄ΡΠ²Π°ΠΌΠ΅ ΠΎΠ²ΠΈΠ΅ ΡΠ»ΡΡΠ°ΠΈ ΠΏΠΎΠ΄Π΅ΡΠ°Π»Π½ΠΎ. ΠΠ° Π½Π°ΡΠΈΡΠ΅
Π²ΠΎ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΠΈΠ³ΡΠ°ΡΠΊΠΈ, ΡΠΈΡΠ΅ ΡΠ°Π·Π»ΠΈ ΡΠ΅ ΠΈΠΌΠ°Π°Ρ ΠΈΡΡΠ° IP Π°Π΄ΡΠ΅ΡΠ° - 127.0.0.1
.
Π‘Π»Π΅Π΄Π½ΠΎ, ΡΠ°Π·Π³Π»Π΅Π΄ΡΠ²Π°ΠΌΠ΅ Π΄Π²Π΅ ΠΎΠΏΡΠΈΠΈ Π·Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½ ΡΠΈΡΡΠ΅ΠΌ:
- ΠΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ Π½Π° ΡΠΈΡΠ΅ ΡΡΠ»ΡΠ³ΠΈ Π½Π° Π΅Π΄Π΅Π½ ΡΠ°Π·ΠΎΠ».
- Π Ρ ΠΎΡΡΠΈΡΠ°ΡΠ΅ Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ° Π΅Ρ ΠΎ ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΡ Π·Π° Π΅Ρ ΠΎ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠ°Π·Π»ΠΈ.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° Π·Π°
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° Π½Π° Π΅Π΄Π΅Π½ ΡΠ°Π·ΠΎΠ»
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"
}
ΠΠ°ΠΆΠ½ΠΎ! ΠΠ°Π±Π΅Π»Π΅ΠΆΠ΅ΡΠ΅ ΠΊΠ°ΠΊΠΎ ΡΡΠ»ΡΠ³ΠΈΡΠ΅ ΡΠ΅ ΠΏΠΎΠ²ΡΠ·Π°Π½ΠΈ. ΠΠ°Π·Π½Π°ΡΡΠ²Π°ΠΌΠ΅ ΡΡΠ»ΡΠ³Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π½Π° ΠΎΠ΄ Π΅Π΄Π΅Π½ ΡΠ°Π·ΠΎΠ» ΠΊΠ°ΠΊΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π½Π° ΠΌΠ΅ΡΠΎΠ΄ΠΎΡ Π½Π° Π·Π°Π²ΠΈΡΠ½ΠΎΡΡ Π½Π° Π΄ΡΡΠ³ ΡΠ°Π·ΠΎΠ». Π’ΠΈΠΏΠΎΡ Π½Π° Π·Π°Π²ΠΈΡΠ½ΠΎΡΡ Π³ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° ΠΊΠΎΠΌΠΏΠ°ΡΠ»Π΅ΡΠΎΡ, Π±ΠΈΠ΄Π΅ΡΡΠΈ Π³ΠΎ ΡΠΎΠ΄ΡΠΆΠΈ ΡΠΈΠΏΠΎΡ Π½Π° ΠΏΡΠΎΡΠΎΠΊΠΎΠ». ΠΠΎΠ³Π° ΡΠ΅ ΡΠ΅ ΠΈΠ·Π²ΡΡΠΈ, Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠ° ΡΠ΅ Π³ΠΎ ΡΠΎΠ΄ΡΠΆΠΈ ΡΠΎΡΠ½ΠΈΠΎΡ ID Π½Π° ΡΠ΅Π»Π½ΠΈΠΎΡ ΡΠ°Π·ΠΎΠ». ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΎΠ²Π°Π° ΡΠ΅ΠΌΠ°, ΡΠΎΡΠ½ΠΎ Π΅Π΄Π½Π°Ρ Π³ΠΎ ΠΎΠ΄ΡΠ΅Π΄ΡΠ²Π°ΠΌΠ΅ Π±ΡΠΎΡΠΎΡ Π½Π° ΠΏΡΠΈΡΡΠ°Π½ΠΈΡΡΠ΅ΡΠΎ ΠΈ ΡΠ΅ΠΊΠΎΠ³Π°Ρ Π³Π°ΡΠ°Π½ΡΠΈΡΠ°ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΡΠ΅ ΡΠ΅ ΠΎΠ΄Π½Π΅ΡΡΠ²Π° Π½Π° ΠΏΡΠ°Π²ΠΈΠ»Π½Π°ΡΠ° ΠΏΠΎΡΡΠ°.
ΠΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π½Π° Π΄Π²Π° ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΡΠ°Π·Π»ΠΈ
ΠΠ° ΠΎΠ²Π°Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°, Π³ΠΈ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ ΠΈΡΡΠΈΡΠ΅ ΡΠ΅ΡΠ²ΠΈΡΠ½ΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π±Π΅Π· ΠΏΡΠΎΠΌΠ΅Π½ΠΈ. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π°ΡΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° Π΅ Π²ΠΎ ΡΠΎΠ° ΡΡΠΎ ΡΠ΅Π³Π° ΠΈΠΌΠ°ΠΌΠ΅ Π΄Π²Π° ΠΎΠ±ΡΠ΅ΠΊΡΠΈ ΠΊΠΎΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π°Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π³ΡΡΠΏΠΈ Π½Π° ΡΡΠ»ΡΠ³ΠΈ:
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). Π‘Π΅ ΡΠΈΠ½ΠΈ Π΄Π΅ΠΊΠ° ΠΈΠΌΠ° ΡΠΌΠΈΡΠ»Π° Π΄Π° ΡΠ΅ ΡΡΠ°Π²ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π²ΠΎ ΠΏΠΎΡΠ΅Π±Π΅Π½ Π°ΡΡΠ΅ΡΠ°ΠΊΡ. Π’ΠΎΠ° Π΅ Π·Π°ΡΠΎΠ° ΡΡΠΎ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΠΈΡΡΠΈΠΎΡ ΠΊΠΎΠ΄. ΠΠΎΠ²ΡΠΎΡΠ½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π°Ρ Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΈ ΡΡΠΎ ΠΎΠ΄Π³ΠΎΠ²Π°ΡΠ°Π°Ρ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠΊΠΈ Π³ΡΠ°Π½ΠΊΠΈ. ΠΠ°Π²ΠΈΡΠ½ΠΎΡΡΠΈΡΠ΅ ΠΎΠ΄ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΈ Π²Π΅ΡΠ·ΠΈΠΈ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈΡΠ΅ ΡΠ΅ Π·Π°ΡΡΠ²ΡΠ²Π°Π°Ρ Π·Π°Π΅Π΄Π½ΠΎ ΡΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ°, ΠΈ ΠΎΠ²ΠΈΠ΅ Π²Π΅ΡΠ·ΠΈΠΈ ΡΠ΅ Π·Π°ΡΡΠ²ΡΠ²Π°Π°Ρ Π·Π°ΡΠ΅ΠΊΠΎΠ³Π°Ρ ΡΠ΅ΠΊΠΎΠ³Π°Ρ ΠΊΠΎΠ³Π° ΡΠ΅ ΠΎΠ΄Π»ΡΡΠΈΠΌΠ΅ Π΄Π° ΡΠ° ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΠΈΠΌΠ΅ ΡΠ°Π° Π²Π΅ΡΠ·ΠΈΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ°.
Π‘Π΅ΠΊΠΎΡΠ° ΠΏΡΠΎΠΌΠ΅Π½Π° Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° ΡΠ΅ ΠΏΡΠ΅ΡΠ²ΠΎΡΠ° Π²ΠΎ ΠΏΡΠΎΠΌΠ΅Π½Π° Π½Π° ΠΊΠΎΠ΄ΠΎΡ. Π Π·Π°ΡΠΎΠ°, ΡΠ΅ΠΊΠΎΡ
ΠΏΡΠΎΠΌΠ΅Π½Π°ΡΠ° ΡΠ΅ Π±ΠΈΠ΄Π΅ ΠΏΠΎΠΊΡΠΈΠ΅Π½Π° ΡΠΎ Π½ΠΎΡΠΌΠ°Π»Π½ΠΈΠΎΡ ΠΏΡΠΎΡΠ΅Ρ Π·Π° ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π°ΡΠ΅ ΠΊΠ²Π°Π»ΠΈΡΠ΅Ρ:
ΠΠΈΠ»Π΅Ρ Π²ΠΎ ΡΡΠ°ΠΊΠ΅ΡΠΎΡ Π·Π° Π±ΡΠ±Π°ΡΠΊΠΈ -> ΠΠ -> ΠΏΡΠ΅Π³Π»Π΅Π΄ -> ΡΠΏΠΎΡΡΠ²Π°ΡΠ΅ ΡΠΎ ΡΠΎΠΎΠ΄Π²Π΅ΡΠ½ΠΈΡΠ΅ Π³ΡΠ°Π½ΠΊΠΈ ->
ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΠ° -> ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅
ΠΠ»Π°Π²Π½ΠΈΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΈΡΠΈ ΠΎΠ΄ ΡΠΏΡΠΎΠ²Π΅Π΄ΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠ°ΡΠ»ΠΈΡΠ°Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° ΡΠ΅:
-
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° ΡΠ΅ Π±ΠΈΠ΄Π΅ ΠΊΠΎΠ½Π·ΠΈΡΡΠ΅Π½ΡΠ½Π° Π½ΠΈΠ· ΡΠΈΡΠ΅ ΡΠ°Π·Π»ΠΈ Π½Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½ΠΈΠΎΡ ΡΠΈΡΡΠ΅ΠΌ. ΠΠΎΡΠ°Π΄ΠΈ ΡΠ°ΠΊΡΠΎΡ ΡΡΠΎ ΡΠΈΡΠ΅ ΡΠ°Π·Π»ΠΈ Π΄ΠΎΠ±ΠΈΠ²Π°Π°Ρ ΠΈΡΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° ΠΎΠ΄ Π΅Π΄Π΅Π½ ΠΈΠ·Π²ΠΎΡ.
-
ΠΡΠΎΠ±Π»Π΅ΠΌΠ°ΡΠΈΡΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΡΠΌΠ΅Π½ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° ΡΠ°ΠΌΠΎ Π²ΠΎ Π΅Π΄Π΅Π½ ΠΎΠ΄ ΡΠ°Π·Π»ΠΈΡΠ΅. ΠΠ°ΡΠΎΠ°, βΠΏΠΎΠ΄Π½Π΅ΡΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ°β Π΅ ΠΌΠ°Π»ΠΊΡ Π²Π΅ΡΠΎΡΠ°ΡΠ½ΠΎ.
-
Π‘ΡΠ°Π½ΡΠ²Π° ΠΏΠΎΡΠ΅ΡΠΊΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠ°Π²Π°Ρ ΠΌΠ°Π»ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π²ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ°.
-
ΠΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π²ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° ΡΠ΅ ΡΠ΅ ΡΠ»ΡΡΠ°Ρ ΠΊΠ°ΠΊΠΎ Π΄Π΅Π» ΠΎΠ΄ ΡΠ΅Π»ΠΎΠΊΡΠΏΠ½ΠΈΠΎΡ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π·Π²ΠΎΡ ΠΈ ΡΠ΅ Π±ΠΈΠ΄Π°Ρ ΠΏΡΠ΅Π΄ΠΌΠ΅Ρ Π½Π° ΠΏΡΠ΅Π³Π»Π΅Π΄.
ΠΠ°Π»ΠΈ ΠΌΠΈ ΡΡΠ΅Π±Π° ΠΏΠΎΡΠ΅Π±Π½ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°? ΠΠ²Π°Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠΎΠ΄ΡΠΆΠΈ Π»ΠΎΠ·ΠΈΠ½ΠΊΠΈ ΠΈ Π΄ΡΡΠ³ΠΈ ΡΡΠ²ΡΡΠ²ΠΈΡΠ΅Π»Π½ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π΄ΠΎ ΠΊΠΎΠΈ Π±ΠΈ ΡΠ°ΠΊΠ°Π»Π΅ Π΄Π° Π³ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠΌΠ΅ ΠΏΡΠΈΡΡΠ°ΠΏΠΎΡ. ΠΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΠΎΠ²Π°, ΡΠ΅ ΡΠΈΠ½ΠΈ Π΄Π΅ΠΊΠ° ΠΈΠΌΠ° ΡΠΌΠΈΡΠ»Π° Π΄Π° ΡΠ΅ ΡΠΊΠ»Π°Π΄ΠΈΡΠ° ΠΊΠΎΠ½Π΅ΡΠ½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° Π²ΠΎ ΠΏΠΎΡΠ΅Π±Π½ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ° ΠΏΠΎΠ΄Π΅Π»ΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° Π΄Π²Π° Π΄Π΅Π»Π° - Π΅Π΄Π΅Π½ ΡΡΠΎ ΡΠΎΠ΄ΡΠΆΠΈ ΡΠ°Π²Π½ΠΎ Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΈ ΠΏΠΎΡΡΠ°Π²ΠΊΠΈ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° ΠΈ Π΅Π΄Π΅Π½ ΡΡΠΎ ΡΠΎΠ΄ΡΠΆΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈ ΠΏΠΎΡΡΠ°Π²ΠΊΠΈ. ΠΠ²Π° ΡΠ΅ ΠΈΠΌ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈ Π½Π° ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΈ Π΄Π° ΠΈΠΌΠ°Π°Ρ ΠΏΡΠΈΡΡΠ°ΠΏ Π΄ΠΎ Π·Π°Π΅Π΄Π½ΠΈΡΠΊΠΈΡΠ΅ ΠΏΠΎΡΡΠ°Π²ΠΊΠΈ. ΠΠ²Π° ΡΠ°Π·Π΄Π²ΠΎΡΡΠ²Π°ΡΠ΅ Π΅ Π»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π½Π΅ ΡΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΡΡΠ΅Π΄Π½ΠΈ ΠΎΡΠΎΠ±ΠΈΠ½ΠΈ ΠΊΠΎΠΈ ΡΠΎΠ΄ΡΠΆΠ°Ρ ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΈ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ.
ΠΠΎΠΆΠ½ΠΈ Π²Π°ΡΠΈΡΠ°ΡΠΈΠΈ
ΠΡΠ΄Π΅ Π΄Π° ΡΠ΅ ΠΎΠ±ΠΈΠ΄Π΅ΠΌΠ΅ Π΄Π° ΡΠ° ΡΠΏΠΎΡΠ΅Π΄ΠΈΠΌΠ΅ ΠΊΠΎΠΌΠΏΠ°ΡΠ»ΠΈΡΠ°Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° ΡΠΎ Π½Π΅ΠΊΠΎΠΈ Π²ΠΎΠΎΠ±ΠΈΡΠ°Π΅Π½ΠΈ Π°Π»ΡΠ΅ΡΠ½Π°ΡΠΈΠ²ΠΈ:
- Π’Π΅ΠΊΡΡΡΠ°Π»Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° Π½Π° ΡΠ΅Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π°.
- Π¦Π΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π° ΠΏΡΠΎΠ΄Π°Π²Π½ΠΈΡΠ° ΡΠΎ Π²ΡΠ΅Π΄Π½ΠΎΡΡ Π½Π° ΠΊΠ»ΡΡΠΎΡ (
etcd
/zookeeper
). - ΠΡΠΎΡΠ΅Ρ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ ΠΊΠΎΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ΅ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π°Ρ/ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Π°Ρ Π±Π΅Π· ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡ.
- ΠΠ°ΡΡΠ²ΡΠ²Π°ΡΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π°Π΄Π²ΠΎΡ ΠΎΠ΄ ΠΊΠΎΠ½ΡΡΠΎΠ»Π°ΡΠ° Π½Π° Π°ΡΡΠ΅ΡΠ°ΠΊΡ ΠΈ Π²Π΅ΡΠ·ΠΈΡΠ°.
Π’Π΅ΠΊΡΡΡΠ°Π»Π½ΠΈΡΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π°Π°Ρ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½Π° ΡΠ»Π΅ΠΊΡΠΈΠ±ΠΈΠ»Π½ΠΎΡΡ Π²ΠΎ ΠΎΠ΄Π½ΠΎΡ Π½Π° ΠΌΠ°Π»ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ. ΠΠ΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠΎΡ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΎΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΡΠ°Π²ΠΈ Π²ΠΎ ΠΎΠ΄Π΄Π°Π»Π΅ΡΠ΅Π½ΠΈΠΎΡ ΡΠ°Π·ΠΎΠ», Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π²ΠΎ ΡΠΎΠΎΠ΄Π²Π΅ΡΠ½ΠΈΡΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ ΠΈ Π΄Π° ΡΠ° ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ° ΡΡΠ»ΡΠ³Π°ΡΠ°. ΠΠ΅ΡΡΡΠΎΠ°, Π·Π° Π³ΠΎΠ»Π΅ΠΌΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ, ΡΠ°ΠΊΠ²Π°ΡΠ° ΡΠ»Π΅ΠΊΡΠΈΠ±ΠΈΠ»Π½ΠΎΡΡ ΠΌΠΎΠΆΠ΅Π±ΠΈ Π½Π΅ Π΅ ΠΏΠΎΠΆΠ΅Π»Π½Π°. ΠΠ°ΠΏΡΠ°Π²Π΅Π½ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π½Π΅ ΠΎΡΡΠ°Π²Π°Π°Ρ ΡΡΠ°Π³ΠΈ Π²ΠΎ Π΄ΡΡΠ³ΠΈΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠΈ. ΠΠΈΠΊΠΎΡ Π½Π΅ Π³ΠΈ ΡΠ°Π·Π³Π»Π΅Π΄ΡΠ²Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅. Π’Π΅ΡΠΊΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΎΠ΄ΡΠ΅Π΄ΠΈ ΠΊΠΎΡ ΡΠΎΡΠ½ΠΎ Π³ΠΈ Π½Π°ΠΏΡΠ°Π²ΠΈΠ» ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΠΈ ΠΏΠΎΡΠ°Π΄ΠΈ ΠΊΠΎΡΠ° ΠΏΡΠΈΡΠΈΠ½Π°. ΠΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π½Π΅ ΡΠ΅ ΡΠ΅ΡΡΠΈΡΠ°Π°Ρ. ΠΠΊΠΎ ΡΠΈΡΡΠ΅ΠΌΠΎΡ Π΅ Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½, ΡΠΎΠ³Π°Ρ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠΎΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°Π±ΠΎΡΠ°Π²ΠΈ Π΄Π° ΡΠ° Π½Π°ΠΏΡΠ°Π²ΠΈ ΡΠΎΠΎΠ΄Π²Π΅ΡΠ½Π°ΡΠ° ΠΏΡΠΎΠΌΠ΅Π½Π° Π½Π° Π΄ΡΡΠ³ΠΈΡΠ΅ ΡΠ°Π·Π»ΠΈ.
(ΠΡΡΠΎ ΡΠ°ΠΊΠ°, ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ Π·Π°Π±Π΅Π»Π΅ΠΆΠΈ Π΄Π΅ΠΊΠ° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠ°ΡΠ»ΠΈΡΠ°Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° Π½Π΅ ΡΠ° Π·Π°ΡΠ²ΠΎΡΠ° ΠΌΠΎΠΆΠ½ΠΎΡΡΠ° Π·Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ ΡΠ΅ΠΊΡΡΡΠ°Π»Π½ΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ Π²ΠΎ ΠΈΠ΄Π½ΠΈΠ½Π°. ΠΠ΅ Π±ΠΈΠ΄Π΅ Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅ΡΠ΅ ΠΏΠ°ΡΡΠ΅Ρ ΠΈ Π²Π°Π»ΠΈΠ΄Π°ΡΠΎΡ ΡΡΠΎ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄ΡΠ²Π° ΠΈΡΡ ΡΠΈΠΏ ΠΊΠ°ΠΊΠΎ ΠΈΠ·Π»Π΅Π·ΠΎΡ Config
, ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ ΡΠ΅ΠΊΡΡΡΠ°Π»Π½ΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ. ΠΠ΅Π΄Π½Π°Ρ ΡΠ»Π΅Π΄ΠΈ Π΄Π΅ΠΊΠ° ΡΠ»ΠΎΠΆΠ΅Π½ΠΎΡΡΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΎΡ ΡΠΎ ΠΊΠΎΠΌΠΏΠ°ΡΠ»ΠΈΡΠ°Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° Π΅ Π½Π΅ΡΡΠΎ ΠΏΠΎΠΌΠ°Π»Π° ΠΎΠ΄ ΡΠ»ΠΎΠΆΠ΅Π½ΠΎΡΡΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΎΡ ΡΡΠΎ ΠΊΠΎΡΠΈΡΡΠΈ ΡΠ΅ΠΊΡΡΡΠ°Π»Π½ΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ, Π±ΠΈΠ΄Π΅ΡΡΠΈ ΡΠ΅ΠΊΡΡΡΠ°Π»Π½ΠΈΡΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ Π±Π°ΡΠ°Π°Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π΅Π½ ΠΊΠΎΠ΄.)
Π¦Π΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π° ΠΏΡΠΎΠ΄Π°Π²Π½ΠΈΡΠ° Π·Π° ΠΊΠ»ΡΡΠ΅Π²ΠΈ ΡΠΎ Π²ΡΠ΅Π΄Π½ΠΎΡΡ Π΅ Π΄ΠΎΠ±Π°Ρ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·Π°ΠΌ Π·Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΡΠ° Π½Π° ΠΌΠ΅ΡΠ° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π½Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°. Π’ΡΠ΅Π±Π° Π΄Π° ΠΎΠ΄Π»ΡΡΠΈΠΌΠ΅ ΡΡΠΎ ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠΊΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, Π° ΡΡΠΎ ΡΠ΅ ΡΠ°ΠΌΠΎ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. ΠΠ° ΠΈΠΌΠ°ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΡΠ° C => A => B
, ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ C
ΡΠ΅ΡΠΊΠΎ ΡΠ΅ ΠΌΠ΅Π½ΡΠ²Π°, Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ A
- ΡΠ΅ΡΡΠΎ. ΠΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΎ ΠΊΠ°ΠΆΠ΅ΠΌΠ΅ ΡΠΎΠ° C
- ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°, ΠΈ A
- ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. Π‘Π΅ ΡΠΈΠ½ΠΈ Π΄Π΅ΠΊΠ° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° ΡΠ΅ ΡΠ°Π·Π»ΠΈΠΊΡΠ²Π°Π°Ρ ΠΎΠ΄ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ ΠΏΠΎ ΡΠΎΠ° ΡΡΠΎ ΡΠΈΠ΅ ΠΎΠ±ΠΈΡΠ½ΠΎ ΡΠ΅ ΠΌΠ΅Π½ΡΠ²Π°Π°Ρ ΠΏΠΎΡΠ΅ΡΠΊΠΎ ΠΎΠ΄ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅. ΠΡΡΠΎ ΡΠ°ΠΊΠ°, ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ ΠΎΠ±ΠΈΡΠ½ΠΎ Π΄ΠΎΠ°ΡΠ°Π°Ρ ΠΎΠ΄ Π΅Π΄Π΅Π½ ΠΈΠ·Π²ΠΎΡ (ΠΎΠ΄ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ), Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° ΠΎΠ΄ Π΄ΡΡΠ³ (ΠΎΠ΄ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈΠΎΡ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡ).
ΠΠΊΠΎ ΡΠ΅ΡΠΊΠΎ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ Π°ΠΆΡΡΠΈΡΠ°Π°Ρ Π±Π΅Π· ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°, ΡΠΎΠ³Π°Ρ ΡΠΎΠ° ΡΠ΅ΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ ΠΊΠΎΠΌΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°, Π±ΠΈΠ΄Π΅ΡΡΠΈ ΡΠ΅ ΡΡΠ΅Π±Π° Π½Π΅ΠΊΠ°ΠΊΠΎ Π΄Π° ΠΈΡΠΏΠΎΡΠ°ΡΠ°ΠΌΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, Π΄Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΠΌΠ΅, Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΌΠ΅ ΠΈ Π΄Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠ²Π°ΠΌΠ΅ Π½Π΅ΡΠΎΡΠ½ΠΈ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ. ΠΠ°ΡΠΎΠ°, ΠΎΠ΄ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° Π½Π°ΠΌΠ°Π»ΡΠ²Π°ΡΠ΅ Π½Π° ΡΠ»ΠΎΠΆΠ΅Π½ΠΎΡΡΠ° Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°, ΠΈΠΌΠ° ΡΠΌΠΈΡΠ»Π° Π΄Π° ΡΠ΅ Π½Π°ΠΌΠ°Π»ΠΈ Π±ΡΠΎΡΠΎΡ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΊΠΎΠΈ ΠΌΠΎΠΆΠ°Ρ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π°Ρ Π·Π° Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° (ΠΈΠ»ΠΈ Π²ΠΎΠΎΠΏΡΡΠΎ Π΄Π° Π½Π΅ ΠΏΠΎΠ΄Π΄ΡΠΆΡΠ²Π°Π°Ρ ΡΠ°ΠΊΠ²ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ).
ΠΠ° ΡΠ΅Π»ΠΈΡΠ΅ Π½Π° ΠΎΠ²ΠΎΡ ΠΏΠΎΡΡ, ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌΠ΅ ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΏΠΎΠΌΠ΅ΡΡ ΡΡΠ°ΡΠΈΡΠΊΠΈ ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠΊΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ. ΠΠΊΠΎ Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ° Π±Π°ΡΠ° ΠΌΠ΅Π½ΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π·Π° Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°, ΡΠΎΠ³Π°Ρ ΡΠ°ΠΊΠ²ΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΡΠ΅ Π³ΠΈ Π½Π°ΡΠ΅ΡΠ΅ΠΌΠ΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΈ. ΠΠΎ ΡΠΏΡΠΎΡΠΈΠ²Π½ΠΎ, ΠΎΠΏΡΠΈΠΈΡΠ΅ ΡΠ΅ ΡΡΠ°ΡΠΈΡΠ½ΠΈ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π°Ρ ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° ΠΊΠΎΠΌΠΏΠ°ΡΠ»ΠΈΡΠ°Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°. ΠΠ° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½Π° ΡΠ΅ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°, ΠΌΠΎΠΆΠ΅Π±ΠΈ ΡΠ΅ Π½ΠΈ ΡΡΠ΅Π±Π° ΠΌΠ΅Ρ Π°Π½ΠΈΠ·Π°ΠΌ Π·Π° ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ Π½Π° Π΄Π΅Π»ΠΎΠ²ΠΈ ΠΎΠ΄ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° ΡΠΎ Π½ΠΎΠ²ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, ΡΠ»ΠΈΡΠ½ΠΎ Π½Π° ΡΠΎΠ° ΠΊΠ°ΠΊΠΎ ΡΠ΅ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Π°Ρ ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΈΠΎΡ ΡΠΈΡΡΠ΅ΠΌ. (Π‘ΠΏΠΎΡΠ΅Π΄ Π½Π°Ρ, ΠΏΡΠ΅ΠΏΠΎΡΠ°ΡΠ»ΠΈΠ²ΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΈΠ·Π±Π΅Π³Π½Π΅ ΡΠ΅ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° Π²ΠΎ ΡΠ΅Π°Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅, Π±ΠΈΠ΄Π΅ΡΡΠΈ ΡΠΎΠ° ΡΠ° Π·Π³ΠΎΠ»Π΅ΠΌΡΠ²Π° ΡΠ»ΠΎΠΆΠ΅Π½ΠΎΡΡΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΎΡ. ΠΠΊΠΎ Π΅ ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΠ΄ΠΎΠ±ΡΠΎ Π΅ Π΄Π° Π³ΠΈ ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΈΡΠ΅ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ Π½Π° ΠΠ‘ Π·Π° ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅.)
ΠΠ΄Π΅Π½ Π²Π°ΠΆΠ΅Π½ Π°ΡΠΏΠ΅ΠΊΡ Π½Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΡΡΠ°ΡΠΈΡΠΊΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° ΡΡΠΎ Π³ΠΈ ΡΠ΅ΡΠ° Π»ΡΡΠ΅ΡΠΎ Π΄Π° ΡΠ°Π·ΠΌΠΈΡΠ»ΡΠ²Π°Π°Ρ Π·Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠΊΠ° ΡΠ΅ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° Π΅ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ Π·Π° ΡΠΈΡΡΠ΅ΠΌΠΎΡ Π΄Π° ΡΠ΅ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ° ΠΏΠΎ Π°ΠΆΡΡΠΈΡΠ°ΡΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° (Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΏΡΠ΅ΠΊΠΈΠ½). ΠΡΡΡΠ½ΠΎΡΡ, Π°ΠΊΠΎ ΡΡΠ΅Π±Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π²ΠΎ ΡΡΠ°ΡΠΈΡΠΊΠ°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°, ΡΠ΅ ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΎ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠΈΡΡΠ΅ΠΌΠΎΡ Π·Π° Π΄Π° ΡΡΠ°ΠΏΠ°Ρ Π½Π° ΡΠΈΠ»Π° Π½ΠΎΠ²ΠΈΡΠ΅ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ. ΠΡΠΎΠ±Π»Π΅ΠΌΠΎΡ ΡΠΎ Π·Π°ΡΡΠΎΡΠΎΡ Π²Π°ΡΠΈΡΠ° ΠΏΠΎ ΡΠ΅ΡΠΈΠΎΠ·Π½ΠΎΡΡ Π·Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ. ΠΠΎ Π½Π΅ΠΊΠΎΠΈ ΡΠ»ΡΡΠ°ΠΈ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π·Π°ΠΊΠ°ΠΆΠ΅ΡΠ΅ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ Π²ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΊΠΎΠ³Π° ΠΎΠΏΡΠΎΠ²Π°ΡΡΠ²Π°ΡΠ΅ΡΠΎ Π΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΎ. ΠΠΊΠΎ ΡΡΠ΅Π±Π° Π΄Π° ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ½ΡΠΈΡΠ°Π½Π° ΡΡΠ»ΡΠ³Π°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°ΡΠ΅
Π‘Π΅Π³Π° Π΄Π° Π³ΠΎ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΡΠ°ΡΠ°ΡΠ΅ΡΠΎ Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π²Π½Π°ΡΡΠ΅ ΠΈΠ»ΠΈ Π½Π°Π΄Π²ΠΎΡ ΠΎΠ΄ Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΎΡ. ΠΠΊΠΎ ΡΠ° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π²ΠΎ Π°ΡΡΠ΅ΡΠ°ΠΊΡ, ΡΠΎΠ³Π°Ρ Π±Π°ΡΠ΅ΠΌ ΠΈΠΌΠ°Π²ΠΌΠ΅ ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΡΠ° ΠΏΠΎΡΠ²ΡΠ΄ΠΈΠΌΠ΅ ΠΈΡΠΏΡΠ°Π²Π½ΠΎΡΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π·Π° Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠΊΠ»ΠΎΠΏΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΎΡ. ΠΠΊΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π΅ Π½Π°Π΄Π²ΠΎΡ ΠΎΠ΄ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°Π½ΠΈΠΎΡ Π°ΡΡΠ΅ΡΠ°ΠΊΡ, ΡΠ΅ΡΠΊΠΎ Π΅ Π΄Π° ΡΠ΅ ΡΠ»Π΅Π΄ΠΈ ΠΊΠΎΡ Π½Π°ΠΏΡΠ°Π²ΠΈΠ» ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π²ΠΎ ΠΎΠ²Π°Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° ΠΈ Π·ΠΎΡΡΠΎ. ΠΠΎΠ»ΠΊΡ Π΅ Π²Π°ΠΆΠ½ΠΎ? Π‘ΠΏΠΎΡΠ΅Π΄ Π½Π°ΡΠ΅ ΠΌΠΈΡΠ»Π΅ΡΠ΅, Π·Π° ΠΌΠ½ΠΎΠ³Ρ ΡΠΈΡΡΠ΅ΠΌΠΈ Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΈΠΌΠ° ΡΡΠ°Π±ΠΈΠ»Π½Π° ΠΈ Π²ΠΈΡΠΎΠΊΠΎΠΊΠ²Π°Π»ΠΈΡΠ΅ΡΠ½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°.
ΠΠ΅ΡΠ·ΠΈΡΠ°ΡΠ° Π½Π° Π°ΡΡΠ΅ΡΠ°ΠΊΡ Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΠΎΠ΄ΡΠ΅Π΄ΠΈΡΠ΅ ΠΊΠΎΠ³Π° Π΅ ΡΠΎΠ·Π΄Π°Π΄Π΅Π½, ΠΊΠΎΠΈ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ Π³ΠΈ ΡΠΎΠ΄ΡΠΆΠΈ, ΠΊΠΎΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ΅ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ΠΈ/ΠΎΠ½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ΠΈ ΠΈ ΠΊΠΎΡ Π΅ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠ΅Π½ Π·Π° ΠΊΠ°ΠΊΠ²Π° Π±ΠΈΠ»ΠΎ ΠΏΡΠΎΠΌΠ΅Π½Π° Π²ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ°. Π‘Π΅ ΡΠ°Π·Π±ΠΈΡΠ°, ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π²ΠΎ Π°ΡΡΠ΅ΡΠ°ΠΊΡ Π±Π°ΡΠ° ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ Π½Π°ΠΏΠΎΡ, ΠΏΠ° Π·Π°ΡΠΎΠ° ΡΡΠ΅Π±Π° Π΄Π° Π΄ΠΎΠ½Π΅ΡΠ΅ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠΈΡΠ°Π½Π° ΠΎΠ΄Π»ΡΠΊΠ°.
ΠΠΎΠ±ΡΠΈΡΠ΅ ΠΈ Π»ΠΎΡΠΈΡΠ΅ ΡΡΡΠ°Π½ΠΈ
ΠΠΈ ΡΠ°ΠΊΠ°Π» Π΄Π° ΡΠ΅ Π·Π°Π΄ΡΠΆΠ°ΠΌ Π½Π° Π΄ΠΎΠ±ΡΠΈΡΠ΅ ΠΈ Π»ΠΎΡΠΈΡΠ΅ ΡΡΡΠ°Π½ΠΈ Π½Π° ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½Π°ΡΠ° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠ°.
ΠΡΠ΅Π΄Π½ΠΎΡΡΠΈ
ΠΠΎΠ΄ΠΎΠ»Ρ Π΅ Π»ΠΈΡΡΠ° Π½Π° Π³Π»Π°Π²Π½ΠΈΡΠ΅ ΠΊΠ°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ Π½Π° ΠΊΠΎΠΌΠΏΠ°ΡΠ»ΠΈΡΠ°Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° Π½Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½ ΡΠΈΡΡΠ΅ΠΌ:
- ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΡΠ°ΡΠΈΡΠΊΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°. ΠΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° Π±ΠΈΠ΄Π΅ΡΠ΅ ΡΠΈΠ³ΡΡΠ½ΠΈ Π²ΠΎ ΡΠΎΠ°
ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π΅ ΡΠΎΡΠ½Π°. - ΠΠΎΠ³Π°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠΊΠΈ ΡΠ°Π·ΠΈΠΊ. ΠΠΎΠΎΠ±ΠΈΡΠ°Π΅Π½ΠΎ, Π΄ΡΡΠ³ΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° ΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈ Π½Π°ΡΠΌΠ½ΠΎΠ³Ρ Π½Π° Π·Π°ΠΌΠ΅Π½Π° Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° Π½ΠΈΠ·Π°. ΠΠΎΠ³Π° ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ Scala, Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΈ ΡΠ΅ ΡΠΈΡΠΎΠΊ ΡΠΏΠ΅ΠΊΡΠ°Ρ Π½Π° ΡΠ°Π·ΠΈΡΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°ΡΠ΅ Π½Π° Π²Π°ΡΠ°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°. ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅
ΠΎΡΠΎΠ±ΠΈΠ½ΠΈ Π·Π° ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΈΡΠ΅ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ, ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠΈ Π·Π° Π³ΡΡΠΏΠΈΡΠ°ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΠ²ΠΈΠΊΠ°ΠΌΠ΅ Π½Π° vals Π΄Π΅ΠΊΠ»Π°ΡΠΈΡΠ°Π½ΠΈ ΡΠ°ΠΌΠΎ Π΅Π΄Π½Π°Ρ (DRY) Π²ΠΎ ΠΎΠ³ΡΠ°Π΄Π΅Π½ΠΈΠΎΡ ΠΎΠΏΡΠ΅Π³. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠ°ΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΈ Π±ΠΈΠ»ΠΎ ΠΊΠ»Π°ΡΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π²ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° (Seq
,Map
, ΠΏΡΠΈΠ»Π°Π³ΠΎΠ΄Π΅Π½ΠΈ ΡΠ°ΡΠΎΠ²ΠΈ). - DSL. Scala ΠΈΠΌΠ° Π³ΠΎΠ»Π΅ΠΌ Π±ΡΠΎΡ ΡΠ°Π·ΠΈΡΠ½ΠΈ ΠΊΠ°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ ΠΊΠΎΠΈ Π³ΠΎ ΠΎΠ»Π΅ΡΠ½ΡΠ²Π°Π°Ρ ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ΡΠΎ Π½Π° DSL. ΠΠΎΠΆΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΈΡΠΊΠΎΡΠΈΡΡΠ°Ρ ΠΏΡΠ΅Π΄Π½ΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΎΠ²ΠΈΠ΅ ΠΊΠ°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ ΠΈ Π΄Π° ΡΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠΊΠΈ ΡΠ°Π·ΠΈΠΊ ΠΊΠΎΡ Π΅ ΠΏΠΎΠΏΠΎΠ³ΠΎΠ΄Π΅Π½ Π·Π° ΡΠ΅Π»Π½Π°ΡΠ° Π³ΡΡΠΏΠ° ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΈ, ΡΠ°ΠΊΠ° ΡΡΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π΅ Π±Π°ΡΠ΅ΠΌ ΡΠΈΡΠ»ΠΈΠ²Π° ΠΎΠ΄ Π΅ΠΊΡΠΏΠ΅ΡΡΠΈΡΠ΅ Π½Π° Π΄ΠΎΠΌΠ΅Π½ΠΎΡ. Π‘ΠΏΠ΅ΡΠΈΡΠ°Π»ΠΈΡΡΠΈΡΠ΅ ΠΌΠΎΠΆΠ°Ρ, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π° ΡΡΠ΅ΡΡΠ²ΡΠ²Π°Π°Ρ Π²ΠΎ ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° ΠΏΡΠ΅Π³Π»Π΅Π΄ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ°.
- ΠΠ½ΡΠ΅Π³ΡΠΈΡΠ΅Ρ ΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΡΠ° ΠΏΠΎΠΌΠ΅ΡΡ ΡΠ°Π·Π»ΠΈΡΠ΅. ΠΠ΄Π½Π° ΠΎΠ΄ ΠΏΡΠ΅Π΄Π½ΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° ΡΠ΅Π» Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½ ΡΠΈΡΡΠ΅ΠΌ ΡΠΊΠ»Π°Π΄ΠΈΡΠ°Π½Π° Π²ΠΎ Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π΅ ΡΠΎΠ° ΡΡΠΎ ΡΠΈΡΠ΅ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ ΡΠ΅ Π΄Π΅ΠΊΠ»Π°ΡΠΈΡΠ°Π°Ρ ΡΠΎΡΠ½ΠΎ Π΅Π΄Π½Π°Ρ, Π° ΠΏΠΎΡΠΎΠ° ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ°Ρ ΠΊΠ°Π΄Π΅ ΠΈ Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈ. ΠΠΎΡΠΈΡΡΠ΅ΡΠ΅ΡΠΎ ΡΠ°Π½ΡΠΎΠΌΡΠΊΠΈ ΡΠΈΠΏΠΎΠ²ΠΈ Π·Π° Π΄Π΅ΠΊΠ»Π°ΡΠΈΡΠ°ΡΠ΅ ΠΏΠΎΡΡΠΈ Π³Π°ΡΠ°Π½ΡΠΈΡΠ° Π΄Π΅ΠΊΠ° ΡΠ°Π·Π»ΠΈΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ°Ρ ΠΊΠΎΠΌΠΏΠ°ΡΠΈΠ±ΠΈΠ»Π½ΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈ Π²ΠΎ ΡΠΈΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΈ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ. ΠΠΌΠ°ΡΡΠΈ Π΅ΠΊΡΠΏΠ»ΠΈΡΠΈΡΠ½ΠΈ Π·Π°Π΄ΠΎΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΈ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠΈ ΠΏΠΎΠΌΠ΅ΡΡ ΡΠ°Π·Π»ΠΈΡΠ΅ ΠΎΡΠΈΠ³ΡΡΡΠ²Π° Π΄Π΅ΠΊΠ° ΡΠΈΡΠ΅ ΡΡΠ»ΡΠ³ΠΈ ΡΠ΅ ΠΏΠΎΠ²ΡΠ·Π°Π½ΠΈ.
- ΠΠΈΡΠΎΠΊΠΎΠΊΠ²Π°Π»ΠΈΡΠ΅ΡΠ½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ. ΠΡΠ°Π²Π΅ΡΠ΅ΡΠΎ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π²ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π·Π°Π΅Π΄Π½ΠΈΡΠΊΠΈ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π·Π²ΠΎΡ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π½Π°Ρ Π²ΠΈΡΠΎΠΊΠΈ ΡΡΠ°Π½Π΄Π°ΡΠ΄ΠΈ Π·Π° ΠΊΠ²Π°Π»ΠΈΡΠ΅Ρ ΠΈ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ°.
- Π‘ΠΈΠΌΡΠ»ΡΠ°Π½ΠΎ Π°ΠΆΡΡΠΈΡΠ°ΡΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ°. ΠΠ²ΡΠΎΠΌΠ°ΡΡΠΊΠΎΡΠΎ ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΎΡ ΠΏΠΎ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π²ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° ΠΎΡΠΈΠ³ΡΡΡΠ²Π° Π΄Π΅ΠΊΠ° ΡΠΈΡΠ΅ ΡΠ°Π·Π»ΠΈ ΡΠ΅ Π°ΠΆΡΡΠΈΡΠ°Π°Ρ.
- ΠΠΎΠ΅Π΄Π½ΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ°. ΠΠ° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° Π½Π΅ ΠΈ ΡΡΠ΅Π±Π° ΠΏΠ°ΡΡΠΈΡΠ°ΡΠ΅, ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° ΠΈΠ»ΠΈ ΡΠ°ΠΊΡΠ²Π°ΡΠ΅ ΡΠΎ Π½Π΅ΡΠΎΡΠ½ΠΈ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ. ΠΠ²Π° ΡΠ° Π½Π°ΠΌΠ°Π»ΡΠ²Π° ΡΠ»ΠΎΠΆΠ΅Π½ΠΎΡΡΠ° Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ°. (ΠΠ΅Π» ΠΎΠ΄ ΡΠ»ΠΎΠΆΠ΅Π½ΠΎΡΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π·Π°Π±Π΅Π»Π΅ΠΆΠ°Π½Π° Π²ΠΎ Π½Π°ΡΠΈΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ Π½Π΅ Π΅ Π°ΡΡΠΈΠ±ΡΡ Π½Π° ΠΊΠΎΠΌΠΏΠ°ΡΠ»ΠΈΡΠ°Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°, ΡΡΠΊΡ ΡΠ°ΠΌΠΎ ΡΠ²Π΅ΡΠ½Π° ΠΎΠ΄Π»ΡΠΊΠ° Π²ΠΎΠ΄Π΅Π½Π° ΠΎΠ΄ ΠΆΠ΅Π»Π±Π°ΡΠ° Π΄Π° ΡΠ΅ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈ ΠΏΠΎΠ³ΠΎΠ»Π΅ΠΌΠ° Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΡΡ Π½Π° ΡΠΈΠΏΠΎΡ.) Π‘ΠΎΡΠ΅ΠΌΠ° Π΅ Π»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠ΅ Π²ΡΠ°ΡΠΈΡΠ΅ Π½Π° Π²ΠΎΠΎΠ±ΠΈΡΠ°Π΅Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° - ΡΠ°ΠΌΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°ΡΡΠ΅ Π³ΠΎ ΠΎΠ½Π° ΡΡΠΎ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΠ²Π° ΠΠ΅Π»ΠΎΠ²ΠΈ. ΠΠ°ΡΠΎΠ°, ΠΌΠΎΠΆΠ΅ΡΠ΅, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ ΡΠΎ ΠΊΠΎΠΌΠΏΠ°ΡΠ»ΠΈΡΠ°Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°, ΠΎΠ΄Π»ΠΎΠΆΡΠ²Π°ΡΡΠΈ ΡΠ° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° Π½Π΅ΠΏΠΎΡΡΠ΅Π±Π½ΠΈΡΠ΅ Π΄Π΅Π»ΠΎΠ²ΠΈ Π΄ΠΎ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ ΠΊΠΎΠ³Π° Π½Π°Π²ΠΈΡΡΠΈΠ½Π° Π΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ.
- ΠΡΠΎΠ²Π΅ΡΠ΅Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°. ΠΠΈΠ΄Π΅ΡΡΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π²ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° ΡΠ° ΡΠ»Π΅Π΄Π°Ρ Π²ΠΎΠΎΠ±ΠΈΡΠ°Π΅Π½Π°ΡΠ° ΡΡΠ΄Π±ΠΈΠ½Π° Π½Π° ΡΠΈΡΠ΅ Π΄ΡΡΠ³ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ, ΠΈΠ·Π»Π΅Π·ΠΎΡ ΡΡΠΎ Π³ΠΎ Π΄ΠΎΠ±ΠΈΠ²Π°ΠΌΠ΅ Π΅ Π°ΡΡΠ΅ΡΠ°ΠΊΡ ΡΠΎ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π° Π²Π΅ΡΠ·ΠΈΡΠ°. ΠΠ²Π° Π½ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π°, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π° ΡΠ΅ Π²ΡΠ°ΡΠΈΠΌΠ΅ Π½Π° ΠΏΡΠ΅ΡΡ ΠΎΠ΄Π½Π°ΡΠ° Π²Π΅ΡΠ·ΠΈΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π΄ΠΎΠΊΠΎΠ»ΠΊΡ Π΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ. ΠΠΎΠΆΠ΅ΠΌΠ΅ Π΄ΡΡΠΈ ΠΈ Π΄Π° ΡΠ° ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° ΠΎΠ΄ ΠΏΡΠ΅Π΄ Π΅Π΄Π½Π° Π³ΠΎΠ΄ΠΈΠ½Π° ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΎΡ ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ ΠΈΡΡΠΎ. Π‘ΡΠ°Π±ΠΈΠ»Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° ΡΠ° ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π° ΠΏΡΠ΅Π΄Π²ΠΈΠ΄Π»ΠΈΠ²ΠΎΡΡΠ° ΠΈ Π΄ΠΎΠ²Π΅ΡΠ»ΠΈΠ²ΠΎΡΡΠ° Π½Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½ΠΈΠΎΡ ΡΠΈΡΡΠ΅ΠΌ. ΠΠΈΠ΄Π΅ΡΡΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π΅ ΡΠΈΠΊΡΠΈΡΠ°Π½Π° Π²ΠΎ ΡΠ°Π·Π°ΡΠ° Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡΠ°, Π΄ΠΎΡΡΠ° Π΅ ΡΠ΅ΡΠΊΠΎ Π΄Π° ΡΠ΅ Π»Π°ΠΆΠΈΡΠ° Π²ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ.
- ΠΠΎΠ΄ΡΠ»Π°ΡΠ½ΠΎΡΡ. ΠΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½Π°ΡΠ° ΡΠ°ΠΌΠΊΠ° Π΅ ΠΌΠΎΠ΄ΡΠ»Π°ΡΠ½Π° ΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΈΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°Π°Ρ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π½Π°ΡΠΈΠ½ΠΈ Π·Π° Π΄Π° ΡΠ΅ ΡΠΎΠ·Π΄Π°Π΄Π°Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ. ΠΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠΎΡ Π΄Π° ΡΠ°Π±ΠΎΡΠΈ Π½Π° Π΅Π΄Π΅Π½ ΡΠ°Π·ΠΎΠ» Π²ΠΎ Π΅Π΄Π½ΠΎ ΠΎΡΠ΅Π»ΠΎΡΠ²ΠΎΡΡΠ²Π°ΡΠ΅ ΠΈ Π½Π° ΠΏΠΎΠ²Π΅ΡΠ΅ ΡΠ°Π·Π»ΠΈ Π²ΠΎ Π΄ΡΡΠ³. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΎΡΠΈ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΎΡ.
- Π’Π΅ΡΡΠΈΡΠ°ΡΠ΅. Π‘ΠΎ Π·Π°ΠΌΠ΅Π½Π° Π½Π° ΠΏΠΎΠ΅Π΄ΠΈΠ½Π΅ΡΠ½ΠΈ ΡΡΠ»ΡΠ³ΠΈ ΡΠΎ Π»Π°ΠΆΠ½ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠΈ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π΄ΠΎΠ±ΠΈΠ΅ΡΠ΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π²Π΅ΡΠ·ΠΈΠΈ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΎΡ ΡΡΠΎ ΡΠ΅ ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΈ Π·Π° ΡΠ΅ΡΡΠΈΡΠ°ΡΠ΅.
- Π’Π΅ΡΡΠΈΡΠ°ΡΠ΅ Π·Π° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΠ°. ΠΠΌΠ°ΡΠ΅ΡΠΎ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° Π·Π° ΡΠ΅Π»ΠΈΠΎΡ Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½ ΡΠΈΡΡΠ΅ΠΌ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π°Π°Ρ ΡΠΈΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π²ΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°Π½Π° ΡΡΠ΅Π΄ΠΈΠ½Π° ΠΊΠ°ΠΊΠΎ Π΄Π΅Π» ΠΎΠ΄ ΡΠ΅ΡΡΠΈΡΠ°ΡΠ΅ΡΠΎ Π·Π° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΠ°. ΠΠ΅ΡΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ Π΅ΠΌΡΠ»ΠΈΡΠ°, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΈΡΡΠ°ΡΠΈΡΠ° ΠΊΠΎΠ³Π° Π½Π΅ΠΊΠΎΠΈ ΡΠ°Π·Π»ΠΈ ΡΡΠ°Π½ΡΠ²Π°Π°Ρ Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΈ.
ΠΠ΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠΈ ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΡΠ²Π°ΡΠ°
ΠΠΎΠΌΠΏΠ°ΡΠ»ΠΈΡΠ°Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° ΡΠ΅ ΡΠ°Π·Π»ΠΈΠΊΡΠ²Π° ΠΎΠ΄ Π΄ΡΡΠ³ΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠΊΠΈ ΠΏΡΠΈΡΡΠ°ΠΏΠΈ ΠΈ ΠΌΠΎΠΆΠ΅Π±ΠΈ Π½Π΅ Π΅ ΠΏΠΎΠ³ΠΎΠ΄Π½Π° Π·Π° Π½Π΅ΠΊΠΎΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ. ΠΠΎΠ΄ΠΎΠ»Ρ ΡΠ΅ Π΄Π°Π΄Π΅Π½ΠΈ Π½Π΅ΠΊΠΎΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠΈ:
- Π‘ΡΠ°ΡΠΈΡΠΊΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°. ΠΠΎΠ½Π΅ΠΊΠΎΠ³Π°Ρ ΡΡΠ΅Π±Π° Π±ΡΠ·ΠΎ Π΄Π° ΡΠ° ΠΏΠΎΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π²ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ, Π·Π°ΠΎΠ±ΠΈΠΊΠΎΠ»ΡΠ²Π°ΡΡΠΈ Π³ΠΈ ΡΠΈΡΠ΅ Π·Π°ΡΡΠΈΡΠ½ΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΈ. Π‘ΠΎ ΠΎΠ²ΠΎΡ ΠΏΡΠΈΡΡΠ°ΠΏ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ ΠΏΠΎΡΠ΅ΡΠΊΠΎ. ΠΠΎ Π½Π°ΡΠΌΠ°Π»Π° ΡΠ°ΠΊΠ°, ΡΓ¨ ΡΡΡΠ΅ ΡΠ΅ Π±ΠΈΠ΄Π΅ ΠΏΠΎΡΡΠ΅Π±Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡΠ° ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΎ ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅. ΠΠ²Π° Π΅ ΠΈ ΠΊΠΎΡΠΈΡΠ½Π° ΠΊΠ°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° Π½Π° ΠΏΡΠΈΡΡΠ°ΠΏΠΎΡ ΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΠΊ Π²ΠΎ Π½Π΅ΠΊΠΎΠΈ ΡΠ»ΡΡΠ°ΠΈ.
- ΠΠ΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°. ΠΠΎ ΡΠ»ΡΡΠ°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠΊΠ°ΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° Π΄Π° ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ° ΡΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠ° Π°Π»Π°ΡΠΊΠ°, ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π°Ρ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ Π½Π°ΠΏΠΎΡΠΈ Π·Π° ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°ΡΠ΅ Π½Π° ΡΠΊΡΠΈΠΏΡΠ°ΡΠ° Π·Π° ΠΈΠ·Π³ΡΠ°Π΄Π±Π°.
- ΠΠ»Π°ΡΠΊΠΈ. ΠΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠ², Π°Π»Π°ΡΠΊΠΈΡΠ΅ ΠΈ ΡΠ΅Ρ Π½ΠΈΠΊΠΈΡΠ΅ Π΄ΠΈΠ·Π°ΡΠ½ΠΈΡΠ°Π½ΠΈ Π΄Π° ΡΠ°Π±ΠΎΡΠ°Ρ ΡΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° ΡΠ΅ Π·Π°ΡΠ½ΠΎΠ²Π°Π°Ρ Π½Π° ΡΠ΅ΠΊΡΡΡΠ°Π»Π½ΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ. Π‘ΠΈΡΠ΅ ΡΠ°ΠΊΠ²ΠΈ Π°Π»Π°ΡΠΊΠΈ/ΡΠ΅Ρ Π½ΠΈΠΊΠΈ Π½Π΅ΠΌΠ° Π΄Π° Π±ΠΈΠ΄Π°Ρ Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΈ Π²ΠΎ ΠΊΠΎΠΌΠΏΠ°ΡΠ»ΠΈΡΠ°Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°.
- ΠΠΎΡΡΠ΅Π±Π½Π° Π΅ ΠΏΡΠΎΠΌΠ΅Π½Π° Π²ΠΎ ΡΡΠ°Π²ΠΎΠ²ΠΈΡΠ΅. ΠΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΈΡΠ΅ ΠΈ DevOps ΡΠ΅ Π½Π°Π²ΠΈΠΊΠ½Π°ΡΠΈ Π½Π° ΡΠ΅ΠΊΡΡΡΠ°Π»Π½ΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ. Π‘Π°ΠΌΠ°ΡΠ° ΠΈΠ΄Π΅ΡΠ° Π·Π° ΡΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ ΠΌΠ°Π»ΠΊΡ Π½Π΅ΠΎΡΠ΅ΠΊΡΠ²Π°Π½Π° ΠΈ Π½Π΅Π²ΠΎΠΎΠ±ΠΈΡΠ°Π΅Π½Π° ΠΈ Π΄Π° ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ° ΠΎΡΡΡΠ»Π°ΡΠ΅.
- ΠΠΎΡΡΠ΅Π±Π΅Π½ Π΅ Π²ΠΈΡΠΎΠΊΠΎΠΊΠ²Π°Π»ΠΈΡΠ΅ΡΠ΅Π½ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π·Π²ΠΎΡ. ΠΠ° ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠ°ΡΠ»ΠΈΡΠ°Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°, ΠΏΠΎΡΡΠ΅Π±Π½Π° Π΅ ΡΠ΅Π»ΠΎΡΠ½Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡΠ° Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° Π³ΡΠ°Π΄Π΅ΡΠ΅ ΠΈ ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° (CI/CD). ΠΠΎ ΡΠΏΡΠΎΡΠΈΠ²Π½ΠΎ ΡΠ΅ Π±ΠΈΠ΄Π΅ Π΄ΠΎΡΡΠ° Π½Π΅Π·Π³ΠΎΠ΄Π½ΠΎ.
ΠΠ° ΡΠ΅ ββΠ·Π°Π΄ΡΠΆΠΈΠΌΠ΅ ΠΈ Π½Π° Π³ΠΎΠ»Π΅ΠΌ Π±ΡΠΎΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΡΠ²Π°ΡΠ° Π½Π° ΡΠ°Π·Π³Π»Π΅Π΄ΡΠ²Π°Π½ΠΈΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΡΡΠΎ Π½Π΅ ΡΠ΅ ΠΏΠΎΠ²ΡΠ·Π°Π½ΠΈ ΡΠΎ ΠΈΠ΄Π΅ΡΠ°ΡΠ° Π·Π° ΠΊΠΎΠΌΠΏΠ°ΡΠ»ΠΈΡΠ°Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°:
- ΠΠΊΠΎ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈΠΌΠ΅ Π½Π΅ΠΏΠΎΡΡΠ΅Π±Π½ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° ΠΊΠΎΠΈ Π½Π΅ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ°Ρ ΠΎΠ΄ ΡΠ°Π·ΠΎΠ»ΠΎΡ, ΡΠΎΠ³Π°Ρ ΠΊΠΎΠΌΠΏΠ°ΡΠ»Π΅ΡΠΎΡ Π½Π΅ΠΌΠ° Π΄Π° Π½ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π΄Π° ΡΠ° ΠΎΡΠΊΡΠΈΠ΅ΠΌΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ° ΡΡΠΎ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΠ²Π°. ΠΠ²ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ΅ΡΠΈ ΡΠΎ Π½Π°ΠΏΡΡΡΠ°ΡΠ΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΎΡ Π·Π° ΡΠΎΡΡΠ° ΠΈ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΠΏΠΎΡΠΈΠ³ΠΈΠ΄Π½ΠΈ ΡΠΈΠΏΠΎΠ²ΠΈ, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ,
HList
ΠΈΠ»ΠΈ Π°Π»Π³Π΅Π±Π°ΡΡΠΊΠΈ ΡΠΈΠΏΠΎΠ²ΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ (ΠΊΠ»Π°ΡΠΈ Π½Π° ΡΠ»ΡΡΠ°ΠΈ) Π·Π° ΠΏΡΠ΅ΡΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ°. - ΠΠΌΠ° Π»ΠΈΠ½ΠΈΠΈ Π²ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠΊΠ°ΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° ΡΡΠΎ Π½Π΅ ΡΠ΅ ΠΏΠΎΠ²ΡΠ·Π°Π½ΠΈ ΡΠΎ ΡΠ°ΠΌΠ°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°: (
package
,import
,Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠΈ Π½Π° ΠΏΡΠ΅Π΄ΠΌΠ΅ΡΠΈ;override def
's Π·Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΊΠΎΠΈ ΠΈΠΌΠ°Π°Ρ ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΈ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ). ΠΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π΅Π»ΡΠΌΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·Π±Π΅Π³Π½Π΅ Π°ΠΊΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°ΡΠ΅ ΡΠΎΠΏΡΡΠ²Π΅Π½ DSL. ΠΠΎΠΊΡΠ°Ρ ΡΠΎΠ°, Π΄ΡΡΠ³ΠΈ Π²ΠΈΠ΄ΠΎΠ²ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ (Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, XML) ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° Π½Π°ΠΌΠ΅ΡΠ½ΡΠ²Π°Π°Ρ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΡΠ²Π°ΡΠ° Π½Π° ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ°. - ΠΠ° ΡΠ΅Π»ΠΈΡΠ΅ Π½Π° ΠΎΠ²ΠΎΡ ΠΏΠΎΡΡ, Π½Π΅ ΡΠ°Π·ΠΌΠΈΡΠ»ΡΠ²Π°ΠΌΠ΅ Π·Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠΊΠ° ΡΠ΅ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° Π½Π° ΠΊΠ»Π°ΡΡΠ΅Ρ ΠΎΠ΄ ΡΠ»ΠΈΡΠ½ΠΈ ΡΠ°Π·Π»ΠΈ.
ΠΠ°ΠΊΠ»ΡΡΠΎΠΊ
ΠΠΎ ΠΎΠ²ΠΎΡ ΠΏΠΎΡΡ, ΡΠ° ΠΈΡΡΡΠ°ΠΆΠΈΠ²ΠΌΠ΅ ΠΈΠ΄Π΅ΡΠ°ΡΠ° Π·Π° ΠΏΡΠ΅ΡΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π²ΠΎ ΠΈΠ·Π²ΠΎΡΠ½ΠΈΠΎΡ ΠΊΠΎΠ΄ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π³ΠΈ Π½Π°ΠΏΡΠ΅Π΄Π½ΠΈΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΎΡ ΠΎΠ΄ ΡΠΈΠΏΠΎΡ Scala. ΠΠ²ΠΎΡ ΠΏΡΠΈΡΡΠ°ΠΏ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π²ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ ΠΊΠ°ΠΊΠΎ Π·Π°ΠΌΠ΅Π½Π° Π·Π° ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π°Π»Π½ΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° Π±Π°Π·ΠΈΡΠ°Π½ΠΈ Π½Π° xml ΠΈΠ»ΠΈ ΡΠ΅ΠΊΡΡΡΠ°Π»Π½ΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ. ΠΠ°ΠΊΠΎ Π½Π°ΡΠΈΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ Π΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π½ Π²ΠΎ Scala, ΠΈΡΡΠΈΡΠ΅ ΠΈΠ΄Π΅ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π½Π΅ΡΠ°Ρ Π½Π° Π΄ΡΡΠ³ΠΈ ΠΊΠΎΠΌΠΏΠ°ΡΠ»ΠΈΡΠ°Π½ΠΈ ΡΠ°Π·ΠΈΡΠΈ (ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ΅ Kotlin, C#, Swift, ...). ΠΠ²ΠΎΡ ΠΏΡΠΈΡΡΠ°ΠΏ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ ΠΈΡΠΏΡΠΎΠ±Π°ΡΠ΅ Π²ΠΎ Π΅Π΄Π΅Π½ ΠΎΠ΄ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΠΈ, Π°ΠΊΠΎ Π½Π΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ°, ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΡΠ΅ Π½Π° ΡΠ΅ΠΊΡΡΡΠ°Π»Π½Π°ΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°, Π΄ΠΎΠ΄Π°Π²Π°ΡΡΠΈ Π³ΠΈ Π΄Π΅Π»ΠΎΠ²ΠΈΡΠ΅ ΡΡΠΎ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΠ²Π°Π°Ρ.
Π‘Π΅ΠΊΠ°ΠΊΠΎ, ΠΊΠΎΠΌΠΏΠ°ΡΠ»ΠΈΡΠ°Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° Π±Π°ΡΠ° Π²ΠΈΡΠΎΠΊΠΎΠΊΠ²Π°Π»ΠΈΡΠ΅ΡΠ΅Π½ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π·Π²ΠΎΡ. ΠΠ° Π²ΠΎΠ·Π²ΡΠ°Ρ, ΡΠ΅ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π° Π²ΠΈΡΠΎΠΊ ΠΊΠ²Π°Π»ΠΈΡΠ΅Ρ ΠΈ ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈΡΠ΅.
Π Π°Π·Π³Π»Π΅Π΄Π°Π½ΠΈΠΎΡ ΠΏΡΠΈΡΡΠ°ΠΏ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠΎΡΠΈΡΠΈ:
- ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ ΠΌΠ°ΠΊΡΠΎΠ° Π·Π° Π΄Π° ΠΈΠ·Π²ΡΡΠΈΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²ΠΎ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠ°ΡΠ»ΠΈΡΠ°ΡΠ΅.
- ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°ΡΠ΅ DSL Π·Π° Π΄Π° ΡΠ° ΠΏΡΠ΅ΡΡΡΠ°Π²ΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° Π½Π°ΡΠΈΠ½ ΡΡΠΎ Π΅ Π΄ΠΎΡΡΠ°ΠΏΠ΅Π½ Π·Π° ΠΊΡΠ°ΡΠ½ΠΈΡΠ΅ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΈ.
- ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°ΡΠ΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ ΡΠΏΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΡΠΎ ΡΠ΅ΡΡΡΡΠΈΡΠ΅ ΡΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΎ ΠΏΡΠΈΠ»Π°Π³ΠΎΠ΄ΡΠ²Π°ΡΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ°. ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠ΅Π½ΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° Π±ΡΠΎΡΠΎΡ Π½Π° ΡΠ°Π·Π»ΠΈ Π²ΠΎ ΠΊΠ»Π°ΡΡΠ΅ΡΠΎΡ Π±Π°ΡΠ° (1) ΡΠ΅ΠΊΠΎΡ ΡΠ°Π·ΠΎΠ» Π΄Π° Π΄ΠΎΠ±ΠΈΠ΅ ΠΌΠ°Π»ΠΊΡ ΠΏΠΎΠΈΠ½Π°ΠΊΠ²Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°; (2) ΠΌΠ΅Π½Π°ΡΠ΅ΡΠΎΡ Π½Π° ΠΊΠ»Π°ΡΡΠ΅ΡΠΎΡ Π΄ΠΎΠ±ΠΈΠ» ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π·Π° Π½ΠΎΠ²ΠΈ ΡΠ°Π·Π»ΠΈ.
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΠ½ΠΈΡΠΈ
ΠΠΈ ΡΠ°ΠΊΠ°Π» Π΄Π° ΠΈΠΌ ΡΠ΅ Π·Π°Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ°ΠΌ Π½Π° ΠΠ½Π΄ΡΠ΅Ρ Π‘Π°ΠΊΡΠΎΠ½ΠΎΠ², ΠΠ°Π²Π΅Π» ΠΠΎΠΏΠΎΠ² ΠΈ ΠΠ½ΡΠΎΠ½ ΠΠ΅Ρ Π°Π΅Π² Π·Π° Π½ΠΈΠ²Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠ²Π½Π° ΠΊΡΠΈΡΠΈΠΊΠ° Π½Π° Π½Π°ΡΡΡ-Π½Π°ΠΏΠΈΡΠΎΡ.
ΠΠ·Π²ΠΎΡ: www.habr.com