рдЧреЛрд▓рдВрдЧ рдФрд░ рдЬреАрдЖрд░рдкреАрд╕реА рдкрд░ рдПрдХ рдорд╛рдЗрдХреНрд░реЛрд╕реИрд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг, рднрд╛рдЧ 1

рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд╡рд╛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдкрд░рд┐рдЪрдп


10 рдореЗрдВ рд╕реЗ рднрд╛рдЧ 1


рдЗрд╡рд╛рди рд╡реЗрд▓реЗрдВрдЯрд╛рдЗрди рд▓реЗрдЦреЛрдВ рдХрд╛ рдЕрдиреБрдХреВрд▓рдиред


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


рд╕реНрдЯреИрдХ рдореИрдВрдиреЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛: рдЧреЛрд▓рдВрдЧ, рдореЛрдВрдЧреЛрдбрдм, рдЬреАрдкреАрд╕реА, рдбреЙрдХрдЯрд░, рдЧреВрдЧрд▓ рдХреНрд▓рд╛рдЙрдб, рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕, рдПрдирдПрдЯреАрдПрд╕, рд╕рд░реНрдХрд▓рд╕реАрдЖрдИ, рдЯреЗрд░рд╛рдлреЙрд░реНрдо рдФрд░ рдЧреЛ-рдорд╛рдЗрдХреНрд░реЛред


рдореБрдЭреЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдЪреВрдВрдХрд┐ рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдФрд░ рд╕рдВрдЪрд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд▓рдВрдмрд╛ рд╕рдордп рд▓рдЧрд╛ред рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдореИрдВрдиреЗ рдЧреЛ рдФрд░ рдЕрдиреНрдп рдирдИ рддрдХрдиреАрдХреЛрдВ рдкрд░ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдмрдирд╛рдиреЗ, рдкрд░реАрдХреНрд╖рдг рдФрд░ рддреИрдирд╛рддреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╕реАрдЦрд╛ред


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


  • рдорд╛рд▓
  • рд╕реВрдЪреА
  • рдЬрд╣рд╛рдЬреЛрдВ
  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛
  • рднреВрдорд┐рдХрд╛рдПрдБ
  • рдкреНрд░рдорд╛рдгреАрдХрд░рдг


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


рд╕рд┐рджреНрдзрд╛рдВрдд


рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреНрдпрд╛ рд╣реИ?


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



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


рдЧреЛрд▓рдВрдЧ рдХреНрдпреЛрдВ?


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


рдкреНрд░реЛрдЯреЛрдмреБрдлрд╝ / gRPC рд╕реЗ рдорд┐рд▓реЛ


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


рд╕рдВрдЪрд╛рд░ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╛рд░рдВрдкрд░рд┐рдХ REST рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ HTTP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ JSON рдпрд╛ XML рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдЗрд╕рдХреА рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдбреЗрдЯрд╛ рдПрдирдХреЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрдХреНрд╖ рдкрд░ рдбреАрдХреЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдпрд╣ рдУрд╡рд░рд╣реЗрдб рд╣реИ рдФрд░ рдХреЛрдб рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИред


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


рдЬреАрдЖрд░рдкреАрд╕реА рдЖрдкрдХреЛ рдПрдХ рдЕрдиреБрдХреВрд▓ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЕрдкрдиреА рд╕реЗрд╡рд╛ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ - рдпрд╣ рд╣реИ> рдкреНрд░реЛрдЯреЛрдмреЙрдлрд╝ ред


рдЕрднреНрдпрд╛рд╕


рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ /project/consigment.protoред
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреНрд░реЛрдЯреЛрдмреЙрдлрд╝ рдкреНрд░рд▓реЗрдЦрди


consigment.proto
//consigment.proto syntax = "proto3"; package go.micro.srv.consignment; service ShippingService { rpc CreateConsignment(Consignment) returns (Response) {} } message Consignment { string id = 1; string description = 2; int32 weight = 3; repeated Container containers = 4; string vessel_id = 5; } message Container { string id = 1; string customer_id = 2; string origin = 3; string user_id = 4; } message Response { bool created = 1; Consignment consignment = 2; } 

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


рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ, рд╕рдВрдХрд▓рдХ рдФрд░ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╕рдВрдХрд▓рди рдХрд░реЗрдВ:


 $ go get -u google.golang.org/grpc $ go get -u github.com/golang/protobuf/protoc-gen-go $ sudo apt install protobuf-compiler $ mkdir consignment && cd consignment $ protoc -I=. --go_out=plugins=grpc:. consignment.proto 

рдЖрдЙрдЯрдкреБрдЯ рдПрдХ рдлрд╛рдЗрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:


consignment.pb.go
 // Code generated by protoc-gen-go. DO NOT EDIT. // source: consignment.proto package consignment import ( fmt "fmt" proto "github.com/golang/protobuf/proto" context "golang.org/x/net/context" grpc "google.golang.org/grpc" math "math" ) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal var _ = fmt.Errorf var _ = math.Inf // This is a compile-time assertion to ensure that this generated file // is compatible with the proto package it is being compiled against. // A compilation error at this line likely means your copy of the // proto package needs to be updated. const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package type Consignment struct { Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` Weight int32 `protobuf:"varint,3,opt,name=weight,proto3" json:"weight,omitempty"` Containers []*Container `protobuf:"bytes,4,rep,name=containers,proto3" json:"containers,omitempty"` VesselId string `protobuf:"bytes,5,opt,name=vessel_id,json=vesselId,proto3" json:"vessel_id,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *Consignment) Reset() { *m = Consignment{} } func (m *Consignment) String() string { return proto.CompactTextString(m) } func (*Consignment) ProtoMessage() {} func (*Consignment) Descriptor() ([]byte, []int) { return fileDescriptor_3804bf87090b51a9, []int{0} } func (m *Consignment) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Consignment.Unmarshal(m, b) } func (m *Consignment) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Consignment.Marshal(b, m, deterministic) } func (m *Consignment) XXX_Merge(src proto.Message) { xxx_messageInfo_Consignment.Merge(m, src) } func (m *Consignment) XXX_Size() int { return xxx_messageInfo_Consignment.Size(m) } func (m *Consignment) XXX_DiscardUnknown() { xxx_messageInfo_Consignment.DiscardUnknown(m) } var xxx_messageInfo_Consignment proto.InternalMessageInfo func (m *Consignment) GetId() int32 { if m != nil { return m.Id } return 0 } func (m *Consignment) GetDescription() string { if m != nil { return m.Description } return "" } func (m *Consignment) GetWeight() int32 { if m != nil { return m.Weight } return 0 } func (m *Consignment) GetContainers() []*Container { if m != nil { return m.Containers } return nil } func (m *Consignment) GetVesselId() string { if m != nil { return m.VesselId } return "" } type Container struct { Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` CustomerId string `protobuf:"bytes,2,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"` Origin string `protobuf:"bytes,3,opt,name=origin,proto3" json:"origin,omitempty"` UserId string `protobuf:"bytes,4,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *Container) Reset() { *m = Container{} } func (m *Container) String() string { return proto.CompactTextString(m) } func (*Container) ProtoMessage() {} func (*Container) Descriptor() ([]byte, []int) { return fileDescriptor_3804bf87090b51a9, []int{1} } func (m *Container) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Container.Unmarshal(m, b) } func (m *Container) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Container.Marshal(b, m, deterministic) } func (m *Container) XXX_Merge(src proto.Message) { xxx_messageInfo_Container.Merge(m, src) } func (m *Container) XXX_Size() int { return xxx_messageInfo_Container.Size(m) } func (m *Container) XXX_DiscardUnknown() { xxx_messageInfo_Container.DiscardUnknown(m) } var xxx_messageInfo_Container proto.InternalMessageInfo func (m *Container) GetId() int32 { if m != nil { return m.Id } return 0 } func (m *Container) GetCustomerId() string { if m != nil { return m.CustomerId } return "" } func (m *Container) GetOrigin() string { if m != nil { return m.Origin } return "" } func (m *Container) GetUserId() string { if m != nil { return m.UserId } return "" } type Response struct { Created bool `protobuf:"varint,1,opt,name=created,proto3" json:"created,omitempty"` Consignment *Consignment `protobuf:"bytes,2,opt,name=consignment,proto3" json:"consignment,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *Response) Reset() { *m = Response{} } func (m *Response) String() string { return proto.CompactTextString(m) } func (*Response) ProtoMessage() {} func (*Response) Descriptor() ([]byte, []int) { return fileDescriptor_3804bf87090b51a9, []int{2} } func (m *Response) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Response.Unmarshal(m, b) } func (m *Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Response.Marshal(b, m, deterministic) } func (m *Response) XXX_Merge(src proto.Message) { xxx_messageInfo_Response.Merge(m, src) } func (m *Response) XXX_Size() int { return xxx_messageInfo_Response.Size(m) } func (m *Response) XXX_DiscardUnknown() { xxx_messageInfo_Response.DiscardUnknown(m) } var xxx_messageInfo_Response proto.InternalMessageInfo func (m *Response) GetCreated() bool { if m != nil { return m.Created } return false } func (m *Response) GetConsignment() *Consignment { if m != nil { return m.Consignment } return nil } func init() { proto.RegisterType((*Consignment)(nil), "Consignment") proto.RegisterType((*Container)(nil), "Container") proto.RegisterType((*Response)(nil), "Response") } func init() { proto.RegisterFile("consignment.proto", fileDescriptor_3804bf87090b51a9) } var fileDescriptor_3804bf87090b51a9 = []byte{ // 281 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x91, 0xbf, 0x4e, 0x33, 0x31, 0x10, 0xc4, 0xbf, 0xcb, 0xff, 0x5b, 0x7f, 0x02, 0xc5, 0x05, 0x58, 0x50, 0x70, 0xba, 0x2a, 0xa2, 0x70, 0x11, 0x9e, 0x00, 0xa5, 0x4a, 0xeb, 0xd0, 0xa3, 0x60, 0xaf, 0x2e, 0x2b, 0x11, 0xfb, 0x64, 0x3b, 0xe1, 0x75, 0x78, 0x54, 0x74, 0xbe, 0x1c, 0x18, 0x51, 0xce, 0xac, 0x67, 0xf7, 0xa7, 0x31, 0x2c, 0xb5, 0xb3, 0x81, 0x1a, 0x7b, 0x44, 0x1b, 0x65, 0xeb, 0x5d, 0x74, 0xf5, 0x67, 0x01, 0x6c, 0xf3, 0xe3, 0xf2, 0x2b, 0x18, 0x91, 0x11, 0x45, 0x55, 0xac, 0xa6, 0x6a, 0x44, 0x86, 0x57, 0xc0, 0x0c, 0x06, 0xed, 0xa9, 0x8d, 0xe4, 0xac, 0x18, 0x55, 0xc5, 0xaa, 0x54, 0xb9, 0xc5, 0x6f, 0x60, 0xf6, 0x81, 0xd4, 0x1c, 0xa2, 0x18, 0xa7, 0xd4, 0x45, 0xf1, 0x47, 0x00, 0xed, 0x6c, 0xdc, 0x93, 0x45, 0x1f, 0xc4, 0xa4, 0x1a, 0xaf, 0xd8, 0x1a, 0xe4, 0x66, 0xb0, 0x54, 0x36, 0xe5, 0xf7, 0x50, 0x9e, 0x31, 0x04, 0x7c, 0x7f, 0x25, 0x23, 0xa6, 0xe9, 0xc6, 0xa2, 0x37, 0xb6, 0xa6, 0x3e, 0x42, 0xf9, 0x9d, 0xfa, 0xc3, 0xf7, 0x00, 0x4c, 0x9f, 0x42, 0x74, 0x47, 0xf4, 0x5d, 0xb6, 0xe7, 0x83, 0xc1, 0xda, 0x9a, 0x0e, 0xcf, 0x79, 0x6a, 0xc8, 0x26, 0xbc, 0x52, 0x5d, 0x14, 0xbf, 0x85, 0xf9, 0x29, 0xf4, 0xa1, 0x49, 0x3f, 0xe8, 0xe4, 0xd6, 0xd4, 0x2f, 0xb0, 0x50, 0x18, 0x5a, 0x67, 0x03, 0x72, 0x01, 0x73, 0xed, 0x71, 0x1f, 0xb1, 0x3f, 0xb9, 0x50, 0x83, 0xe4, 0x12, 0x58, 0x56, 0x66, 0xba, 0xcb, 0xd6, 0xff, 0x65, 0x56, 0xa5, 0xca, 0x1f, 0xac, 0x9f, 0xe1, 0x7a, 0x77, 0xa0, 0xb6, 0x25, 0xdb, 0xec, 0xd0, 0x9f, 0x49, 0x23, 0x97, 0xb0, 0xdc, 0xa4, 0x6d, 0x79, 0xff, 0xbf, 0x56, 0xdc, 0x95, 0x72, 0x40, 0xa9, 0xff, 0xbd, 0xcd, 0xd2, 0x8f, 0x3d, 0x7d, 0x05, 0x00, 0x00, 0xff, 0xff, 0x84, 0x5c, 0xa4, 0x06, 0xc6, 0x01, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. var _ context.Context var _ grpc.ClientConn // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. const _ = grpc.SupportPackageIsVersion4 // ShippingServiceClient is the client API for ShippingService service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type ShippingServiceClient interface { CreateConsignment(ctx context.Context, in *Consignment, opts ...grpc.CallOption) (*Response, error) } type shippingServiceClient struct { cc *grpc.ClientConn } func NewShippingServiceClient(cc *grpc.ClientConn) ShippingServiceClient { return &shippingServiceClient{cc} } func (c *shippingServiceClient) CreateConsignment(ctx context.Context, in *Consignment, opts ...grpc.CallOption) (*Response, error) { out := new(Response) err := c.cc.Invoke(ctx, "/ShippingService/CreateConsignment", in, out, opts...) if err != nil { return nil, err } return out, nil } // ShippingServiceServer is the server API for ShippingService service. type ShippingServiceServer interface { CreateConsignment(context.Context, *Consignment) (*Response, error) } func RegisterShippingServiceServer(s *grpc.Server, srv ShippingServiceServer) { s.RegisterService(&_ShippingService_serviceDesc, srv) } func _ShippingService_CreateConsignment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(Consignment) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(ShippingServiceServer).CreateConsignment(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/ShippingService/CreateConsignment", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ShippingServiceServer).CreateConsignment(ctx, req.(*Consignment)) } return interceptor(ctx, in, info, handler) } var _ShippingService_serviceDesc = grpc.ServiceDesc{ ServiceName: "ShippingService", HandlerType: (*ShippingServiceServer)(nil), Methods: []grpc.MethodDesc{ { MethodName: "CreateConsignment", Handler: _ShippingService_CreateConsignment_Handler, }, }, Streams: []grpc.StreamDesc{}, Metadata: "consignment.proto", } 

