рд╕рдВрдХрд▓рд┐рдд рд╡рд┐рддрд░рд┐рдд рд╕рд┐рд╕реНрдЯрдо рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди

рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реАрдЪреНрдпрд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рдордиреЛрд░рдВрдЬрдХ рдпрдВрддреНрд░рдгрд╛ рд╕рд╛рдВрдЧреВ рдЗрдЪреНрдЫрд┐рддреЛ. рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕реБрд░рдХреНрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рд╡рд╛рдкрд░реВрди рд╕рдВрдХрд▓рд┐рдд рднрд╛рд╖реЗрдд (рд╕реНрдХрд╛рд▓рд╛) рдереЗрдЯ рдкреНрд░рд╕реНрддреБрдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ. рд╣реЗ рдкреЛрд╕реНрдЯ рдЕрд╢рд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреЗ рдЙрджрд╛рд╣рд░рдг рджреЗрддреЗ рдЖрдгрд┐ рдПрдХреВрдг рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпреЗрдордзреНрдпреЗ рд╕рдВрдХрд▓рд┐рдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд▓рд╛рдЧреВ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рд╡рд┐рд╡рд┐рдз рдкреИрд▓реВрдВрд╡рд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ.

рд╕рдВрдХрд▓рд┐рдд рд╡рд┐рддрд░рд┐рдд рд╕рд┐рд╕реНрдЯрдо рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди

(рдЗрдВрдЧреНрд░рдЬреА)

рдкрд░рд┐рдЪрдп

рдПрдХ рд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рд░реНрд╣ рд╡рд┐рддрд░рдг рдкреНрд░рдгрд╛рд▓реА рддрдпрд╛рд░ рдХрд░рдгреЗ рдореНрд╣рдгрдЬреЗ рд╕рд░реНрд╡ рдиреЛрдбреНрд╕ рдпреЛрдЧреНрдп рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╡рд╛рдкрд░рддрд╛рдд, рдЗрддрд░ рдиреЛрдбреНрд╕рд╕рд╣ рд╕рдордХреНрд░рдорд┐рдд рдХрд░рддрд╛рдд. DevOps рддрдВрддреНрд░рдЬреНрдЮрд╛рди (рдЯреЗрд░рд╛рдлреЙрд░реНрдо, рдЙрддреНрддрд░рджрд╛рдпреА рдХрд┐рдВрд╡рд╛ рдЕрд╕реЗ рдХрд╛рд╣реАрддрд░реА) рд╕рд╣рд╕рд╛ рдЖрдкреЛрдЖрдк рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓реНрд╕ (рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдбрд╕рд╛рдареА рд╡рд┐рд╢рд┐рд╖реНрдЯ) рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддрд╛рдд. рдЖрдореНрд╣реА рд╣реЗ рджреЗрдЦреАрд▓ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реВ рдЗрдЪреНрдЫрд┐рддреЛ рдХреА рд╕рд░реНрд╡ рд╕рдВрдкреНрд░реЗрд╖рдг рдиреЛрдб рдПрдХрд╕рд╛рд░рдЦреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╡рд╛рдкрд░рдд рдЖрд╣реЗрдд (рд╕рдорд╛рди рдЖрд╡реГрддреНрддреАрд╕рд╣). рдЕрдиреНрдпрдерд╛, рдЖрдордЪреНрдпрд╛ рд╡рд┐рддрд░рдг рдкреНрд░рдгрд╛рд▓реАрдордзреНрдпреЗ рд╡рд┐рд╕рдВрдЧрддреА рддрдпрд╛рд░ рдХреЗрд▓реА рдЬрд╛рдИрд▓. 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)

рдкреНрд░реЗрдд рдкреНрд░рдХрд╛рд░

рд╕рдВрдХрд▓рд┐рдд рд╡реЗрд│реА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдУрд│рдЦрдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рдПрдХ рдкреНрд░рдХрд╛рд░ рдкреЕрд░рд╛рдореАрдЯрд░ рд╡рд╛рдкрд░рддреЛ рдЬреЛ рд╡рд░реНрдЧрд╛рдд рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рдд рдирд╛рд╣реА. рд╣рд╛ рдирд┐рд░реНрдгрдп рдпрд╛ рд╡рд╕реНрддреБрд╕реНрдерд┐рддреАрдореБрд│реЗ рдШреЗрддрд▓рд╛ рдЖрд╣реЗ рдХреА рдЖрдореНрд╣реА рд░рдирдЯрд╛рдЗрдордордзреНрдпреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЙрджрд╛рд╣рд░рдг рд╡рд╛рдкрд░рдд рдирд╛рд╣реА, рдкрд░рдВрддреБ рдЖрдореНрд╣рд╛рд▓рд╛ рдХрдВрдкрд╛рдпрд▓рд░рдиреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓рдЪреА рд╕реБрд╕рдВрдЧрддрддрд╛ рддрдкрд╛рд╕рдгреНрдпрд╛рдЪреА рдЗрдЪреНрдЫрд╛ рдЖрд╣реЗ. рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реВрди, рдЖрдореНрд╣реА рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡ рдореНрд╣рдгреВрди рдЕрдиреБрдЪрд┐рдд рд╕реЗрд╡рд╛ рдкрд╛рд╕ рдХрд░реВ рд╢рдХрдгрд╛рд░ рдирд╛рд╣реА.

рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЛрдЯреЛрдХреЙрд▓рдкреИрдХреА рдПрдХ рдореНрд╣рдгрдЬреЗ Json рдХреНрд░рдорд┐рдХрд░рдгрд╛рд╕рд╣ REST API:

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. рд╡рд┐рд╢реЗрд╖рддрдГ, рдЗрдХреЛ рдХреНрд▓рд╛рдпрдВрдЯрдордзреНрдпреЗ рдЖрдореНрд╣рд╛рд▓рд╛ рд╕рдорд╛рди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдореНрд╣рдгреВрди, рджреЛрди рд╕реЗрд╡рд╛ рдХрдиреЗрдХреНрдЯ рдХрд░рддрд╛рдирд╛, рдЖрдореНрд╣реА рдЦрд╛рддреНрд░реА рдмрд╛рд│рдЧреВ рд╢рдХрддреЛ рдХреА рд╕рд░реНрд╡рдХрд╛рд╣реА рдпреЛрдЧреНрдпрд░рд┐рддреНрдпрд╛ рдХрд╛рд░реНрдп рдХрд░реЗрд▓.

рд╕реЗрд╡рд╛рдВрдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА

рд╕реЗрд╡рд╛ рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рдмрдВрдж рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдлрдВрдХреНрд╢рди рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. (рд╕реЗрд╡рд╛ рдерд╛рдВрдмрд╡рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛ рдЪрд╛рдЪрдгреАрд╕рд╛рдареА рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЖрд╣реЗ.) рдкреБрдиреНрд╣рд╛, рдЕрд╢рд╛ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрдиреЗрдХ рдкрд░реНрдпрд╛рдп рдЖрд╣реЗрдд (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЖрдореНрд╣реА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдкреНрд░рдХрд╛рд░рд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рд╡рд╛рдкрд░реВ рд╢рдХрддреЛ). рдпрд╛ рдкреЛрд╕реНрдЯрдЪреНрдпрд╛ рд╣реЗрддреВрдВрд╕рд╛рдареА, рдЖрдореНрд╣реА рдХреЗрдХ рдкреЕрдЯрд░реНрди рд╡рд╛рдкрд░реВ. рдЖрдореНрд╣реА рд╡рд░реНрдЧ рд╡рд╛рдкрд░реВрди рд╕реЗрд╡реЗрдЪреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░реВ 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 рдкрддреНрддрд╛ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдЙрд░реНрд╡рд░рд┐рдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдкреЗрдХреНрд╖рд╛ рдкрддреНрддрд╛ рдирдВрддрд░ рдЬреНрдЮрд╛рдд рд╣реЛрдгреНрдпрд╛рдЪреА рд╢рдХреНрдпрддрд╛ рдЖрд╣реЗ. рдореНрд╣рдгреВрди рдЖрдореНрд╣рд╛рд▓рд╛ рдПрдХрд╛ рдлрдВрдХреНрд╢рдирдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ рдЬреЗ рдкрддреНрддреНрдпрд╛рд╡рд░ рдиреЛрдб рдЖрдпрдбреА рдореЕрдк рдХрд░рддреЗ:

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

рд╣реЗ рдХрд╛рд░реНрдп рдЕрдВрдорд▓рд╛рдд рдЖрдгрдгреНрдпрд╛рдЪреЗ рдЕрдиреЗрдХ рдорд╛рд░реНрдЧ рдЖрд╣реЗрдд:

  1. рдЬрд░ рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯрдкреВрд░реНрд╡реА рдкрддреНрддреЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдорд╛рд╣реАрдд рдЭрд╛рд▓реЗ, рддрд░ рдЖрдореНрд╣реА рд╕реНрдХрд╛рд▓рд╛ рдХреЛрдб рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддреЛ
    рдкрддреНрддреЗ рдЖрдгрд┐ рдирдВрддрд░ рдмрд┐рд▓реНрдб рдЪрд╛рд▓рд╡рд╛. рд╣реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрд▓ рдЖрдгрд┐ рдЪрд╛рдЪрдгреНрдпрд╛ рдЪрд╛рд▓рд╡реЗрд▓.
    рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рдлрдВрдХреНрд╢рди рд╕реНрдерд┐рд░рдкрдгреЗ рдУрд│рдЦрд▓реЗ рдЬрд╛рдИрд▓ рдЖрдгрд┐ рдореЕрдкрд┐рдВрдЧ рдореНрд╣рдгреВрди рдХреЛрдбрдордзреНрдпреЗ рдкреНрд░рд╕реНрддреБрдд рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ 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 - рдбреЗрдЯрд╛. рдЕрд╕реЗ рджрд┐рд╕рддреЗ рдХреА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдбреЗрдЯрд╛рдкреЗрдХреНрд╖рд╛ рднрд┐рдиреНрди рдЖрд╣реЗрдд рдХрд╛рд░рдг рддреЗ рдбреЗрдЯрд╛рдкреЗрдХреНрд╖рд╛ рдХрдореА рд╡рд╛рд░рдВрд╡рд╛рд░ рдмрджрд▓рддрд╛рдд. рддрд╕реЗрдЪ, рдбреЗрдЯрд╛ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдПрдХрд╛ рд╕реНрддреНрд░реЛрддрд╛рдХрдбреВрди (рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдХрдбреВрди) рдЖрдгрд┐ рджреБрд╕рд░реНтАНрдпрд╛рдХрдбреВрди (рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рд╢рд╛рд╕рдХрд╛рдХрдбреВрди) рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдордзреВрди рдпреЗрддреЛ.

рдкреНрд░реЛрдЧреНрд░рд╛рдо рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рди рдХрд░рддрд╛ рдХреНрд╡рдЪрд┐рддрдЪ рдмрджрд▓рдгрд╛рд░реЗ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдЕрдкрдбреЗрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реНрдпрд╛рд╕, рдпрд╛рдореБрд│реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдордЪреА рдЧреБрдВрддрд╛рдЧреБрдВрдд рд╣реЛрдК рд╢рдХрддреЗ, рдХрд╛рд░рдг рдЖрдореНрд╣рд╛рд▓рд╛ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рд╡рд┐рддрд░рд┐рдд рдХрд░рдгреЗ, рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рдгреЗ, рдкрд╛рд░реНрд╕ рдХрд░рдгреЗ рдЖрдгрд┐ рддрдкрд╛рд╕рдгреЗ рдЖрдгрд┐ рдЪреБрдХреАрдЪреНрдпрд╛ рдореВрд▓реНрдпрд╛рдВрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдореНрд╣рдгреВрди, рдкреНрд░реЛрдЧреНрд░рд╛рдордЪреА рдЬрдЯрд┐рд▓рддрд╛ рдХрдореА рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рддреВрди, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдСрдкрд░реЗрд╢рди рджрд░рдореНрдпрд╛рди рдмрджрд▓реВ рд╢рдХрдгрд╛рд░реНтАНрдпрд╛ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдЪреА рд╕рдВрдЦреНрдпрд╛ рдХрдореА рдХрд░рдгреЗ рдЕрд░реНрдердкреВрд░реНрдг рдЖрд╣реЗ (рдХрд┐рдВрд╡рд╛ рдЕрд╢рд╛ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдирд╛ рдЕрдЬрд┐рдмрд╛рдд рд╕рдорд░реНрдерди рджреЗрдд рдирд╛рд╣реА).

