рдХреНрд╡рд╛рд░реНрдХрд╕ рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЛ рдХреИрд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИ

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░, рдпрд╣рд╛рдВ рдХреНрд╡рд╛рд░реНрдХрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рддреАрд╕рд░реА рдкреЛрд╕реНрдЯ рд╣реИ!

рдХреНрд╡рд╛рд░реНрдХрд╕ рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЛ рдХреИрд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИ

рдЬрд╛рд╡рд╛ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЕрдХреНрд╕рд░ рдРрд╕рд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЧреНрд░рд╣рдг рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ ╨╕ рд╡рд╕рдВрдд рдХрд╛ рдмреВрдЯ рдЕрд▓рдЧ рдФрд░ рд╕реНрд╡рддрдВрддреНрд░ рдПрдкреАрдЖрдИ рд╣реИрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЙрди рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдирдП рдлреНрд░реЗрдорд╡рд░реНрдХ рдФрд░ рд░рдирдЯрд╛рдЗрдо рдШрдЯрдХреЛрдВ рдХреЛ рд╕реАрдЦрдиреЗ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред рдЖрдЬ рд╣рдо рдХреБрдЫ рд▓реЛрдХрдкреНрд░рд┐рдп рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рдПрдкреАрдЖрдИ рдФрд░ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдПрдВрдЧреЗ рдХрд┐ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдкреАрдЖрдИ рдФрд░ рдирдИ рдЙрдкрдпреЛрдЧреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рдХреНрд╡рд╛рд░реНрдХрд╕.

рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ, рд╣рдо рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕ рдмрд╛рдд рдХрд╛ рджрд╛рдпрд░рд╛ рдФрд░ рд╡рд┐рд╡рд░рдг рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреНрд╡рд╛рд░реНрдХрд╕ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЕрдкрдиреЗ рджрд┐рди-рдкреНрд░рддрд┐рджрд┐рди рдХреЗ рдХрд╛рдо рдореЗрдВ рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдкреАрдЖрдИ рдХрд╛ рд╕рдорд░реНрдерди рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рд╣рдо рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рдПрдкреАрдЖрдИ рдХреЛ рдХрд╡рд░ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдмрдирд╛рддреЗ рд╕рдордп рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВред

рдХреНрд╡рд╛рд░реНрдХрд╕ рдХреНрдпреЛрдВ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд▓рд╛рдЗрд╡ рдХреЛрдбрд┐рдВрдЧ рд╣реИ, рдпрд╛рдиреА, рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рдПрдкреАрдЖрдИ, рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдкреАрдЖрдИ рдФрд░ рдЕрдиреНрдп рдЬрд╛рд╡рд╛ рдПрдкреАрдЖрдИ рдореЗрдВ рдХрд┐рд╕реА рднреА рдмрджрд▓рд╛рд╡ рдХреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреБрдирдГ рд▓реЛрдбрд┐рдВрдЧ, рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдХреА рдЬрд╛рддреА рд╣реИ: рдПрдорд╡реАрдПрди рдХреНрд╡рд╛рд░реНрдХрд╕: рджреЗрд╡ред рджреВрд╕рд░реЗ, рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкрд░реНрд╕рди рд╕реЗрд╡рд╛ (рдЬреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ, рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рдФрд░ рдЬреЗрдкреАрдП рдПрдкреАрдЖрдИ рд╕реЗ рдореВрд▓ рдЧреНрд░реЗрд▓рд╡реАрдПрдо рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рдЗрдирд░реА рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрддреА рд╣реИ) рдХреЗрд╡рд▓ 0.055 рд╕реЗрдХрдВрдб рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ рдФрд░ рд░реЗрд╕реНрдЯрдлреБрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдПрдВрдбрдкреЙрдЗрдВрдЯ рдкрд░ рд▓рдЧрднрдЧ 90 рдПрдордмреА рд░реИрдо (рдЖрд░рдПрд╕рдПрд╕) рд▓реЗрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдХрд╛ рд╕рдВрдХрд▓рди рдХреЗрд╡рд▓ рдПрдХ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: mvn package -Pnativeред

