рдЧреЛ рдХрд┐рдЯ рдХреЗ рд╕рд╛рде рдЧреЛ рдСрди рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрд╕: рдкрд░рд┐рдЪрдп

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЧреЛ рдХрд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ, рдЧреЛ рдкрд░ рд╕реВрдХреНрд╖реНрдо рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред рдпрд╣ рд▓реЗрдЦ рдЧреЛ рдХрд┐рдЯ рдХрд╛ рдкрд░рд┐рдЪрд╛рдпрдХ рд╣реИред рдореЗрд░реЗ рдмреНрд▓реЙрдЧ рдкрд░ рдкрд╣рд▓рд╛ рднрд╛рдЧ, рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИ ред


рдЖрдзреБрдирд┐рдХ рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЧреЛ рдХреЛ рддреЗрдЬреА рд╕реЗ рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИред рдЬрдм рдЖрдк рдХреНрд▓рд╛рдЙрдб-рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реА рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЕрдкрдиреА рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬреИрд╕реЗ: рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рд╡рд╣рди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ ( рдЖрджрд┐ред рдЕрдиреБрд╡рд╛рдж HTTP, gRPC, рдЖрджрд┐ ) рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рд╕рдВрджреЗрд╢ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдкреНрд░рд╛рд░реВрдк, RPC рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛, рд▓реЙрдЧрд┐рдВрдЧред , рдЕрдиреБрд░реЗрдЦрдг, рдореИрдЯреНрд░рд┐рдХреНрд╕ рдФрд░ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ, рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдирд╛, рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдирд╛, рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдореЗрдВ рдПрдХреАрдХрд░рдг рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ред рдЧреЛ рдЕрдкрдиреА рд╕рд╛рджрдЧреА рдФрд░ "рдХреЛрдИ рдЬрд╛рджреВ" рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдХрд╛рд░рдг рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рднрд╛рд╖рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЧреЛ рд╕рдВрдХреБрд▓, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рддрд░рд┐рдд рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдЬрд┐рд╕рдореЗрдВ "рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рдЬрд╛рджреВ" рдХреЗ рд╕рд╛рде рдкреВрд░реНрдг рд╡рд┐рдХрд╕рд┐рдд рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ [ рд▓рдЧрднрдЧред рдкреНрд░рддрд┐ред рд╢рд┐рдЬреВ рд╡рд░реНрдЧреАрд╕ ] рдореИрдВ рдкреВрд░реНрдг рд╡рд┐рдХрд╕рд┐рдд рдврд╛рдВрдЪреЗ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛, рдореИрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЕрдзрд┐рдХ рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рджреЗрддреЗ рд╣реИрдВред рдЧреЛ рдХрд┐рдЯ рдиреЗ рдЧреЛ рдЗрдХреЛрд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЧреИрдк рдХреЛ рднрд░ рджрд┐рдпрд╛, рдЬрд┐рд╕рд╕реЗ рдорд╛рдЗрдХреНрд░реЛрд╕рд┐рд╕реНрдЯрд░реНрд╕ рдмрдирд╛рддреЗ рд╕рдордп рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдкреИрдХреЗрдЬ рдХреЗ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


рдЫрд╡рд┐


рдЧреЛ рдХрд┐рдЯ рдХрд╛ рдкрд░рд┐рдЪрдп


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


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


рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЧреЛ рдХрд┐рдЯ


рдЧреЛ рдХрд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдП рдЧрдП рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рддреАрди рдореБрдЦреНрдп рд╕реНрддрд░ рд╣реИрдВ:


  • рдкрд░рд┐рд╡рд╣рди рд╕реНрддрд░
  • рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рд╕реНрддрд░
  • рд╕реЗрд╡рд╛ рд╕реНрддрд░

рдкрд░рд┐рд╡рд╣рди рд╕реНрддрд░