рдпрд╛ рдкреЛрд╕реНрдЯрдЪреНрдпрд╛ рдЙрджреНрджреЗрд╢рд╛рдВрд╕рд╛рдареА, рдЖрдореНрд╣реА рд╕реНрдерд┐рд░ рдЖрдгрд┐ рдбрд╛рдпрдиреЕрдорд┐рдХ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдордзреНрдпреЗ рдлрд░рдХ рдХрд░реВ. рд╕реЗрд╡реЗрдЪреНрдпрд╛ рд▓реЙрдЬрд┐рдХрд▓рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдордЪреНрдпрд╛ рдСрдкрд░реЗрд╢рди рджрд░рдореНрдпрд╛рди рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдмрджрд▓рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕рд▓реНрдпрд╛рд╕, рдЖрдореНрд╣реА рдЕрд╢рд╛ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рд▓рд╛ рдбрд╛рдпрдиреЕрдорд┐рдХ рдореНрд╣рдгреВ. рдЕрдиреНрдпрдерд╛ рдкрд░реНрдпрд╛рдп рд╕реНрдерд┐рд░ рдЖрд╣реЗрдд рдЖрдгрд┐ рд╕рдВрдХрд▓рд┐рдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╡рд╛рдкрд░реВрди рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд. рдбрд╛рдпрдиреЕрдорд┐рдХ рд░реАрдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд╕рд╛рдареА, рдЖрдореНрд╣рд╛рд▓рд╛ рдирд╡реАрди рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рд╕рд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдордЪреЗ рднрд╛рдЧ рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рдпрдВрддреНрд░рдгрд╛ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕реВ рд╢рдХрддреЗ, рдЬрд╕реЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреБрдиреНрд╣рд╛ рд╕реБрд░реВ рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд. (рдЖрдордЪреНрдпрд╛ рдорддреЗ, рд░рд┐рдЕрд▓-рдЯрд╛рдЗрдо рд░реАрдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЯрд╛рд│рдгреНрдпрд╛рдЪрд╛ рд╕рд▓реНрд▓рд╛ рджрд┐рд▓рд╛ рдЬрд╛рддреЛ, рдХрд╛рд░рдг рдпрд╛рдореБрд│реЗ рд╕рд┐рд╕реНрдЯрдордЪреА рдЬрдЯрд┐рд▓рддрд╛ рд╡рд╛рдврддреЗ. рд╢рдХреНрдп рдЕрд╕рд▓реНрдпрд╛рд╕, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреБрдиреНрд╣рд╛ рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдорд╛рдирдХ OS рдХреНрд╖рдорддрд╛ рд╡рд╛рдкрд░рдгреЗ рдЪрд╛рдВрдЧрд▓реЗ.)

рд╕реНрдЯреЕрдЯрд┐рдХ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪрд╛ рдПрдХ рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛ рдкреИрд▓реВ рдЬреНрдпрд╛рдореБрд│реЗ рд▓реЛрдХ рдбрд╛рдпрдиреЕрдорд┐рдХ рд░реАрдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛рдд рддреЗ рдореНрд╣рдгрдЬреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЕрдкрдбреЗрдЯ (рдбрд╛рдЙрдирдЯрд╛рдЗрдо) рдирдВрддрд░ рд╕рд┐рд╕реНрдЯрдо рд░реАрдмреВрдЯ рд╣реЛрдгреНрдпрд╛рд╕рд╛рдареА рд▓рд╛рдЧрдгрд╛рд░рд╛ рд╡реЗрд│. рдЦрд░рдВ рддрд░, рдЖрдореНрд╣рд╛рд▓рд╛ рд╕реНрдерд┐рд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреНрдпреЗ рдмрджрд▓ рдХрд░рд╛рдпрдЪреЗ рдЕрд╕рд▓реНрдпрд╛рд╕, рдирд╡реАрди рдореВрд▓реНрдпреЗ рдкреНрд░рднрд╛рд╡реА рд╣реЛрдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣рд╛рд▓рд╛ рд╕рд┐рд╕реНрдЯрдо рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓. рдбрд╛рдЙрдирдЯрд╛рдЗрдо рд╕рдорд╕реНрдпрд╛ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдкреНрд░рдгрд╛рд▓реАрдВрд╕рд╛рдареА рддреАрд╡реНрд░рддреЗрдордзреНрдпреЗ рдмрджрд▓рддреЗ. рдХрд╛рд╣реА рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ, рдЬреЗрд╡реНрд╣рд╛ рд▓реЛрдб рдХрдореА рдЕрд╕реЗрд▓ рддреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣реА рд░реАрдмреВрдЯ рд╢реЗрдбреНрдпреВрд▓ рдХрд░реВ рд╢рдХрддрд╛. рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рд╕рддрдд рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рди рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕рд▓реНрдпрд╛рд╕, рдЖрдкрдг рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдХрд░реВ рд╢рдХрддрд╛ AWS ELB рдХрдиреЗрдХреНрд╢рди рдирд┐рдЪрд░рд╛. рддреНрдпрд╛рдЪ рд╡реЗрд│реА, рдЬреЗрд╡реНрд╣рд╛ рдЖрдореНрд╣рд╛рд▓рд╛ рд╕рд┐рд╕реНрдЯрдо рд░реАрдмреВрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕рддреЗ, рддреЗрд╡реНрд╣рд╛ рдЖрдореНрд╣реА рдпрд╛ рдкреНрд░рдгрд╛рд▓реАрдЪреЗ рд╕рдорд╛рдВрддрд░ рдЙрджрд╛рд╣рд░рдг рд▓рд╛рдБрдЪ рдХрд░рддреЛ, рддреНрдпрд╛рд╡рд░ рдмреЕрд▓рдиреНрд╕рд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЛ рдЖрдгрд┐ рдЬреБрдиреЗ рдХрдиреЗрдХреНрд╢рди рдкреВрд░реНрдг рд╣реЛрдгреНрдпрд╛рдЪреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЛ. рд╕рд░реНрд╡ рдЬреБрдиреЗ рдХрдиреЗрдХреНрд╢рди рд╕рдВрдкрд▓реНрдпрд╛рдирдВрддрд░, рдЖрдореНрд╣реА рд╕рд┐рд╕реНрдЯрдордЪреЗ рдЬреБрдиреЗ рдЙрджрд╛рд╣рд░рдг рдмрдВрдж рдХрд░рддреЛ.