рд╣рдо рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдирд╣реАрдВ рдмрддрд╛рдПрдВрдЧреЗ рдХрд┐ рд╡реЗ рдХреНрд╡рд╛рд░реНрдХрд╕ рдореЗрдВ рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХрдВрдЯреЗрдирд░ рдФрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕

рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ рд╕рдорд░реНрдерди рдХреЗ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдкрд╣рд▓реБрдУрдВ рдХреЛ рд╣реА рдХрд╡рд░ рдХрд░реЗрдВрдЧреЗред Kubernetes, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рд╕рдордЭрдирд╛ рдЬрд░реВрд░реА рд╣реИред рдХреНрд╡рд╛рд░реНрдХрд╕ рдХреЛ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ рд╕реНрдЯреИрдХ рдХреЗ рд░реВрдк рдореЗрдВ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕реЗ рдЬрд╛рд╡рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдФрд░ рд╕реЗрд╡рд╛рдУрдВ рдХреА рдореЗрдореЛрд░реА рдЦрдкрдд рдФрд░ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╕рдордп рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣реЛрд╕реНрдЯ рдкрд░ рдЙрдирдХрд╛ рдШрдирддреНрд╡ рдмрдврд╝рддрд╛ рд╣реИ рдФрд░ рд╕рдордЧреНрд░ рд▓рд╛рдЧрдд рдХрдо рд╣реЛрддреА рд╣реИред

рдХреНрд╡рд╛рд░реНрдХрд╕ рднреА рдСрдЯреЛ рдЬреЗрдирд░реЗрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рд╕рдВрд╕рд╛рдзрди рдФрд░ рдСрдлрд╝рд░ рдЧрд╛рдЗрдб рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдФрд░ рд░реЗрдб рд╣реИрдЯ рдУрдкрдирд╢рд┐рдлреНрдЯ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рддреИрдирд╛рддреА рдХреЗ рд▓рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрд╡рд╛рд░реНрдХрд╕ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрдВрдЯреЗрдирд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ Dockerfile.jvm (JVM рдкреИрдХреЗрдЬрд┐рдВрдЧ) рдФрд░ Dockerfile.native (рдореВрд▓ рдмрд╛рдЗрдирд░реА рдкреИрдХреЗрдЬрд┐рдВрдЧ) рдлрд╝рд╛рдЗрд▓реЗрдВ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред

рдЕрдВрдд рдореЗрдВ, рд▓рдХреНрд╖реНрдп рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдХреЗ, рдХреНрд╡рд╛рд░реНрдХрд╕ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╛рд╡рд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд╕реНрддрд░ рдкрд░ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд▓рд╛рдЧреВ рдХреА рдЬрд╛рддреА рд╣реИред рддрд╛рд▓рд┐рдХрд╛ 1 рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЬрд╛рд╡рд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдмреАрдЪ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХрд╛ рдПрдХ рдирдХреНрд╢рд╛ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред

рддрд╛рд▓рд┐рдХрд╛ 1. рдЬрд╛рд╡рд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдФрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рдмреАрдЪ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХрд╛ рдорд╛рдирдЪрд┐рддреНрд░ред

рдХрд╛рд░реНрдпрд╛рддреНрдордХ
рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ
Kubernetes

рд╕реЗрд╡рд╛ рдЦреЛрдЬ
рдпреВрд░реЗрдХрд╛
рдбреАрдПрдирдПрд╕

рд╡рд┐рдиреНрдпрд╛рд╕
рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреНрд▓рд╛рдЙрдб рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди
рдХреЙрдиреНрдлрд╝рд┐рдЧ рдорд╛рдирдЪрд┐рддреНрд░/рд░рд╣рд╕реНрдп