рдЬрдм рдЖрдк рд╡рд┐рддрд░рд┐рдд рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлрд╝реНрдЯ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЙрдирдореЗрдВ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдЕрдХреНрд╕рд░ рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рд╡рд╣рди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдЬреИрд╕реЗ: HTTP рдпрд╛ gRPC, рдпрд╛ NAT / рдЬреИрд╕реЗ рдкрдм / рдЙрдк рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдЧреЛ рдХрд┐рдЯ рдореЗрдВ рдкрд░рд┐рд╡рд╣рди рдкрд░рдд рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рд╡рд╣рди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ (рдЗрд╕рдХреЗ рдмрд╛рдж рдкрд░рд┐рд╡рд╣рди) рд╕реЗ рдЬреБрдбрд╝реА рд╣реИред рдЧреЛ рдХрд┐рдЯ рдЖрдкрдХреА рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рд╡рд╣рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИ, рдЬреИрд╕реЗ: HTTP, gRPC, NATS, AMQP рдФрд░ рдерд┐рд░рдлрд╝реНрдЯ ( рд▓рдЧрднрдЧред рдЖрдк рдЕрдкрдиреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдкрд░рд┐рд╡рд╣рди рднреА рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ )ред рдЗрд╕рд▓рд┐рдП, рдЧреЛ рдХрд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд▓рд┐рдЦреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕реЗрд╡рд╛рдПрдВ рдЕрдХреНрд╕рд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реНрдпрд╡рд╕рд╛рдп рддрд░реНрдХ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреА рд╣реИрдВ рдЬреЛ рдХрд┐ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд╣рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдирддреА рд╣реИрдВ, рдЖрдк рдПрдХ рд╣реА рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рд╡рд╣рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдЧреЛ рдХрд┐рдЯ рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рдПрдХ рд╕реЗрд╡рд╛ HTTP рдФрд░ gRPC рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╕рд╛рде рдЗрд╕ рддрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреА рд╣реИред


Endpointy