рдЖрддрд╛ рдЖрд░реНрдЯрд┐рдлреЕрдХреНрдЯрдЪреНрдпрд╛ рдЖрдд рдХрд┐рдВрд╡рд╛ рдмрд╛рд╣реЗрд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕рдВрдЪрдпрд┐рдд рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рд╕рдорд╕реНрдпреЗрдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдпрд╛. рдЬрд░ рдЖрдореНрд╣реА рдПрдЦрд╛рджреНрдпрд╛ рдЖрд░реНрдЯрд┐рдлреЕрдХреНрдЯрдордзреНрдпреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХреЗрд▓реЗ, рддрд░ рдХрд┐рдорд╛рди рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрд░реНрдЯрд┐рдлреЕрдХреНрдЯрдЪреНрдпрд╛ рдЕрд╕реЗрдВрдмреНрд▓реА рджрд░рдореНрдпрд╛рди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреА рд╢реБрджреНрдзрддрд╛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рд╕рдВрдзреА рд╣реЛрддреА. рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдирд┐рдпрдВрддреНрд░рд┐рдд рдЖрд░реНрдЯрд┐рдлреЕрдХреНрдЯрдЪреНрдпрд╛ рдмрд╛рд╣реЗрд░ рдЕрд╕рд▓реНрдпрд╛рд╕, рдпрд╛ рдлрд╛рдЗрд▓рдордзреНрдпреЗ рдмрджрд▓ рдХреЛрдгреА рдХреЗрд▓реЗ рдЖрдгрд┐ рдХрд╛ рдХреЗрд▓реЗ рдпрд╛рдЪрд╛ рдорд╛рдЧреЛрд╡рд╛ рдШреЗрдгреЗ рдХрдареАрдг рдЖрд╣реЗ. рддреЗ рдХрд┐рддреА рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ? рдЖрдордЪреНрдпрд╛ рдорддреЗ, рдмрд░реНрдпрд╛рдЪ рдЙрддреНрдкрд╛рджрди рдкреНрд░рдгрд╛рд▓реАрдВрд╕рд╛рдареА рд╕реНрдерд┐рд░ рдЖрдгрд┐ рдЙрдЪреНрдЪ-рдЧреБрдгрд╡рддреНрддреЗрдЪреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЕрд╕рдгреЗ рдорд╣рддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ.

рдЖрд░реНрдЯрд┐рдлреЕрдХреНрдЯрдЪреА рдЖрд╡реГрддреНрддреА рддреБрдореНрд╣рд╛рд▓рд╛ рддреЗ рдХреЗрд╡реНрд╣рд╛ рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ, рддреНрдпрд╛рдд рдХреЛрдгрддреА рдореВрд▓реНрдпреЗ рдЖрд╣реЗрдд, рдХреЛрдгрддреА рдХрд╛рд░реНрдпреЗ рд╕рдХреНрд╖рдо/рдЕрдХреНрд╖рдо рдЖрд╣реЗрдд рдЖрдгрд┐ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреАрд▓ рдХреЛрдгрддреНрдпрд╛рд╣реА рдмрджрд▓рд╛рд╕рд╛рдареА рдХреЛрдг рдЬрдмрд╛рдмрджрд╛рд░ рдЖрд╣реЗ рд╣реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ. рдЕрд░реНрдерд╛рдд, рдЖрд░реНрдЯрд┐рдлреЕрдХреНрдЯрдордзреНрдпреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕рдВрдЪрдпрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд╣реА рдкреНрд░рдпрддреНрди рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрддреАрд▓, рдореНрд╣рдгреВрди рддреБрдореНрд╣рд╛рд▓рд╛ рдорд╛рд╣рд┐рддреАрдкреВрд░реНрдг рдирд┐рд░реНрдгрдп рдШреЗрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

рд╕рд╛рдзрдХ рдЖрдгрд┐ рдмрд╛рдзрдХ

рдореА рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рддрдВрддреНрд░рдЬреНрдЮрд╛рдирд╛рдЪреНрдпрд╛ рд╕рд╛рдзрдХ рдЖрдгрд┐ рдмрд╛рдзрдХрд╛рдВрд╡рд░ рд▓рдХреНрд╖ рджреЗрдК рдЗрдЪреНрдЫрд┐рддреЛ.

рдлрд╛рдпрджреЗ