рдЕрдЧрд░, рддреЛ рдХреБрдЫ рдЧрд▓рдд рд╣реБрдЖред рддрд░реНрдХреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ-рдореИрдВ рд╡рд╣ рдкрде рд╣реИ рдЬрд╣рд╛рдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИ, --go_out рдЬрд╣рд╛рдВ рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдИ рдЬрд╛рдПрдЧреАред рд╣рдореЗрд╢рд╛ рдорджрдж рд╣реИ


 $ protoc -h 

рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ gRPC / protobuf рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХреЛрдб рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ protobuf рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХреЗрдВред


рд╣рдо main.go рд▓рд┐рдЦреЗрдВрдЧреЗ


main.go
 package seaport import ( "log" "net" //    pbf "seaport/consignment" "golang.org/x/net/context" "google.golang.org/grpc" "google.golang.org/grpc/reflection" ) const ( port = ":50051" ) //IRepository -   type IRepository interface { Create(*pbf.Consignment) (*pbf.Consignment, error) } // Repository -    , //        type Repository struct { consignments []*pbf.Consignment } //Create -    func (repo *Repository) Create(consignment *pbf.Consignment) (*pbf.Consignment, error) { updated := append(repo.consignments, consignment) repo.consignments = updated return consignment, nil } //         //       .     //         . . type service struct { repo IRepository } // CreateConsignment -        , //    create,      //     gRPC. func (s *service) CreateConsignment(ctx context.Context, req *pbf.Consignment) (*pbf.Response, error) { //      consignment, err := s.repo.Create(req) if err != nil { return nil, err } //   `Response`, //        return &pbf.Response{Created: true, Consignment: consignment}, nil } func main() { repo := &Repository{} //   gRPC    tcp lis, err := net.Listen("tcp", port) if err != nil { log.Fatalf("failed to listen: %v", err) } s := grpc.NewServer() //      gRPC,    //        //  `Response`,       pbf.RegisterShippingServiceServer(s, &service{repo}) //      gRPC. reflection.Register(s) if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } } 

рдХреГрдкрдпрд╛ рдХреЛрдб рдореЗрдВ рдЫреЛрдбрд╝реА рдЧрдИ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рдкрдврд╝реЗрдВред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣рд╛рдВ рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рддрд░реНрдХ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░реЗ gRPC рддрд░реАрдХреЗ рдЙрддреНрдкрдиреНрди рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рддрдЪреАрдд рдХрд░рддреЗ рд╣реИрдВ, рдкреЛрд░реНрдЯ 50051 рдкрд░ рдПрдХ рдирдпрд╛ gRPC рд╕рд░реНрд╡рд░ рдмрдирд╛рддреЗ рд╣реИрдВред рдЕрдм рд╣рдорд╛рд░реА gRPC рд╕реЗрд╡рд╛ рд╡рд╣рд╛рдВ рд░рд╣реЗрдЧреАред
рдЖрдк рдЗрд╕реЗ $ go рд░рди main.go рдХреЗ рд╕рд╛рде рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдиреЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ рдФрд░ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗ ... рддреЛ, рдЪрд▓рд┐рдП рдЗрд╕реЗ рдПрдХреНрд╢рди рдореЗрдВ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдирд╛рддреЗ рд╣реИрдВред


рдЖрдЗрдП рдПрдХ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдПрдВ рдЬреЛ рдПрдХ JSON рдлрд╝рд╛рдЗрд▓ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реА gRPC рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИред


рд░реВрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ $ mkdir рдХрдВрд╕рд╛рдЗрдирдореЗрдВрдЯ-рдХреНрд▓реА рдХрд╛ рдПрдХ рдирдпрд╛ рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдВред рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ, рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ cli.go рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:


cli.go
 package main import ( "encoding/json" "io/ioutil" "log" "os" pbf "seaport/consignment" "golang.org/x/net/context" "google.golang.org/grpc" ) const ( address = "localhost:50051" defaultFilename = "consignment.json" ) //    func parseFile(file string) (*pbf.Consignment, error) { var consignment *pbf.Consignment data, err := ioutil.ReadFile(file) if err != nil { return nil, err } json.Unmarshal(data, &consignment) return consignment, err } func main() { //     conn, err := grpc.Dial(address, grpc.WithInsecure()) if err != nil { log.Fatalf("  : %v", err) } defer conn.Close() client := pbf.NewShippingServiceClient(conn) //    consignment.json, //          file := defaultFilename if len(os.Args) > 1 { file = os.Args[1] } consignment, err := parseFile(file) if err != nil { log.Fatalf("   : %v", err) } r, err := client.CreateConsignment(context.Background(), consignment) if err != nil { log.Fatalf("  : %v", err) } log.Printf(": %t", r.Created) } 

рдЕрдм рдПрдХ рдмреИрдЪ (рдХрдВрд╕рд╛рдЗрдирдореЗрдВрдЯ-рдХреНрд▓реА / рдХрдВрд╕рд╛рдЗрдирдореЗрдВрдЯ.рдЬреЙрди) рдмрдирд╛рдПрдВ:


 { "description": "  ", "weight": 100, "containers": [ { "customer_id": "_001", "user_id": "_001", "origin": " " } ], "vessel_id": "_001" } 

рдЕрдм, рдпрджрд┐ рдЖрдк рдмрдВрджрд░рдЧрд╛рд╣ рдкреИрдХреЗрдЬ рд╕реЗ $ go run main.go рдЪрд▓рд╛рддреЗ рд╣реИрдВ , рдФрд░ рдлрд┐рд░ $ go run cli.go рдХреЛ рдПрдХ рдЕрд▓рдЧ рдЯрд░реНрдорд┐рдирд▓ рдкреИрдирд▓ рдореЗрдВ рдЪрд▓рд╛рддреЗ рд╣реИрдВ ред рдЖрдкрдХреЛ рд╕рдВрджреЗрд╢ "рдмрдирд╛рдпрд╛ рдЧрдпрд╛: рд╕рддреНрдп" рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд▓реЗрдХрд┐рди рд╣рдо рдХреИрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛? рдЖрдЗрдП GetConsignments рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА рд╕реЗрд╡рд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдмрдирд╛рдП рдЧрдП рд╕рднреА рдмреИрдЪреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХреЗрдВред


consigment.proto
 //consigment.proto syntax = "proto3"; service ShippingService{ rpc CreateConsignment(Consignment) returns (Response) {} //    rpc GetConsignments(GetRequest) returns (Response) {} } message Consignment { int32 id = 1; string description = 2; int32 weight = 3; repeated Container containers = 4; string vessel_id = 5; } message Container { int32 id =1; string customer_id =2; string origin = 3; string user_id = 4; } //    message GetRequest {} message Response { bool created = 1; Consignment consignment = 2; //     //     repeated Consignment consignments = 3; } 

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


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


 //seaport/main.go //IRepository -   type IRepository interface { Create(*pbf.Consignment) (*pbf.Consignment, error) GetAll() []*pbf.Consignment } //GetAll -       func (repo *Repository) GetAll() []*pbf.Consignment { return repo.consignments } //GetConsignments -         func (s *service) GetConsignments(ctx context.Context, req *pbf.GetRequest) (*pbf.Response, error) { consignments := s.repo.GetAll() return &pbf.Response{Consignments: consignments}, nil } 

рдпрд╣рд╛рдБ рд╣рдордиреЗ рдЕрдкрдиреА рдирдИ GetConsignments рд╡рд┐рдзрд┐ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рд╣реИ, рдХреНрд░рдорд╢рдГ рдЦреЗрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдк $ go рд░рди main.go рдХреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ , рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред


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


cli.go
 package main import ( "encoding/json" "io/ioutil" "log" "os" pbf "seaport/consignment" "golang.org/x/net/context" "google.golang.org/grpc" ) const ( address = "localhost:50051" defaultFilename = "consignment.json" ) //    func parseFile(file string) (*pbf.Consignment, error) { var consignment *pbf.Consignment data, err := ioutil.ReadFile(file) if err != nil { return nil, err } json.Unmarshal(data, &consignment) return consignment, err } func main() { //     conn, err := grpc.Dial(address, grpc.WithInsecure()) if err != nil { log.Fatalf("  : %v", err) } defer conn.Close() client := pbf.NewShippingServiceClient(conn) //    consignment.json, //          file := defaultFilename if len(os.Args) > 1 { file = os.Args[1] } consignment, err := parseFile(file) if err != nil { log.Fatalf("   : %v", err) } r, err := client.CreateConsignment(context.Background(), consignment) if err != nil { log.Fatalf("  : %v", err) } log.Printf(": %t", r.Created) getAll, err := client.GetConsignments(context.Background(), &pbf.GetRequest{}) if err != nil { log.Fatalf("    : %v", err) } for _, cns := range getAll.Consignments { fmt.Printf("Id: %v\n", cns.GetId()) fmt.Printf("Description: %v\n", cns.GetDescription()) fmt.Printf("Weight: %d\n", cns.GetWeight()) fmt.Printf("VesselId: %v\n", cns.GetVesselId()) for _, cnt := range cns.GetContainers() { fmt.Printf("\tId: %v\n", cnt.GetId()) fmt.Printf("\tUserId: %v\n", cnt.GetUserId()) fmt.Printf("\tCustomerId: %v\n", cnt.GetCustomerId()) fmt.Printf("\tOrigin: %v\n", cnt.GetOrigin()) } } } 

рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ cli.go рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдФрд░ $ go run cli.go рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдПрдБ ред рдХреНрд▓рд╛рдЗрдВрдЯ CreateConsignment рдЪрд▓рд╛рдПрдЧрд╛ рдФрд░ рдлрд┐рд░ GetConsignments рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред рдФрд░ рдЖрдкрдХреЛ рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЙрддреНрддрд░ рд╕реВрдЪреА рдореЗрдВ рдкрд╛рд░реНрдЯреА рдХреА рд░рдЪрдирд╛ рд╣реИред


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


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

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


All Articles