рднрд╛рд░ рд╕рдВрддреБрд▓рди
рд░рд┐рдмрди (рдЧреНрд░рд╛рд╣рдХ рдкрдХреНрд╖)
рд╕реЗрд╡рд╛, рдкреНрд░рддрд┐рдХреГрддрд┐ рдирд┐рдпрдВрддреНрд░рдХ (рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб)

рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рдФрд░ рдЪрд▓рд╛рдирд╛

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ рдЙрджрд╛рд╣рд░рдг рдкрд░рд┐рдпреЛрдЬрдирд╛, рдЬрд╣рд╛рдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдФрд░ рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рдПрдкреАрдЖрдИ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд╣реА рдЬрд╛рд╡рд╛ рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреЛрдб рдХреЛ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдФрд░ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП README.md рдлрд╝рд╛рдЗрд▓ рджреЗрдЦреЗрдВред

рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдПрдкреАрдЖрдИ

рдирд┐рд░реНрднрд░рддрд╛ рдЕрдиреНрддрдГрдХреНрд╖реЗрдкрдг

рдХреНрд╡рд╛рд░реНрдХрд╕ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рд╕рдВрджрд░реНрдн рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди (рд╕реАрдбреАрдЖрдИ) рдПрдкреАрдЖрдИ рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдВрдЬреЗрдХреНрд╢рди (рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреАрдЖрдИ) рдПрдкреАрдЖрдИред рдпрджрд┐ рдЖрдк рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд╛рд╡рд╛ рдИрдИ рдФрд░ рдЬрдХрд╛рд░реНрддрд╛ рдИрдИ, рддреЛ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реАрдбреАрдЖрдИ рд╕реЗ рдмрд╣реБрдд рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВред рджреВрд╕рд░реА рдУрд░, рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреАрдЖрдИ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреАрдЖрдИ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдХреНрд╡рд╛рд░реНрдХрд╕ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдорд░реНрдерд┐рдд рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреАрдЖрдИ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рддрд╛рд▓рд┐рдХрд╛ 2 рдореЗрдВ рджрд┐рдП рдЧрдП рд╣реИрдВред

╨Т рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд░реЗрдВ рд╕реАрдбреАрдЖрдИ рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдВрдЬреЗрдХреНрд╢рди рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХреНрд╡рд╛рд░реНрдХрд╕ рдЧрд╛рдЗрдб рджреЗрдЦреЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреАрдЖрдИ рдЧрд╛рдЗрдб.

рддрд╛рд▓рд┐рдХрд╛ 2. рд╕рдорд░реНрдерд┐рдд рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреАрдЖрдИ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдгред

рд╕рдорд░реНрдерд┐рдд рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреАрдЖрдИ рд╕реБрд╡рд┐рдзрд╛рдПрдБ
рдЙрджрд╛рд╣рд░рдг

рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЗрдВрдЬреЗрдХреНрд╢рди

public PersonSpringController(
   PersonSpringRepository personRepository,  // injected      
   PersonSpringMPService personService) {    // injected
      this.personRepository = personRepository;
      this.personService = personService;
}

рдлрд╝реАрд▓реНрдб рдЗрдВрдЬреЗрдХреНрд╢рди
рд╕реНрд╡рдЪрд╛рд▓рд┐рдд
рд╡реИрд▓реНрдпреВ

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

@Value("${fallbackSalutation}")
String fallbackSalutation;

рд╕реЗрдо
@рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди

@Configuration
public class AppConfiguration {
   @Bean(name = "capitalizeFunction")
   public StringFunction capitalizer() {
      return String::toUpperCase;
   }
}

рдШрдЯрдХ

@Component("noopFunction")
public class NoOpSingleStringFunction implements StringFunction {
   @Override
   public String apply(String s) {
      return s;
   }
}

рд╕рд░реНрд╡рд┐рд╕

@Service
public class MessageProducer {
   @Value("${greeting.message}")
   String message;

   public String getPrefix() {
      return message;
   }
}

рд╡реЗрдм рдврд╛рдБрдЪрд╛

рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдпрд╣ рдкрд╕рдВрдж рдЖрдПрдЧрд╛ рдХрд┐ рдХреНрд╡рд╛рд░реНрдХрд╕ рдкреНрд░рд╛рдердорд┐рдХ рд╡реЗрдм рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЙрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ JAX-RS, рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рд░реЗрд╕реНрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ, JSON-P рдФрд░ JSON-B рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ REST рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рд╡реЗрдм рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдХреНрд╡рд╛рд░реНрдХрд╕ рдХреЗ рд╣рд╛рд▓рд┐рдпрд╛ рд╕рдорд░реНрдерди рд╕реЗ рдкреНрд░рд╕рдиреНрди рд╣реЛрдВрдЧреЗред рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреАрдЖрдИ рдХреЗ рд╕рдорд╛рди, рд╕реНрдкреНрд░рд┐рдВрдЧ рд╡реЗрдм рдПрдкреАрдЖрдИ рд╕рдорд░реНрдерди рдХрд╛ рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рд╕реНрдкреНрд░рд┐рдВрдЧ рд╡реЗрдм рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рдирд╛ рд╣реИред рд╕рдорд░реНрдерд┐рдд рд╕реНрдкреНрд░рд┐рдВрдЧ рд╡реЗрдм рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рддрд╛рд▓рд┐рдХрд╛ 3 рдореЗрдВ рджрд┐рдП рдЧрдП рд╣реИрдВ, рдФрд░ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреНрд╡рд╛рд░реНрдХрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╕реНрдкреНрд░рд┐рдВрдЧ рд╡реЗрдм рдЧрд╛рдЗрдб.

рддрд╛рд▓рд┐рдХрд╛ 3. рд╕рдорд░реНрдерд┐рдд рд╕реНрдкреНрд░рд┐рдВрдЧ рд╡реЗрдм рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдгред

рд╕рдорд░реНрдерд┐рдд рд╕реНрдкреНрд░рд┐рдВрдЧ рд╡реЗрдм рд╕реБрд╡рд┐рдзрд╛рдПрдБ
рдЙрджрд╛рд╣рд░рдг

@рд░реЗрд╕реНрдЯрдХрдВрдЯреНрд░реЛрд▓рд░
@Request рдореИрдкрд┐рдВрдЧ

@RestController
@RequestMapping("/person")
public class PersonSpringController {
   ...
   ...
   ...
}

@рдЧреЗрдЯрдореИрдкрд┐рдВрдЧ
@рдкреЛрд╕реНрдЯрдореИрдкрд┐рдВрдЧ
@рдкреБрдЯрдореИрдкрд┐рдВрдЧ
@рдбрд┐рд▓реАрдЯрдореИрдкрд┐рдВрдЧ
@рдкреИрдЪрдореИрдкрд┐рдВрдЧ
@RequestParam
@RequestHeader
@рдореИрдЯреНрд░рд┐рдХреНрд╕рд╡реЗрд░рд┐рдПрдмрд▓
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (рдЖрдВрд╢рд┐рдХ)

@GetMapping(path = "/greet/{id}",
   produces = "text/plain")
   public String greetPerson(
   @PathVariable(name = "id") long id) {
   ...
   ...
   ...
}

рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП

рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕ рдмрд╛рдд рдХреА рднреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдХреНрд╡рд╛рд░реНрдХрд╕ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдУрдЖрд░рдПрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреЗрдкреАрдП рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рднреА рдЕрдЪреНрдЫреА рдЦрдмрд░ рд╣реИ: рдХреНрд╡рд╛рд░реНрдХрд╕ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП рдПрдиреЛрдЯреЗрд╢рди рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рд╕рдорд░реНрдерд┐рдд рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рддрд╛рд▓рд┐рдХрд╛ 4 рдореЗрдВ рджрд┐рдП рдЧрдП рд╣реИрдВред
╨Т рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд░реЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреНрд╡рд╛рд░реНрдХрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП рдЧрд╛рдЗрдб.

рддрд╛рд▓рд┐рдХрд╛ 4. рд╕рдорд░реНрдерд┐рдд рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдгред

рд╕рдорд░реНрдерд┐рдд рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдЬреЗрдкреАрдП рд╕реБрд╡рд┐рдзрд╛рдПрдБ
рдЙрджрд╛рд╣рд░рдг

CrudRepository

public interface PersonRepository
         extends JpaRepository,
                 PersonFragment {
   ...
}

рдХреЛрд╖
JpaRepository
рдкреЗрдЬрд┐рдВрдЧ рдФрд░ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

рднрдВрдбрд╛рд░ рдЯреБрдХрдбрд╝реЗ

public interface PersonRepository
         extends JpaRepository,
                 PersonFragment {
   ...
}

рд╡реНрдпреБрддреНрдкрдиреНрди рдХреНрд╡реЗрд░реА рд╡рд┐рдзрд┐рдпрд╛рдБ

public interface PersonRepository extends CrudRepository {

    List findByName(String name);
    
    Person findByNameBySsn(String ssn);
    
    Optional 
       findByNameBySsnIgnoreCase(String ssn);

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреНрд╡реЗрд░реАрдЬрд╝

public interface MovieRepository
         extends CrudRepository {

    Movie findFirstByOrderByDurationDesc();

    @Query("select m from Movie m where m.rating = ?1")
    Iterator findByRating(String rating);

    @Query("from Movie where title = ?1")
    Movie findByTitle(String title);
}

рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдПрдкреАрдЖрдИ

рджреЛрд╖ рд╕рд╣рд┐рд╖реНрдгреБрддрд╛

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

рддрд╛рд▓рд┐рдХрд╛ 5. рд╕рдорд░реНрдерд┐рдд рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рдлреЙрд▓реНрдЯ рдЯреЙрд▓рд░реЗрдВрд╕ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдгред

рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рджреЛрд╖ рд╕рд╣рдирд╢реАрд▓рддрд╛ рд╕реБрд╡рд┐рдзрд╛рдПрдБ
рд╡рд┐рд╡рд░рдг
рдЙрджрд╛рд╣рд░рдг

@рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕

рддрд░реНрдХ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛

@Asynchronous
@Retry
public Future<String> getSalutation() {
   ...
   return future;
}

@рдмрд▓реНрдХрд╣реЗрдб

рдПрдХ рд╕рд╛рде рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реАрдорд┐рдд рдХрд░реЗрдВ

@Bulkhead(5)
public void fiveConcurrent() {
   makeRemoteCall(); //...
}

@рдкрд░рд┐рдкрде рд╡рд┐рдпреЛрдЬрдХ

рд╕реНрдорд╛рд░реНрдЯ рд╡рд┐рдлрд▓рддрд╛ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдФрд░ рд╡рд┐рдлрд▓рддрд╛рдУрдВ рд╕реЗ рдЙрдмрд░рдирд╛

@CircuitBreaker(delay=500   // milliseconds
   failureRatio = .75,
   requestVolumeThreshold = 20,
   successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

@рдореИрджрд╛рди рдЫреЛрдбрд╝рдирд╛

рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реНрдХ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛

@Timeout(500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

public String fallback() {
   return "hello";
}

рдкреБрди: рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ

рдЕрдиреБрд░реЛрдз рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдкрд░ рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ

@Retry(maxRetries=3)
public String getSalutation() {
   makeRemoteCall(); //...
}

рдордзреНрдпрд╛рдВрддрд░

рд╡рд┐рдлрд▓рддрд╛ рдирд┐рдпрдВрддреНрд░рдг рд╕рдордпрдмрд╛рд╣реНрдп

@Timeout(value = 500 )   // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

рдЬрд╛рдБрдЪ рд╕реЗрд╡рд╛рдПрдБ (рд╕реЗрд╡рд╛ рд╕реНрд╡рд╛рд╕реНрдереНрдп)

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╡рд┐рд╢реЗрд╖ рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддреЗ рд╣реИрдВред рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЛ рд╕реЗрд╡рд╛рдУрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдХрд╕реНрдЯрдо рд╣реЗрд▓реНрдердЗрдВрдбрд┐рдХреЗрдЯрд░ рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдПрдХреНрдЪреБрдПрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдХреНрд╡рд╛рд░реНрдХрд╕ рдореЗрдВ, рдпрд╣ рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рд╣реЗрд▓реНрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдЬреАрд╡рдВрддрддрд╛ рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рд╛рде рдЬреАрд╡рдВрддрддрд╛ рдФрд░ рддрддреНрдкрд░рддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдорд░реНрдерд┐рдд рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рд╣реЗрд▓реНрде рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рддрд╛рд▓рд┐рдХрд╛ 6 рдореЗрдВ рджрд┐рдП рдЧрдП рд╣реИрдВ, рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреНрд╡рд╛рд░реНрдХрд╕ рдореИрдиреБрдЕрд▓ рдореЗрдВ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╣реИ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛.

рддрд╛рд▓рд┐рдХрд╛ 6: рд╕рдорд░реНрдерд┐рдд рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рд╣реЗрд▓реНрде рдПрдкреАрдЖрдИ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдгред

рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рд╕реНрд╡рд╛рд╕реНрдереНрдп рд╕реБрд╡рд┐рдзрд╛рдПрдБ
рд╡рд┐рд╡рд░рдг
рдЙрджрд╛рд╣рд░рдг

@рд▓рд╛рдЗрд╡рдиреЗрд╕

рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╡рд┐рдлрд▓ рдХрдВрдЯреЗрдирд░реАрдХреГрдд рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд░реАрдмреВрдЯ рдХрд░рддрд╛ рд╣реИ
рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ:
рд╣реЛрд╕реНрдЯ:8080/рд╕реНрд╡рд╛рд╕реНрдереНрдп/рд▓рд╛рдЗрд╡

@Liveness
public class MyHC implements HealthCheck {
  public HealthCheckResponse call() {

   ...
   return HealthCheckResponse
     .named("myHCProbe")
     .status(ready ? true:false)
     .withData("mydata", data)
     .build();  
}

@рддрддреНрдкрд░рддрд╛

рдпрджрд┐ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИ рддреЛ рд╡рд╣ рдХрдВрдЯреЗрдирд░реАрдХреГрдд рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдкрд░ рдЯреНрд░реИрдлрд╝рд┐рдХ рдирд╣реАрдВ рднреЗрдЬреЗрдЧрд╛
рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ:
рд╣реЛрд╕реНрдЯ:8080/рд╕реНрд╡рд╛рд╕реНрдереНрдп/рддреИрдпрд╛рд░

@Readiness
public class MyHC implements HealthCheck {
  public HealthCheckResponse call() {

   ...
   return HealthCheckResponse
     .named("myHCProbe")
     .status(live ? true:false)
     .withData("mydata", data)
     .build();  
}

рдореЗрдЯреНрд░рд┐рдХреНрд╕

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдпрд╛ рддреЛ рдкрд░рд┐рдЪрд╛рд▓рди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ (рдкреНрд░рджрд░реНрд╢рди рдПрд╕рдПрд▓рдП рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд▓рд┐рдП) рдпрд╛ рдЧреИрд░-рдкрд░рд┐рдЪрд╛рд▓рди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ (рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдПрд╕рдПрд▓рдП) рдХреЗ рд▓рд┐рдП рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдПрдХреНрдЪреБрдПрдЯрд░ рдФрд░ рдорд╛рдЗрдХреНрд░реЛрдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдмрджрд▓реЗ рдореЗрдВ, рдХреНрд╡рд╛рд░реНрдХрд╕ рдмреЗрд╕рд▓рд╛рдЗрди рдореЗрдЯреНрд░рд┐рдХреНрд╕ (рдЬреЗрд╡реАрдПрдо рдФрд░ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо), рд╡рд┐рдХреНрд░реЗрддрд╛ рдореЗрдЯреНрд░рд┐рдХреНрд╕ (рдХреНрд╡рд╛рд░реНрдХрд╕), рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди JSON рдФрд░ OpenMetrics (рдкреНрд░реЛрдореЗрдерд┐рдпрд╕) рдЖрдЙрдЯрдкреБрдЯ рд╕реНрд╡рд░реВрдкреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗред рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рддрд╛рд▓рд┐рдХрд╛ 7 рдореЗрдВ рджрд┐рдП рдЧрдП рд╣реИрдВред

╨Т рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд░реЗрдВ рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдХреНрд╡рд╛рд░реНрдХрд╕ рдореИрдиреБрдЕрд▓ рджреЗрдЦреЗрдВ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдЧрд╛рдЗрдб.

рддрд╛рд▓рд┐рдХрд╛ 7. рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдгред

рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд╕реБрд╡рд┐рдзрд╛рдПрдБ
рд╡рд┐рд╡рд░рдг
рдЙрджрд╛рд╣рд░рдг

@рдЧрд┐рдирд╛ рд╣реБрдЖ

рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдЬреЛ рдпрд╣ рдЧрд┐рдирддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдПрдиреЛрдЯреЗрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХрд┐рддрдиреА рдмрд╛рд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

@Counted(name = "fallbackCounter", 
  displayName = "Fallback Counter", 
  description = "Fallback Counter")
public String salutationFallback() {
   return fallbackSalutation;
}

@ConcurrentGauge

рдПрдХ рдЧреЗрдЬ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдиреЛрдЯреЗрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рд╕рдорд╡рд░реНрддреА рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ

@ConcurrentGuage(
  name = "fallbackConcurrentGauge", 
  displayName="Fallback Concurrent", 
  description="Fallback Concurrent")
public String salutationFallback() {
   return fallbackSalutation;
}

@рдЧреЗрдЬ

рдПрдХ рдЧреЗрдЬ рд╕реЗрдВрд╕рд░ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдиреЛрдЯреЗрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдорд╛рдкрддрд╛ рд╣реИ

@Metered(name = "FallbackGauge",
   displayName="Fallback Gauge",
   description="Fallback frequency")
public String salutationFallback() {
   return fallbackSalutation;
}

@рдореАрдЯрд░реНрдб

рдПрдХ рдореАрдЯрд░ рд╕реЗрдВрд╕рд░ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдиреЛрдЯреЗрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдХреЙрд▓ рдЖрд╡реГрддреНрддрд┐ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрддрд╛ рд╣реИ

@Metered(name = "MeteredFallback",
   displayName="Metered Fallback",
   description="Fallback frequency")
public String salutationFallback() {
   return fallbackSalutation;
}

рдореИрдЯреНрд░рд┐рдХ

рдПрдХ рдПрдиреЛрдЯреЗрд╢рди рдЬрд┐рд╕рдореЗрдВ рдореАрдЯреНрд░рд┐рдХ рджрд░реНрдЬ рдХрд░рдиреЗ рдпрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ

@Metric
@Metered(name = "MeteredFallback",
   displayName="Metered Fallback",
   description="Fallback frequency")
public String salutationFallback() {
   return fallbackSalutation;
}

рд╕рдордпрдмрджреНрдз

рдПрдХ рдЯрд╛рдЗрдорд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдиреЛрдЯреЗрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЕрд╡рдзрд┐ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИ

@Timed(name = "TimedFallback",
   displayName="Timed Fallback",
   description="Fallback delay")
public String salutationFallback() {
   return fallbackSalutation;
}

рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд╕рдорд╛рдкрдирдмрд┐рдВрджреБ

рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд╕реНрдерд╛рдиреАрдп рд╣реЛрд╕реНрдЯ:8080/рдореЗрдЯреНрд░рд┐рдХреНрд╕/рдЖрд╡реЗрджрди
рдмреБрдирд┐рдпрд╛рджреА рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд╕реНрдерд╛рдиреАрдп рд╣реЛрд╕реНрдЯ:8080/рдореЗрдЯреНрд░рд┐рдХреНрд╕/рдЖрдзрд╛рд░
рд╡рд┐рдХреНрд░реЗрддрд╛ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд╕реНрдерд╛рдиреАрдп рд╣реЛрд╕реНрдЯ:8080/рдореЗрдЯреНрд░рд┐рдХреНрд╕/рд╡рд┐рдХреНрд░реЗрддрд╛
рд╕рднреА рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд╕реНрдерд╛рдиреАрдп рд╣реЛрд╕реНрдЯ:8080/рдореЗрдЯреНрд░рд┐рдХреНрд╕

рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рд░реЗрд╕реНрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ

рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдЕрдХреНрд╕рд░ рд░реЗрд╕реНрдЯрдлреБрд▓ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреАрдЖрдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд░реЗрд╕реНрдЯрдлреБрд▓ рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЖрдорддреМрд░ рдкрд░ рд░реЗрд╕реНрдЯрдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдХреНрд╡рд╛рд░реНрдХрд╕ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рд░реЗрд╕реНрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рддрд╛рд▓рд┐рдХрд╛ 8 рдореЗрдВ рджрд┐рдП рдЧрдП рд╣реИрдВред

╨Т рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд░реЗрдВ рд░реЗрд╕реНрдЯрдлреБрд▓ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рд░реЗрд╕реНрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреНрд╡рд╛рд░реНрдХрд╕ рдореИрдиреБрдЕрд▓ рдореЗрдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдмрд╛рдХреА рдЧреНрд░рд╛рд╣рдХ рдЧрд╛рдЗрдб.

рддрд╛рд▓рд┐рдХрд╛ 8. рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рд░реЗрд╕реНрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдгред

рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рд░реЗрд╕реНрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реБрд╡рд┐рдзрд╛рдПрдБ
рд╡рд┐рд╡рд░рдг
рдЙрджрд╛рд╣рд░рдг

@RegisterRestClient

рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдЬрд╛рд╡рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ REST рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ

@RegisterRestClient
@Path("/")
public interface MyRestClient {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getSalutation();
}

@рд░реЗрд╕реНрдЯрдХреНрд▓рд╛рдЗрдВрдЯ

рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП REST рдХреНрд▓рд╛рдЗрдВрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИ

@Autowired // or @Inject
@RestClient
MyRestClient restClient;

рдордВрдЧрд▓рд╛рдЪрд░рдг

REST рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ

System.out.println(
   restClient.getSalutation());

рдПрдордкреА-рд░реЗрд╕реНрдЯ/рдпреВрдЖрд░рдПрд▓

REST рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ

application.properties:
org.example.MyRestClient/mp-rest/url=
   http://localhost:8081/myendpoint

рдкрд░рд┐рдгрд╛рдо

рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдкрд░ рд▓рдХреНрд╖рд┐рдд рдЗрд╕ рдмреНрд▓реЙрдЧ рдореЗрдВ, рд╣рдордиреЗ рдЬрд╛рд╡рд╛ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╡рд╛рд░реНрдХрд╕ рдореЗрдВ рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдореВрд▓ рдмрд╛рдЗрдирд░реА рдХреЛрдб рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдПрдХ рддреНрд╡рд░рд┐рдд рдирдЬрд╝рд░ рдбрд╛рд▓реА, рдЬреЛ рд╕реИрдХрдбрд╝реЛрдВ рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рд░реИрдо рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИ рдФрд░ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИред рдорд┐рд▓реАрд╕реЗрдХреЗрдВрдб рдХреА рдмрд╛рдд рд╣реИ.

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╣реА рд╕рдордЭ рдЪреБрдХреЗ рд╣реИрдВ, рд╕реНрдкреНрд░рд┐рдВрдЧ рдФрд░ рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рдПрдкреАрдЖрдИ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА, рд╕рд╛рде рд╣реА рдХрдИ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рдпрд╣рд╛рдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИред рдХреНрд╡рд╛рд░реНрдХрд╕ рдореИрдиреБрдЕрд▓.

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