рдЦрд╛рд▓реА рд╕рдВрдХрд▓рд┐рдд рд╡рд┐рддрд░рд┐рдд рд╕рд┐рд╕реНрдЯрдо рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреНрдпрд╛ рдореБрдЦреНрдп рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдВрдЪреА рд╕реВрдЪреА рдЖрд╣реЗ:

  1. рд╕реНрдерд┐рд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рддрдкрд╛рд╕рдгреА. рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░рдгреНрдпрд╛рдЪреА рдЕрдиреБрдорддреА рджреЗрддреЗ
    рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдпреЛрдЧреНрдп рдЖрд╣реЗ.
  2. рд╕рдореГрджреНрдз рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рднрд╛рд╖рд╛. рд╕рд╛рдорд╛рдиреНрдпрддрдГ, рдЗрддрд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдкрджреНрдзрддреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрдирд╛рдкрд░реНрдпрдВрдд рдорд░реНрдпрд╛рджрд┐рдд рдЕрд╕рддрд╛рдд. Scala рд╡рд╛рдкрд░рддрд╛рдирд╛, рддреБрдордЪреНрдпрд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреНрдпреЗ рд╕реБрдзрд╛рд░рдгрд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рднрд╛рд╖рд╛ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдВрдЪреА рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реЗрдгреА рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде рдЖрдкрдг рд╡рд╛рдкрд░реВ рд╢рдХрддреЛ
    рдбреАрдлреЙрд▓реНрдЯ рд╡реНрд╣реЕрд▓реНрдпреВрдЬрд╕рд╛рдареА рдЧреБрдг, рд╕рдореВрд╣ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдордзреНрдпреЗ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд╡рд╛рдкрд░реВрди, рдЖрдореНрд╣реА рд╕рдВрд▓рдЧреНрди рд╕реНрдХреЛрдкрдордзреНрдпреЗ рдлрдХреНрдд рдПрдХрджрд╛рдЪ рдШреЛрд╖рд┐рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╡реНрд╣реЙрд▓реНрд╕рдЪрд╛ рд╕рдВрджрд░реНрдн рдШреЗрдК рд╢рдХрддреЛ (DRY). рддреБрдореНрд╣реА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреНрдпреЗ рдереЗрдЯ рдХреЛрдгрддреНрдпрд╛рд╣реА рдХреНрд▓рд╛рд╕реЗрд╕ рдЗрдиреНрд╕реНрдЯрдВрдЯ рдХрд░реВ рд╢рдХрддрд╛ (Seq, Map, рд╕рд╛рдиреБрдХреВрд▓ рд╡рд░реНрдЧ).
  3. DSL. рд╕реНрдХрд╛рд▓рд╛рдордзреНрдпреЗ рдЕрдиреЗрдХ рднрд╛рд╖рд╛ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ рдЖрд╣реЗрдд рдЬреА DSL рддрдпрд╛рд░ рдХрд░рдгреЗ рд╕реЛрдкреЗ рдХрд░рддрд╛рдд. рдпрд╛ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдВрдЪрд╛ рд▓рд╛рдн рдШреЗрдгреЗ рдЖрдгрд┐ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдЪреНрдпрд╛ рд▓рдХреНрд╖реНрдп рдЧрдЯрд╛рд╕рд╛рдареА рдЕрдзрд┐рдХ рд╕реЛрдпреАрд╕реНрдХрд░ рдЕрд╕рд▓реЗрд▓реА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рднрд╛рд╖рд╛ рд▓рд╛рдЧреВ рдХрд░рдгреЗ рд╢рдХреНрдп рдЖрд╣реЗ, рдЬреЗрдгреЗрдХрд░реВрди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдХрд┐рдорд╛рди рдбреЛрдореЗрди рддрдЬреНрдЮрд╛рдВрдирд╛ рд╡рд╛рдЪрддрд╛ рдпреЗрдИрд▓. рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди рдкреНрд░рдХреНрд░рд┐рдпреЗрдд рднрд╛рдЧ рдШреЗрдК рд╢рдХрддрд╛рдд.
  4. рдиреЛрдбреНрд╕ рджрд░рдореНрдпрд╛рди рдЕрдЦрдВрдбрддрд╛ рдЖрдгрд┐ рд╕рд┐рдВрдХреНрд░реЛрдиреА. рд╕рдВрдкреВрд░реНрдг рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реАрдЪреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдПрдХрд╛рдЪ рдмрд┐рдВрджреВрд╡рд░ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рдгреНрдпрд╛рдЪрд╛ рдПрдХ рдлрд╛рдпрджрд╛ рдЕрд╕рд╛ рдЖрд╣реЗ рдХреА рд╕рд░реНрд╡ рдореВрд▓реНрдпреЗ рдПрдХрджрд╛рдЪ рдШреЛрд╖рд┐рдд рдХреЗрд▓реА рдЬрд╛рддрд╛рдд рдЖрдгрд┐ рдирдВрддрд░ рдЖрд╡рд╢реНрдпрдХ рддреЗрдереЗ рдкреБрдиреНрд╣рд╛ рд╡рд╛рдкрд░рд▓реА рдЬрд╛рддрд╛рдд. рдкреЛрд░реНрдЯ рдШреЛрд╖рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдлреЕрдВрдЯрдо рдкреНрд░рдХрд╛рд░ рд╡рд╛рдкрд░рдгреЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рдХреА рдиреЛрдбреНрд╕ рд╕рд░реНрд╡ рдпреЛрдЧреНрдп рд╕рд┐рд╕реНрдЯрдо рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреНрдпреЗ рд╕реБрд╕рдВрдЧрдд рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╡рд╛рдкрд░рдд рдЖрд╣реЗрдд. рдиреЛрдбреНрд╕ рджрд░рдореНрдпрд╛рди рд╕реНрдкрд╖реНрдЯ рдЕрдирд┐рд╡рд╛рд░реНрдп рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡ рдЕрд╕рдгреЗ рд╣реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рдХреА рд╕рд░реНрд╡ рд╕реЗрд╡рд╛ рдХрдиреЗрдХреНрдЯ рдХреЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд.
  5. рдЙрдЪреНрдЪ рджрд░реНрдЬрд╛рдЪреЗ рдмрджрд▓. рдХреЙрдорди рдбреЗрд╡реНрд╣рд▓рдкрдореЗрдВрдЯ рдкреНрд░рдХреНрд░рд┐рдпреЗрдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреНрдпреЗ рдмрджрд▓ рдХреЗрд▓реНрдпрд╛рдиреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд╕рд╛рдареА рдЙрдЪреНрдЪ рджрд░реНрдЬрд╛рдЪреА рдорд╛рдирдХреЗ рджреЗрдЦреАрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреЗ рд╢рдХреНрдп рд╣реЛрддреЗ.
  6. рдПрдХрд╛рдЪрд╡реЗрд│реА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЕрджреНрдпрддрди. рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдмрджрд▓рд╛рдВрдирдВрддрд░ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рд╕рд┐рд╕реНрдЯрдо рдЙрдкрдпреЛрдЬрди рд╣реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рдХреА рд╕рд░реНрд╡ рдиреЛрдбреНрд╕ рдЕрджреНрдпрддрдирд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд.
  7. рдЕрд░реНрдЬ рд╕реБрд▓рдн рдХрд░рдгреЗ. рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рд╕ рдкрд╛рд░реНрд╕рд┐рдВрдЧ, рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рддрдкрд╛рд╕рдгреЗ рдХрд┐рдВрд╡рд╛ рдЪреБрдХреАрдЪреА рдореВрд▓реНрдпреЗ рд╣рд╛рддрд╛рд│рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА. рдпрд╛рдореБрд│реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдЪреА рдЬрдЯрд┐рд▓рддрд╛ рдХрдореА рд╣реЛрддреЗ. (рдЖрдордЪреНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдд рдЖрдврд│реВрди рдЖрд▓реЗрд▓реА рдХрд╛рд╣реА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЬрдЯрд┐рд▓рддрд╛ рд╣реА рд╕рдВрдХрд▓рд┐рдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╛рд╣реА, рдкрд░рдВрддреБ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░рдЪреА рд╕реБрд░рдХреНрд╖рд┐рддрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдЗрдЪреНрдЫреЗрдиреЗ рдШреЗрддрд▓реЗрд▓рд╛ рдХреЗрд╡рд│ рдЬрд╛рдгреАрд╡рдкреВрд░реНрд╡рдХ рдирд┐рд░реНрдгрдп рдЖрд╣реЗ.) рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд╡рд░ рдкрд░рдд рдпреЗрдгреЗ рдЦреВрдк рд╕реЛрдкреЗ рдЖрд╣реЗ - рдлрдХреНрдд рдЧрд╣рд╛рд│ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рд╛ рднрд╛рдЧ рдореНрд╣рдгреВрди, рдЖрдкрдг, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд╕рдВрдХрд▓рд┐рдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд╕рд╣ рдкреНрд░рд╛рд░рдВрдн рдХрд░реВ рд╢рдХрддрд╛, рдЕрдирд╛рд╡рд╢реНрдпрдХ рднрд╛рдЧрд╛рдВрдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдХрд░рдгреЗ рдЦрд░реЛрдЦрд░ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕реЗрд▓ рддреЛрдкрд░реНрдпрдВрдд рд╕реНрдердЧрд┐рдд рдХрд░реВ рд╢рдХрддрд╛.
  8. рд╕рддреНрдпрд╛рдкрд┐рдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди. рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдмрджрд▓ рдЗрддрд░ рдХреЛрдгрддреНрдпрд╛рд╣реА рдмрджрд▓рд╛рдВрдЪреНрдпрд╛ рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдирд╢рд┐рдмрд╛рд▓рд╛ рдЕрдиреБрд╕рд░рдд рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рдЖрдореНрд╣рд╛рд▓рд╛ рдорд┐рд│рдгрд╛рд░реЗ рдЖрдЙрдЯрдкреБрдЯ рд╣реА рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЖрд╡реГрддреНрддреА рдЕрд╕рд▓реЗрд▓реА рдХрд▓рд╛рдХреГрддреА рдЖрд╣реЗ. рд╣реЗ рдЖрдореНрд╣рд╛рд▓рд╛, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реНрдпрд╛рд╕ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреНрдпрд╛ рдорд╛рдЧреАрд▓ рдЖрд╡реГрддреНрддреАрд╡рд░ рдкрд░рдд рдпреЗрдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ. рдЖрдореНрд╣реА рдПрдХ рд╡рд░реНрд╖рд╛рдкреВрд░реНрд╡реАрдЪреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рджреЗрдЦреАрд▓ рд╡рд╛рдкрд░реВ рд╢рдХрддреЛ рдЖрдгрд┐ рд╕рд┐рд╕реНрдЯрдо рдЕрдЧрджреА рд╕рд╛рд░рдЦреЗрдЪ рдХрд╛рд░реНрдп рдХрд░реЗрд▓. рдПрдХ рд╕реНрдерд┐рд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реАрдЪреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдЖрдгрд┐ рд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рд░реНрд╣рддрд╛ рд╕реБрдзрд╛рд░рддреЗ. рд╕рдВрдХрд▓рд┐рдд рдЯрдкреНрдкреНрдпрд╛рд╡рд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдирд┐рд╢реНрдЪрд┐рдд рдХреЗрд▓реЗ рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рдЙрддреНрдкрд╛рджрдирд╛рдордзреНрдпреЗ рддреЗ рдмрдирд╛рд╡рдЯ рдХрд░рдгреЗ рдЦреВрдк рдХрдареАрдг рдЖрд╣реЗ.
  9. рдореЙрдбреНрдпреВрд▓рд░рд┐рдЯреА. рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЙрдбреНрдпреВрд▓рд░ рдЖрд╣реЗ рдЖрдгрд┐ рд╡рд┐рд╡рд┐рдз рдкреНрд░рдгрд╛рд▓реА рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдореЙрдбреНрдпреВрд▓ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдкреНрд░рдХрд╛рд░реЗ рдПрдХрддреНрд░ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд. рд╡рд┐рд╢реЗрд╖рдд:, рддреБрдореНрд╣реА рд╕рд┐рд╕реНрдЯреАрдо рдПрдХрд╛ рдореВрд░реНрдд рд╕реНрд╡рд░реВрдкрд╛рддреАрд▓ рдПрдХрд╛рдЪ рдиреЛрдбрд╡рд░ рдЖрдгрд┐ рджреБрд╕рд░реНтАНрдпрд╛рдордзреНрдпреЗ рдЕрдиреЗрдХ рдиреЛрдбреНрд╕рд╡рд░ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рд╕рд╛рдареА рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░реВ рд╢рдХрддрд╛. рддреБрдореНрд╣реА рд╕рд┐рд╕реНрдЯрдордЪреНрдпрд╛ рдЙрддреНрдкрд╛рджрди рдЙрджрд╛рд╣рд░рдгрд╛рдВрд╕рд╛рдареА рдЕрдиреЗрдХ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддрд╛.
  10. рдЪрд╛рдЪрдгреА. рдореЙрдХ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕рд╕рд╣ рд╡реИрдпрдХреНрддрд┐рдХ рд╕реЗрд╡рд╛ рдкреБрдирд░реНрд╕реНрдерд┐рдд рдХрд░реВрди, рдЖрдкрдг рдЪрд╛рдЪрдгреАрд╕рд╛рдареА рд╕реЛрдпреАрд╕реНрдХрд░ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╕рд┐рд╕реНрдЯрдордЪреНрдпрд╛ рдЕрдиреЗрдХ рдЖрд╡реГрддреНрддреНрдпрд╛ рдорд┐рд│рд╡реВ рд╢рдХрддрд╛.
  11. рдПрдХрддреНрд░реАрдХрд░рдг рдЪрд╛рдЪрдгреА. рд╕рдВрдкреВрд░реНрдг рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реАрд╕рд╛рдареА рдПрдХрдЪ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЕрд╕рд▓реНтАНрдпрд╛рдиреЗ рд╕рдорд╛рдХрд▓рди рдЪрд╛рдЪрдгреАрдЪрд╛ рднрд╛рдЧ рдореНрд╣рдгреВрди рд╕рд░реНрд╡ рдШрдЯрдХ рдирд┐рдпрдВрддреНрд░рд┐рдд рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд рдЪрд╛рд▓рд╡рдгреЗ рд╢рдХреНрдп рд╣реЛрддреЗ. рдЕрдиреБрдХрд░рдг рдХрд░рдгреЗ рд╕реЛрдкреЗ рдЖрд╣реЗ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЕрд╢реА рдкрд░рд┐рд╕реНрдерд┐рддреА рдЬрд┐рдереЗ рдХрд╛рд╣реА рдиреЛрдбреНрд╕ рдкреНрд░рд╡реЗрд╢рдпреЛрдЧреНрдп рд╣реЛрддрд╛рдд.