рдПрдХ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдпрд╛ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рд╕реЗрд╡рд╛рдУрдВ рдФрд░ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдореМрд▓рд┐рдХ рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХ рд╣реИред рдЧреЛ рдХрд┐рдЯ рдореЗрдВ, рдореБрдЦреНрдп рд╕рдВрдЪрд╛рд░ рдкреИрдЯрд░реНрди рдЖрд░рдкреАрд╕реА рд╣реИред рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЛ рдПрдХ рдЕрд▓рдЧ RPC рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЧреЛ рдХрд┐рдЯ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд╡рд╛ рдкрджреНрдзрддрд┐ рдПрдХ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдЖрд░рд╕реАрдкреА рд╢реИрд▓реА рдореЗрдВ рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдмреАрдЪ рд╕рдВрд╡рд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдкрд░рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕реЗрд╡рд╛ рдкрджреНрдзрддрд┐ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ HTTP рдпрд╛ gRPC рдЬреИрд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рд╡рд╣рди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЕрд▓рдЧ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЛ рдХрдИ рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ ( рд▓рдЧрднрдЧ рд▓реЗрди HTTP рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдкрд░ рдЬреАрдЖрд░рдкреАрд╕реА ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рд╛рде рд╕реЗрд╡рд╛ рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рд╕реЗрд╡рд╛рдПрдВ


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


рдЙрджрд╛рд╣рд░рдг


рдФрд░ рдЕрдм рдПрдХ рд╕рд░рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдкрд░рддреЛрдВ рдХреЛ рджреЗрдЦреЗрдВред


рд╕реЗрд╡рд╛ рдореЗрдВ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ


рд╕реЗрд╡рд╛ рдореЗрдВ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо рдИ-рдХреЙрдорд░реНрд╕ рдореЗрдВ рдПрдХ рдЖрджреЗрд╢ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВрдЧреЗ:


// Service describes the Order service. type Service interface { Create(ctx context.Context, order Order) (string, error) GetByID(ctx context.Context, id string) (Order, error) ChangeStatus(ctx context.Context, id string, status string) error } 

рдСрд░реНрдбрд░ рд╕реЗрд╡рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдСрд░реНрдбрд░ рдбреЛрдореЗрди рдЗрдХрд╛рдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:


 // Order represents an order type Order struct { ID string `json:"id,omitempty"` CustomerID string `json:"customer_id"` Status string `json:"status"` CreatedOn int64 `json:"created_on,omitempty"` RestaurantId string `json:"restaurant_id"` OrderItems []OrderItem `json:"order_items,omitempty"` } // OrderItem represents items in an order type OrderItem struct { ProductCode string `json:"product_code"` Name string `json:"name"` UnitPrice float32 `json:"unit_price"` Quantity int32 `json:"quantity"` } // Repository describes the persistence on order model type Repository interface { CreateOrder(ctx context.Context, order Order) error GetOrderByID(ctx context.Context, id string) (Order, error) ChangeOrderStatus(ctx context.Context, id string, status string) error } 

рдпрд╣рд╛рдБ рд╣рдо рдЖрджреЗрд╢ рд╕реЗрд╡рд╛ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:


 package implementation import ( "context" "database/sql" "time" "github.com/go-kit/kit/log" "github.com/go-kit/kit/log/level" "github.com/gofrs/uuid" ordersvc "github.com/shijuvar/gokit-examples/services/order" ) // service implements the Order Service type service struct { repository ordersvc.Repository logger log.Logger } // NewService creates and returns a new Order service instance func NewService(rep ordersvc.Repository, logger log.Logger) ordersvc.Service { return &service{ repository: rep, logger: logger, } } // Create makes an order func (s *service) Create(ctx context.Context, order ordersvc.Order) (string, error) { logger := log.With(s.logger, "method", "Create") uuid, _ := uuid.NewV4() id := uuid.String() order.ID = id order.Status = "Pending" order.CreatedOn = time.Now().Unix() if err := s.repository.CreateOrder(ctx, order); err != nil { level.Error(logger).Log("err", err) return "", ordersvc.ErrCmdRepository } return id, nil } // GetByID returns an order given by id func (s *service) GetByID(ctx context.Context, id string) (ordersvc.Order, error) { logger := log.With(s.logger, "method", "GetByID") order, err := s.repository.GetOrderByID(ctx, id) if err != nil { level.Error(logger).Log("err", err) if err == sql.ErrNoRows { return order, ordersvc.ErrOrderNotFound } return order, ordersvc.ErrQueryRepository } return order, nil } // ChangeStatus changes the status of an order func (s *service) ChangeStatus(ctx context.Context, id string, status string) error { logger := log.With(s.logger, "method", "ChangeStatus") if err := s.repository.ChangeOrderStatus(ctx, id, status); err != nil { level.Error(logger).Log("err", err) return ordersvc.ErrCmdRepository } return nil } 

рдЖрд░рдкреАрд╕реА рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдФрд░ рдЙрддреНрддрд░


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


 // CreateRequest holds the request parameters for the Create method. type CreateRequest struct { Order order.Order } // CreateResponse holds the response values for the Create method. type CreateResponse struct { ID string `json:"id"` Err error `json:"error,omitempty"` } // GetByIDRequest holds the request parameters for the GetByID method. type GetByIDRequest struct { ID string } // GetByIDResponse holds the response values for the GetByID method. type GetByIDResponse struct { Order order.Order `json:"order"` Err error `json:"error,omitempty"` } // ChangeStatusRequest holds the request parameters for the ChangeStatus method. type ChangeStatusRequest struct { ID string `json:"id"` Status string `json:"status"` } // ChangeStatusResponse holds the response values for the ChangeStatus method. type ChangeStatusResponse struct { Err error `json:"error,omitempty"` } 

рдЖрд░рдкреАрд╕реА рдПрдВрдбрдкреЙрдЗрдВрдЯ рдЬреИрд╕реА рд╕реЗрд╡рд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЧреЛ рдХрд┐рдЯ рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕


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


рдпрд╣рд╛рдБ рдЧреЛ рдХрд┐рдЯ рд╕реЗ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рд╣реИ:


 type Endpoint func(ctx context.Context, request interface{}) (response interface{}, err error) 

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдКрдкрд░ рдХрд╣рд╛, рдПрдВрдбрдкреЙрдЗрдВрдЯ рдПрдХ рдЕрд▓рдЧ рдЖрд░рдкреАрд╕реА рд╡рд┐рдзрд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд╡рд╛ рдкрджреНрдзрддрд┐ рдХреЛ endpoint.Endpoint рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдбреЗрдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред рдЖрдЗрдпреЗ рдЬрд╛рдиреЗ рдЧреЛ рдХрд┐рдЯ рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рдлреЙрд░ рдСрд░реНрдбрд░ рд╕рд░реНрд╡рд┐рд╕ рдореЗрдердб:


 import ( "context" "github.com/go-kit/kit/endpoint" "github.com/shijuvar/gokit-examples/services/order" ) // Endpoints holds all Go kit endpoints for the Order service. type Endpoints struct { Create endpoint.Endpoint GetByID endpoint.Endpoint ChangeStatus endpoint.Endpoint } // MakeEndpoints initializes all Go kit endpoints for the Order service. func MakeEndpoints(s order.Service) Endpoints { return Endpoints{ Create: makeCreateEndpoint(s), GetByID: makeGetByIDEndpoint(s), ChangeStatus: makeChangeStatusEndpoint(s), } } func makeCreateEndpoint(s order.Service) endpoint.Endpoint { return func(ctx context.Context, request interface{}) (interface{}, error) { req := request.(CreateRequest) id, err := s.Create(ctx, req.Order) return CreateResponse{ID: id, Err: err}, nil } } func makeGetByIDEndpoint(s order.Service) endpoint.Endpoint { return func(ctx context.Context, request interface{}) (interface{}, error) { req := request.(GetByIDRequest) orderRes, err := s.GetByID(ctx, req.ID) return GetByIDResponse{Order: orderRes, Err: err}, nil } } func makeChangeStatusEndpoint(s order.Service) endpoint.Endpoint { return func(ctx context.Context, request interface{}) (interface{}, error) { req := request.(ChangeStatusRequest) err := s.ChangeStatus(ctx, req.ID, req.Status) return ChangeStatusResponse{Err: err}, nil } } 

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


 func makeCreateEndpoint(s order.Service) endpoint.Endpoint { return func(ctx context.Context, request interface{}) (interface{}, error) { req := request.(CreateRequest) id, err := s.Create(ctx, req.Order) return CreateResponse{ID: id, Err: err}, nil } } 

HTTP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд╕реЗрд╡рд╛ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди


рд╣рдордиреЗ рдЕрдкрдиреА рд╕реЗрд╡рд╛ рдмрдирд╛рдИ рдФрд░ рдЕрдкрдиреА рд╕реЗрд╡рд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд░рдкреАрд╕реА рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ред рдЕрдм рд╣рдореЗрдВ рдЕрдкрдиреА рд╕реЗрд╡рд╛ рдХреЛ рдмрд╛рд╣рд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЕрдиреНрдп рд╕реЗрд╡рд╛рдПрдВ рдЖрд░рд╕реАрдкреА рдХреЗ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХрд╣ рд╕рдХреЗрдВред рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреА рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд╣рди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдпрд╣ рдЕрдиреБрд░реЛрдз рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛ред рдЧреЛ рдХрд┐рдЯ рд╡рд┐рднрд┐рдиреНрди рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдЬреИрд╕реЗ рдХрд┐ HTTP, gRPC, NATS, AMQP рдФрд░ рдереНрд░рд┐рдлреНрдЯ рдЖрдЙрдЯ рдСрдлрд╝ рдж рдмреЙрдХреНрд╕ рдХреЛ рд╕рдкреЛрд░реНрдЯ рдХрд░рддреА рд╣реИред


рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреА рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП HTTP рдкрд░рд┐рд╡рд╣рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЧреЛ рдХрд┐рдЯ рдкреИрдХреЗрдЬ github.com/go-kit/kit/transport/http HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕реЗрд╡рд╛ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдФрд░ transport/http рдкреИрдХреЗрдЬ рд╕реЗ NewServer рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдирдпрд╛ http рд╕рд░реНрд╡рд░ рдмрдирд╛рдПрдЧрд╛ рдЬреЛ http.Handler рдХреЛ рд▓рд╛рдЧреВ http.Handler рдФрд░ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╕рдорд╛рдкрди рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИред


рдиреАрдЪреЗ рд╡рд╣ рдХреЛрдб рд╣реИ рдЬреЛ рдЧреЛ рдХрд┐рдЯ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЛ рдПрдХ HTTP рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬреЛ HTTP рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдкрд░реЛрд╕рддрд╛ рд╣реИ:


 package http import ( "context" "encoding/json" "errors" "github.com/shijuvar/gokit-examples/services/order" "net/http" "github.com/go-kit/kit/log" kithttp "github.com/go-kit/kit/transport/http" "github.com/gorilla/mux" "github.com/shijuvar/gokit-examples/services/order/transport" ) var ( ErrBadRouting = errors.New("bad routing") ) // NewService wires Go kit endpoints to the HTTP transport. func NewService( svcEndpoints transport.Endpoints, logger log.Logger, ) http.Handler { // set-up router and initialize http endpoints r := mux.NewRouter() options := []kithttp.ServerOption{ kithttp.ServerErrorLogger(logger), kithttp.ServerErrorEncoder(encodeError), } // HTTP Post - /orders r.Methods("POST").Path("/orders").Handler(kithttp.NewServer( svcEndpoints.Create, decodeCreateRequest, encodeResponse, options..., )) // HTTP Post - /orders/{id} r.Methods("GET").Path("/orders/{id}").Handler(kithttp.NewServer( svcEndpoints.GetByID, decodeGetByIDRequest, encodeResponse, options..., )) // HTTP Post - /orders/status r.Methods("POST").Path("/orders/status").Handler(kithttp.NewServer( svcEndpoints.ChangeStatus, decodeChangeStausRequest, encodeResponse, options..., )) return r } func decodeCreateRequest(_ context.Context, r *http.Request) (request interface{}, err error) { var req transport.CreateRequest if e := json.NewDecoder(r.Body).Decode(&req.Order); e != nil { return nil, e } return req, nil } func decodeGetByIDRequest(_ context.Context, r *http.Request) (request interface{}, err error) { vars := mux.Vars(r) id, ok := vars["id"] if !ok { return nil, ErrBadRouting } return transport.GetByIDRequest{ID: id}, nil } func decodeChangeStausRequest(_ context.Context, r *http.Request) (request interface{}, err error) { var req transport.ChangeStatusRequest if e := json.NewDecoder(r.Body).Decode(&req); e != nil { return nil, e } return req, nil } func encodeResponse(ctx context.Context, w http.ResponseWriter, response interface{}) error { if e, ok := response.(errorer); ok && e.error() != nil { // Not a Go kit transport error, but a business-logic error. // Provide those as HTTP errors. encodeError(ctx, e.error(), w) return nil } w.Header().Set("Content-Type", "application/json; charset=utf-8") return json.NewEncoder(w).Encode(response) } 

рд╣рдо transport/http рдкреИрдХреЗрдЬ рд╕реЗ NewServer рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ http.Handler рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдФрд░ рдЕрдиреБрд░реЛрдз рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рдВрд╕ ( type DecodeRequestFunc func ) рдХрд╛ рдорд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ (рдЙрджрд╛ред type EncodeReponseFunc func )ред


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд DecodeRequestFunc рдФрд░ EncodeResponseFunc рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ:


 // For decoding request type DecodeRequestFunc func(context.Context, *http.Request) (request interface{}, err error) 

 // For encoding response type EncodeResponseFunc func(context.Context, http.ResponseWriter, interface{}) error 

HTTP рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рдирд╛


рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ HTTP рд╕рд░реНрд╡рд░ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдКрдкрд░ рд╡рд░реНрдгрд┐рдд NewService рдлрд╝рдВрдХреНрд╢рди http.Handler рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ http.Handler рдЬреЛ рд╣рдореЗрдВ рдЗрд╕реЗ HTTP рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:


 func main() { var ( httpAddr = flag.String("http.addr", ":8080", "HTTP listen address") ) flag.Parse() var logger log.Logger { logger = log.NewLogfmtLogger(os.Stderr) logger = log.NewSyncLogger(logger) logger = level.NewFilter(logger, level.AllowDebug()) logger = log.With(logger, "svc", "order", "ts", log.DefaultTimestampUTC, "caller", log.DefaultCaller, ) } level.Info(logger).Log("msg", "service started") defer level.Info(logger).Log("msg", "service ended") var db *sql.DB { var err error // Connect to the "ordersdb" database db, err = sql.Open("postgres", "postgresql://shijuvar@localhost:26257/ordersdb?sslmode=disable") if err != nil { level.Error(logger).Log("exit", err) os.Exit(-1) } } // Create Order Service var svc order.Service { repository, err := cockroachdb.New(db, logger) if err != nil { level.Error(logger).Log("exit", err) os.Exit(-1) } svc = ordersvc.NewService(repository, logger) } var h http.Handler { endpoints := transport.MakeEndpoints(svc) h = httptransport.NewService(endpoints, logger) } errs := make(chan error) go func() { c := make(chan os.Signal) signal.Notify(c, syscall.SIGINT, syscall.SIGTERM) errs <- fmt.Errorf("%s", <-c) }() go func() { level.Info(logger).Log("transport", "HTTP", "addr", *httpAddr) server := &http.Server{ Addr: *httpAddr, Handler: h, } errs <- server.ListenAndServe() }() level.Error(logger).Log("exit", <-errs) } 

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


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


рд╕реНрд░реЛрдд рдХреЛрдб


рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдБ GitHub рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЧреЛ рдХрд┐рдЯ рдореЗрдВ рдордзреНрдпрд╡рд░реНрдЧ


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


рдиреАрдЪреЗ рдЧреЛ рдХрд┐рдЯ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреА рдПрдХ рддрд╕реНрд╡реАрд░ рд╣реИ, рдЬрд┐рд╕реЗ рдЧреЛ рдХрд┐рдЯ рдореЗрдВ рдордзреНрдпрд╡рд░реНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ "рдкреНрдпрд╛рдЬ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛" рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдЫрд╡рд┐


рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рд╕рд┐рдВрдбреНрд░реЛрдо рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ


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


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


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


рдкреБрдирд╢реНрдЪ


рдЕрдиреБрд╡рд╛рдж рдХрд╛ рд▓реЗрдЦрдХ рдореВрд▓ рдкрд╛рда рдХреЗ рд▓реЗрдЦрдХ рдХреА рд░рд╛рдп рдХреЛ рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдХреЗрд╡рд▓ рд░реВрд╕реА рд░реВрд╕реА рд╕рдореБрджрд╛рдп рдХреЗ рд▓рд┐рдП рд╢реИрдХреНрд╖рд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдпреБрдкреАрдбреА
рдпрд╣ рдЕрдиреБрд╡рд╛рдж рдЕрдиреБрднрд╛рдЧ рдХрд╛ рдкрд╣рд▓рд╛ рд▓реЗрдЦ рднреА рд╣реИ рдФрд░ рдореИрдВ рдЕрдиреБрд╡рд╛рдж рдкрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ред

Source: https://habr.com/ru/post/hi430300/


All Articles