рддреЛрдЯреЗ рдЖрдгрд┐ рдорд░реНрдпрд╛рджрд╛

рд╕рдВрдХрд▓рд┐рдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЗрддрд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдкрджреНрдзрддреАрдВрдкреЗрдХреНрд╖рд╛ рднрд┐рдиреНрди рдЖрд╣реЗ рдЖрдгрд┐ рдХрд╛рд╣реА рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдВрд╕рд╛рдареА рдпреЛрдЧреНрдп рдЕрд╕реВ рд╢рдХрдд рдирд╛рд╣реА. рдЦрд╛рд▓реА рдХрд╛рд╣реА рддреЛрдЯреЗ рдЖрд╣реЗрдд:

  1. рд╕реНрдерд┐рд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди. рдХрд╛рд╣реАрд╡реЗрд│рд╛ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рд╕рд░реНрд╡ рд╕рдВрд░рдХреНрд╖рдгрд╛рддреНрдордХ рдпрдВрддреНрд░рдгрд╛рдВрдирд╛ рдорд╛рдЧреЗ рдЯрд╛рдХреВрди рдЙрддреНрдкрд╛рджрдирд╛рддреАрд▓ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рджреНрд░реБрддрдкрдгреЗ рджреБрд░реБрд╕реНрдд рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕рддреЗ. рдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рдиреЗ рддреЗ рдЕрдзрд┐рдХ рдХрдареАрдг рд╣реЛрдК рд╢рдХрддреЗ. рдХрдореАрддрдХрдореА, рд╕рдВрдХрд▓рди рдЖрдгрд┐ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдЙрдкрдпреЛрдЬрди рдЕрджреНрдпрд╛рдк рдЖрд╡рд╢реНрдпрдХ рдЕрд╕реЗрд▓. рд╣реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рдЪреЗ рдПрдХ рдЙрдкрдпреБрдХреНрдд рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рдЖрдгрд┐ рдХрд╛рд╣реА рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ рдЧреИрд░рд╕реЛрдп рджреЛрдиреНрд╣реА рдЖрд╣реЗ.
  2. рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдирд┐рд░реНрдорд┐рддреА. рдЬрд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рд╕рд╛рдзрдирд╛рджреНрд╡рд╛рд░реЗ рддрдпрд╛рд░ рдХреЗрд▓реА рдЧреЗрд▓реА рдЕрд╕реЗрд▓ рддрд░, рдмрд┐рд▓реНрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХрддреНрд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдпрддреНрдирд╛рдВрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реВ рд╢рдХрддреЗ.
  3. рд╕рд╛рдзрдиреЗ. рд╕рдзреНрдпрд╛, рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдбрд┐рдЭрд╛рдЗрди рдХреЗрд▓реЗрд▓реА рдЙрдкрдпреБрдХреНрддрддрд╛ рдЖрдгрд┐ рддрдВрддреНрд░реЗ рдордЬрдХреВрд░ рдлрд╛рдЗрд▓реНрд╕рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдЖрд╣реЗрдд. рдЕрд╢рд╛ рд╕рд░реНрд╡ рдЙрдкрдпреБрдХреНрддрддрд╛/рддрдВрддреНрд░реЗ рд╕рдВрдХрд▓рд┐рдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреНрдпреЗ рдЙрдкрд▓рдмреНрдз рдирд╕рддреАрд▓.
  4. рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рдд рдмрджрд▓ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд╡рд┐рдХрд╕рдХ рдЖрдгрд┐ DevOps рдордЬрдХреВрд░ рдлрд╛рдпрд▓реАрдВрдЪреНрдпрд╛ рдирд┐рддреНрдпрд╛рдЪрд╛ рдЖрд╣реЗрдд. рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕рдВрдХрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рдХрд▓реНрдкрдирд╛ рдХрд╛рд╣реАрд╕реЗ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдЖрдгрд┐ рдЕрд╕рд╛рдорд╛рдиреНрдп рдЕрд╕реВ рд╢рдХрддреЗ рдЖрдгрд┐ рдирдХрд╛рд░ рдХрд╛рд░рдгреАрднреВрдд рдЕрд╕реВ рд╢рдХрддреЗ.
  5. рдЙрдЪреНрдЪ рджрд░реНрдЬрд╛рдЪреА рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд╕рдВрдХрд▓рд┐рдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪрд╛ рдЖрд░рд╛рдорд╛рдд рд╡рд╛рдкрд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЕрдиреБрдкреНрд░рдпреЛрдЧ (CI/CD) рддрдпрд╛рд░ рдЖрдгрд┐ рддреИрдирд╛рдд рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрдЪреЗ рд╕рдВрдкреВрд░реНрдг рдСрдЯреЛрдореЗрд╢рди рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдЕрдиреНрдпрдерд╛ рддреЗ рдЦреВрдк рдЧреИрд░рд╕реЛрдпреАрдЪреЗ рд╣реЛрдИрд▓.

рдЖрдкрдг рд╕рдВрдХрд▓рд┐рдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреНрдпрд╛ рдХрд▓реНрдкрдиреЗрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдирд╕рд▓реЗрд▓реНрдпрд╛ рд╡рд┐рдЪрд╛рд░рд╛рдд рдШреЗрддрд▓реЗрд▓реНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдЪреНрдпрд╛ рдЕрдиреЗрдХ рдорд░реНрдпрд╛рджрд╛рдВрд╡рд░ рджреЗрдЦреАрд▓ рд░рд╛рд╣реВ рдпрд╛:

  1. рдЬрд░ рдЖрдореНрд╣реА рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдорд╛рд╣рд┐рддреА рджрд┐рд▓реА рдЬреА рдиреЛрдбрджреНрд╡рд╛рд░реЗ рд╡рд╛рдкрд░рд▓реА рдЬрд╛рдд рдирд╛рд╣реА, рддрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдЧрд╣рд╛рд│ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рд╢реЛрдзрдгреНрдпрд╛рдд рдЖрдореНрд╣рд╛рд▓рд╛ рдорджрдд рдХрд░рдгрд╛рд░ рдирд╛рд╣реА. рдХреЗрдХ рдкреЕрдЯрд░реНрдирдЪрд╛ рддреНрдпрд╛рдЧ рдХрд░реВрди рдЖрдгрд┐ рдЕрдзрд┐рдХ рдХрдареЛрд░ рдкреНрд░рдХрд╛рд░ рд╡рд╛рдкрд░реВрди рд╣реА рд╕рдорд╕реНрдпрд╛ рд╕реЛрдбрд╡рд▓реА рдЬрд╛рдК рд╢рдХрддреЗ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, HList рдХрд┐рдВрд╡рд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдмреАрдЬрдЧрдгрд┐рддреАрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ (рдХреЗрд╕ рд╡рд░реНрдЧ).
  2. рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓рдордзреНрдпреЗ рдЕрд╢рд╛ рдУрд│реА рдЖрд╣реЗрдд рдЬреНрдпрд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдирд╛рд╣реАрдд: (package, import,рд╡рд╕реНрддреВ рдШреЛрд╖рдгрд╛; override defрдбреАрдлреЙрд▓реНрдЯ рдореВрд▓реНрдпреЗ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рд╕рд╛рдареА s). рддреБрдореНрд╣реА рддреБрдордЪрд╛ рд╕реНрд╡рддрдГрдЪрд╛ DSL рдЕрдВрдорд▓рд╛рдд рдЖрдгрд▓реНрдпрд╛рд╕ рд╣реЗ рдЕрдВрд╢рддрдГ рдЯрд╛рд│рддрд╛ рдпреЗрдК рд╢рдХрддреЗ. рдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рдЗрддрд░ рдкреНрд░рдХрд╛рд░рдЪреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, XML) рджреЗрдЦреАрд▓ рдлрд╛рдЗрд▓ рд╕рдВрд░рдЪрдиреЗрд╡рд░ рдХрд╛рд╣реА рдирд┐рд░реНрдмрдВрдз рд▓рд╛рджрддрд╛рдд.
  3. рдпрд╛ рдкреЛрд╕реНрдЯрдЪреНрдпрд╛ рд╣реЗрддреВрдВрд╕рд╛рдареА, рдЖрдореНрд╣реА рд╕рдорд╛рди рдиреЛрдбреНрд╕рдЪреНрдпрд╛ рдХреНрд▓рд╕реНрдЯрд░рдЪреНрдпрд╛ рдбрд╛рдпрдиреЕрдорд┐рдХ рдкреБрдирд░реНрд░рдЪрдирд╛рдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░рдд рдирд╛рд╣реА.

рдирд┐рд╖реНрдХрд░реНрд╖

рдпрд╛ рдкреЛрд╕реНрдЯрдордзреНрдпреЗ, рдЖрдореНрд╣реА рд╕реНрдХрд╛рд▓рд╛ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реАрдЪреНрдпрд╛ рдкреНрд░рдЧрдд рдХреНрд╖рдорддрд╛рдВрдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди рд╕реНрддреНрд░реЛрдд рдХреЛрдбрдордзреНрдпреЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдгреНрдпрд╛рдЪреА рдХрд▓реНрдкрдирд╛ рд╢реЛрдзрд▓реА. рд╣рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрди xml рдХрд┐рдВрд╡рд╛ рдордЬрдХреВрд░ рдлрд╛рдпрд▓реАрдВрд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдкрд╛рд░рдВрдкрд╛рд░рд┐рдХ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдкрджреНрдзрддреАрдВрдЪреНрдпрд╛ рдмрджрд▓реА рдореНрд╣рдгреВрди рд╡рд┐рд╡рд┐рдз рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдВрдордзреНрдпреЗ рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ. рдЬрд░реА рдЖрдордЪреЗ рдЙрджрд╛рд╣рд░рдг рд╕реНрдХрд╛рд▓рд╛рдордзреНрдпреЗ рд▓рд╛рдЧреВ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЕрд╕рд▓реЗ рддрд░реАрд╣реА, рд╕рдорд╛рди рдХрд▓реНрдкрдирд╛ рдЗрддрд░ рд╕рдВрдХрд▓рд┐рдд рднрд╛рд╖рд╛рдВрдордзреНрдпреЗ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХреЗрд▓реНрдпрд╛ рдЬрд╛рдК рд╢рдХрддрд╛рдд (рдЬрд╕реЗ рдХреА рдХреЛрдЯрд▓рд┐рди, рд╕реА#, рд╕реНрд╡рд┐рдлреНрдЯ, ...). рддреБрдореНрд╣реА рдЦрд╛рд▓реАрд▓рдкреИрдХреА рдПрдХрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯрдордзреНрдпреЗ рд╣рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрди рд╡рд╛рдкрд░реВрди рдкрд╛рд╣реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рдЬрд░ рддреЗ рдХрд╛рдо рдХрд░рдд рдирд╕реЗрд▓ рддрд░, рдЧрд╣рд╛рд│ рднрд╛рдЧ рдЬреЛрдбреВрди рдордЬрдХреВрд░ рдлрд╛рдЗрд▓рд╡рд░ рдЬрд╛.

рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХрдЪ, рд╕рдВрдХрд▓рд┐рдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд╕рд╛рдареА рдЙрдЪреНрдЪ рджрд░реНрдЬрд╛рдЪреА рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рддреНрдпрд╛ рдмрджрд▓реНрдпрд╛рдд, рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреА рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рдЖрдгрд┐ рд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рд░реНрд╣рддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХреЗрд▓реА рдЬрд╛рддреЗ.

рд╡рд┐рдЪрд╛рд░рд╛рдд рдШреЗрддрд▓реЗрд▓реНрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рдЪрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ:

  1. рдХрдВрдкрд╛рдЗрд▓-рдЯрд╛рдЗрдо рдЪреЗрдХ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣реА рдореЕрдХреНрд░реЛ рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛.
  2. рдЕрдВрддрд┐рдо рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдирд╛ рдкреНрд░рд╡реЗрд╢ рдХрд░рдгреНрдпрд╛рдпреЛрдЧреНрдп рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕рд╛рджрд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣реА DSL рд▓рд╛рдЧреВ рдХрд░реВ рд╢рдХрддрд╛.
  3. рдЖрдкрдг рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕рдорд╛рдпреЛрдЬрдирд╛рд╕рд╣ рдбрд╛рдпрдиреЕрдорд┐рдХ рд╕рдВрд╕рд╛рдзрди рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рд▓рд╛рдЧреВ рдХрд░реВ рд╢рдХрддрд╛. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдХреНрд▓рд╕реНрдЯрд░рдордзреАрд▓ рдиреЛрдбреНрд╕рдЪреА рд╕рдВрдЦреНрдпрд╛ рдмрджрд▓рдгреНрдпрд╛рд╕рд╛рдареА (1) рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдбрд▓рд╛ рдереЛрдбреЗ рд╡реЗрдЧрд│реЗ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ; (2) рдХреНрд▓рд╕реНрдЯрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХрд╛рд▓рд╛ рдирд╡реАрди рдиреЛрдбреНрд╕рдмрджреНрджрд▓ рдорд╛рд╣рд┐рддреА рдорд┐рд│рд╛рд▓реА.

рдкреЛрдЪрдкрд╛рд╡рддреА

рдЖрдВрджреНрд░реЗрдИ рд╕рдХрд╕реЛрдиреЛрд╡реНрд╣, рдкрд╛рд╡реЗрд▓ рдкреЛрдкреЛрд╡реНрд╣ рдЖрдгрд┐ рдЕрдБрдЯреЛрди рдиреЗрдЦрд╛рдПрд╡ рдпрд╛рдВрдЪреЗ рдорд╕реБрджрд╛ рд▓реЗрдЦрд╛рдЪреНрдпрд╛ рд░рдЪрдирд╛рддреНрдордХ рдЯреАрдХрд╛рдмрджреНрджрд▓ рдореА рдЖрднрд╛рд░ рдорд╛рдиреВ рдЗрдЪреНрдЫрд┐рддреЛ.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