рдЧреЛрд▓рдВрдЧ рдФрд░ gRPC рдкрд░ рдПрдХ рдорд╛рдЗрдХреНрд░реЛрд╕реИрдХреЗрдпрд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг, рднрд╛рдЧ 2 (docker)

рдпрд╣ рдХрдВрдЯреЗрдирд░реЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ


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

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

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



рдкрд╣рд▓рд╛ рднрд╛рдЧ
рдореВрд▓ рдЗрд╡рд╛рдирд╡реИрд▓реЗрдВрдЯрд╛рдЗрди рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА
рдореВрд▓ рд▓реЗрдЦ

Dockerfile рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗрдВ:

FROM alpine:latest RUN mkdir /app WORKDIR /app ADD consignment-service /app/consignment-service CMD ["./consignment-service"] 

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

рдЕрдм, Docker рдЗрдореЗрдЬ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ Makefile рдХреЗ рдмрд┐рд▓реНрдб рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред

 build: ... GOOS=linux GOARCH=amd64 go build docker build -t consignment . 

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

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

рдореИрдВ рд╣рдорд╛рд░реЗ Makefile рдореЗрдВ рдПрдХ рдирдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЬреЛрдбрд╝рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ:

 run: docker run -p 50051:50051 shippy-service-consignment 

рдпрд╣рд╛рдБ рд╣рдо рдкреЛрд░реНрдЯ релрежрежрелрез рдЦреЛрд▓рдХрд░ рдЕрдкрдиреА рдбреЙрдХ рдЗрдореЗрдЬ рдмрдирд╛рддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рдбреЙрдХрд░ рдПрдХ рдЕрд▓рдЧ рдиреЗрдЯрд╡рд░реНрдХ рд▓реЗрдпрд░ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдкреЛрд░реНрдЯ рдХреЛ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдкреЛрд░реНрдЯ 8080 рдкрд░ рдпрд╣ рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ -p рддрд░реНрдХ рдХреЛ 8080: 50051 рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдк -d рдзреНрд╡рдЬ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдХреЗ рдХрдВрдЯреЗрдирд░ рдХреЛ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рднреА рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, docker рд░рди -d -p 50051: 50051 рдЦреЗрдк-рд╕реЗрд╡рд╛ ред

$ рдореЗрдХ рд░рди рдЪрд▓рд╛рдПрдВ , рдлрд┐рд░ рдПрдХ рдЕрд▓рдЧ рдЯрд░реНрдорд┐рдирд▓ рдкреИрдирд▓ рдореЗрдВ $ рдлрд┐рд░ рд╕реЗ рд░рди рдореЗрди.рдУрдЧреЛ рдФрд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдпрд╣ рдЕрднреА рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЬрдм рдЖрдк $ docker рдмрд┐рд▓реНрдб рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрдореЗрдЬ рдореЗрдВ рдЕрдкрдирд╛ рдХреЛрдб рдФрд░ рд░рдирдЯрд╛рдЗрдо рдПрдореНрдмреЗрдб рдХрд░рддреЗ рд╣реИрдВред рдбреЙрдХрд░ рдЫрд╡рд┐рдпрд╛рдВ рдЖрдкрдХреЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдФрд░ рдЗрд╕рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдкреЛрд░реНрдЯреЗрдмрд▓ рдЫрд╡рд┐рдпрд╛рдВ рд╣реИрдВред рдЖрдк Docker рдЪрд┐рддреНрд░ рдХреЛ Docker Hub рдкрд░ рдкреЛрд╕реНрдЯ рдХрд░рдХреЗ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬреЛ рдХрд┐ npm рдпрд╛ yum рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд╕рдорд╛рди рд╣реИ docker images рдХреЗ рд▓рд┐рдПред рдЬрдм рдЖрдк рдЕрдкрдиреЗ Dockerfile рдореЗрдВ FROM рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк Docker рдХреЛ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП Docker рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдЗрд╕ рдЫрд╡рд┐ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВред рдлрд┐рд░ рдЖрдк рдЗрд╕ рдЖрдзрд╛рд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдФрд░ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреА рдЗрдЪреНрдЫрд╛рдиреБрд╕рд╛рд░ рдкреБрди: рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдЕрдкрдиреА рдбреЙрдХ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдмреЗрдЭрд┐рдЭрдХ рдбреЙрдХрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд░реЗрдВ рдФрд░ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреЛ рдкрд╣рд▓реЗ рд╣реА рдХрдВрдЯреЗрдирд░реЛрдВ рдореЗрдВ рдкреИрдХ рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред рдХреБрдЫ рдмрд╣реБрдд рд╣реА рдЕрджреНрднреБрдд рдЪреАрдЬреЗрдВ рдбреЙрдХрдЯрд░рд╛рдЗрдЬ рдХреА рдЧрдИрдВред

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

рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд! рдЖрдЗрдП рдЕрдкрдиреЗ рдХреЛрдб рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред

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

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

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

рдорд╛рдЗрдХреНрд░реЛ рдЬрд╛рдУ


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

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

рдЧреЛ-рдорд╛рдЗрдХреНрд░реЛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЕрдкрдиреА рд╕реЗрд╡рд╛ рдореЗрдВ рдХрдИ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗред Go-micro рдПрдХ Protoc рдкреНрд▓рдЧрдЗрди рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХреАрдХреГрдд рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдорд╛рдирдХ gRPC рдкреНрд▓рдЧрдЗрди рдХреА рдЬрдЧрд╣ рд▓реЗ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рддреЛ, рдЪрд▓рд┐рдП рдЗрд╕реЗ рд╣рдорд╛рд░реЗ Makefile рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдЧреЛ-рдорд╛рдЗрдХреНрд░реЛ рдирд┐рд░реНрднрд░рддрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ:

 go get -u github.com/micro/protobuf/{proto,protoc-gen-go} 

GRPC рдкреНрд▓рдЧрдЗрди рдХреЗ рдмрдЬрд╛рдп рдЧреЛ-рдорд╛рдЗрдХреНрд░реЛ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ Makefile рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ:

 build: protoc -I. --go_out=plugins=micro:. \ proto/consignment/consignment.proto GOOS=linux GOARCH=amd64 go build docker build -t consignment . run: docker run -p 50051:50051 shippy-service-consignment 

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

shippy-service-consignment / main.go
 // shippy-service-consignment/main.go package main import ( "fmt" //  protobuf  pb "github.com/EwanValentine/shippy/consignment-service/proto/consignment" "github.com/micro/go-micro" "context" ) //repository -   type repository interface { Create(*pb.Consignment) (*pb.Consignment, error) GetAll() []*pb.Consignment } // Repository -    , //       type Repository struct { consignments []*pb.Consignment } func (repo *Repository) Create(consignment *pb.Consignment) (*pb.Consignment, error) { updated := append(repo.consignments, consignment) repo.consignments = updated return consignment, nil } func (repo *Repository) GetAll() []*pb.Consignment { return repo.consignments } //         //       proto. //           . type service struct { repo repository } // CreateConsignment -        , //    create,      //     gRPC. func (s *service) CreateConsignment(ctx context.Context, req *pb.Consignment, res *pb.Response) error { // Save our consignment consignment, err := s.repo.Create(req) if err != nil { return err } // Return matching the `Response` message we created in our // protobuf definition. res.Created = true res.Consignment = consignment return nil } //GetConsignments -         func (s *service) GetConsignments(ctx context.Context, req *pb.GetRequest, res *pb.Response) error { consignments := s.repo.GetAll() res.Consignments = consignments return nil } func main() { repo := &Repository{} //     Go-micro srv := micro.NewService( //           proto micro.Name("shippy.service.consignment"), ) // Init will parse the command line flags. srv.Init() //   pb.RegisterShippingServiceHandler(srv.Server(), &service{repo}) //   log.Println(" ") if err := srv.Run(); err != nil { fmt.Println(err) } } 


рдпрд╣рд╛рдБ рдореБрдЦреНрдп рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рдо рдЕрдкрдиреЗ gRPC рд╕рд░реНрд╡рд░ рдХреЛ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ mico.NewService () рд╕реЗ рдмрдбрд╝реЗ рдХрд░реАрдиреЗ рд╕реЗ рд╕рд╛рд░рдЧрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рдХреЗ рдкрдВрдЬреАрдХрд░рдг рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╕реЗрд╡рд╛ред Run () рдлрд╝рдВрдХреНрд╢рди, рдЬреЛ рдХрдиреЗрдХреНрд╢рди рдХреЛ рд╕реНрд╡рдпрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗред

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

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

рдЖрдЗрдП рдЗрд╕реЗ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ Makefile рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред

 build: protoc -I. --go_out=plugins=micro:. \ proto/consignment/consignment.proto GOOS=linux GOARCH=amd64 go build docker build -t consignment . run: docker run -p 50051:50051 \ -e MICRO_SERVER_ADDRESS=:50051 \ shippy-service-consignment 

-рд╡рд╣ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХрд╛ рдзреНрд╡рдЬ рд╣реИ, рдпрд╣ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЧреЛрджреА рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдзреНрд╡рдЬ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП -E ENV = рд╕реНрдЯреЗрдЬрд┐рдВрдЧ -e DB_HOST = рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ, рдЖрджрд┐ред

рдЕрдм, рдпрджрд┐ рдЖрдк $ рдореЗрдХ рд░рди рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реЗрд╡рд╛ рдЦреЛрдЬ рдХреЗ рд╕рд╛рде Dockerised рд╕реЗрд╡рд╛ рд╣реЛрдЧреАред рддреЛ, рдЪрд▓рд┐рдП рдЗрд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ Cli рдЯреВрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВред

рдЦреЗрдк-CLI
 package main import ( "encoding/json" "io/ioutil" "log" "os" "context" pb "github.com/EwanValentine/shippy-service-consignment/proto/consignment" micro "github.com/micro/go-micro" ) const ( address = "localhost:50051" defaultFilename = "consignment.json" ) func parseFile(file string) (*pb.Consignment, error) { var consignment *pb.Consignment data, err := ioutil.ReadFile(file) if err != nil { return nil, err } json.Unmarshal(data, &consignment) return consignment, err } func main() { service := micro.NewService(micro.Name("shippy.cli.consignment")) service.Init() client := pb.NewShippingServiceClient("shippy.service.consignment", service.Client()) // Contact the server and print out its response. file := defaultFilename if len(os.Args) > 1 { file = os.Args[1] } consignment, err := parseFile(file) if err != nil { log.Fatalf("Could not parse file: %v", err) } r, err := client.CreateConsignment(context.Background(), consignment) if err != nil { log.Fatalf("Could not greet: %v", err) } log.Printf("Created: %t", r.Created) getAll, err := client.GetConsignments(context.Background(), &pb.GetRequest{}) if err != nil { log.Fatalf("Could not list consignments: %v", err) } for _, v := range getAll.Consignments { log.Println(v) } } 


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

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

 build: GOOS=linux GOARCH=amd64 go build docker build -t shippy-cli-consignment . run: docker run shippy-cli-consignment 

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

рдЕрдм рд╣рдорд╛рд░реЗ CLI рдЯреВрд▓ рдХреЗ рд▓рд┐рдП Dockerfile рдмрдирд╛рддреЗ рд╣реИрдВ:

 FROM alpine:latest RUN mkdir -p /app WORKDIR /app ADD consignment.json /app/consignment.json ADD consignment-cli /app/consignment-cli CMD ["./shippy-cli-consignment"] 

рдпрд╣ рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ Dockerfile рд╕реЗ рдмрд╣реБрдд рдорд┐рд▓рддреА-рдЬреБрд▓рддреА рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ рд╣рдорд╛рд░реА json рдбреЗрдЯрд╛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рднреА рдирд┐рдХрд╛рд▓рддреА рд╣реИред

рдЕрдм рдЬрдм рдЖрдк $ $ рдореЗрдХ рд░рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдкрдиреЗ рд╢рд┐рдкреНрдкреА-рдХреНрд▓реА-рдХрдВрд╕рд╛рдЗрдирдореЗрдВрдЯ рдореЗрдВ, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЬреИрд╕рд╛ рд╣реА рдмрдирд╛ рд╣реБрдЖ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

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

рдпрд╣ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрдкрдиреА рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рднреА рд╕рд╣реА рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реА рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЪрд▓реЛ рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдореИрдВ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╡рд┐рд╕реНрддреГрдд рдЯрд┐рдкреНрдкрдгреА рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛:
рдЦреЗрдк-рд╕реЗрд╡рд╛ / Dockerfile
 # consignment-service/Dockerfile #     golang,    #     .    `as builder`, #     ,      . FROM golang:alpine as builder RUN apk --no-cache add git #         gopath WORKDIR /app/shippy-service-consignment #       COPY . . RUN go mod download #     ,   #       Alpine. RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o shippy-service-consignment #      FROM, #   Docker        . FROM alpine:latest # ,    -     RUN apk --no-cache add ca-certificates #   ,     . RUN mkdir /app WORKDIR /app #   ,       , #         `builder` #       , #    ,    , #      . ! COPY --from=builder /app/shippy-service-consignment/shippy-service-consignment . #     !        #        # run time . CMD ["./shippy-service-consignment"] 


рдЕрдм рдореИрдВ рдЕрдиреНрдп рдбреЙрдХрд░ рдлрд╛рдЗрд▓реЛрдВ рдХреА рдУрд░ рдмрдврд╝реВрдВрдЧрд╛ рдФрд░ рдЗрд╕ рдирдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЕрдкрдирд╛рдКрдВрдЧрд╛ред рдУрд╣, рдФрд░ рдЕрдкрдиреЗ Makefiles рд╕реЗ $ рдЬрд╛рдУ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛!

рдЬрд╣рд╛рдЬ рдХреА рд╕реЗрд╡рд╛


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

рдЕрдкрдиреЗ $ mkdir рдкреЛрдд-рд╕реЗрд╡рд╛ рд░реВрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдирдИ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдВ, рдЕрдм рд╣рдорд╛рд░реА рдирдИ рдкреНрд░реЛрдЯреЛрдмреЙрдлрд╝ рд╕реЗрд╡рд╛рдУрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛, $ mkdir -p shippy-service-port / proto / рдкреЛрдд рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдБред рдЕрдм рдПрдХ рдирдИ рдкреНрд░реЛрдЯреЛрдмреЙрдлрд╝ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ, $ рдЯрдЪ рд╢рд┐рдкреНрдкреА-рд╕рд░реНрд╡рд┐рд╕-рдкреЛрдд / рдкреНрд░реЛрдЯреЛ / рдкреЛрдд / рдкреЛрдд.рдкреНрд░реЛрдЯреЛ ред

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

рдкреЛрдд / рдкреЛрдд редproto
 // shippy-service-vessel/proto/vessel/vessel.proto syntax = "proto3"; package vessel; service VesselService { rpc FindAvailable(Specification) returns (Response) {} } message Vessel { string id = 1; int32 capacity = 2; int32 max_weight = 3; string name = 4; bool available = 5; string owner_id = 6; } message Specification { int32 capacity = 1; int32 max_weight = 2; } message Response { Vessel vessel = 1; repeated Vessel vessels = 2; } 


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

рдЕрдм рд╣рдореЗрдВ рдЕрдкрдиреЗ рдмрд┐рд▓реНрдб рд▓реЙрдЬрд┐рдХ рдФрд░ рд╣рдорд╛рд░реА рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЗрдХрдлрд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред $ рд╕реНрдкрд░реНрд╢ рд╢рд┐рдкреНрдкреА-рд╕реЗрд╡рд╛-рдкреЛрдд / рдореЗрдХрдлрд╛рдЗрд▓ ред рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗрдВ:

 // vessel-service/Makefile build: protoc -I. --go_out=plugins=micro:. \ proto/vessel/vessel.proto docker build -t shippy-service-vessel . run: docker run -p 50052:50051 -e MICRO_SERVER_ADDRESS=:50051 shippy-service-vessel 

рдпрд╣ рд╣рдорд╛рд░реА рдХрдВрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдП рдЧрдП рдкрд╣рд▓реЗ рдореЗрдХрдлрд╛рдЗрд▓ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реЗрд╡рд╛рдУрдВ рдФрд░ рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдХреЗ рдирд╛рдо рдереЛрдбрд╝рд╛ рдмрджрд▓ рдЧрдП рд╣реИрдВред рд╣рдо рдПрдХ рд╣реА рдкреЛрд░реНрдЯ рдкрд░ рджреЛ рдбреЙрдХ рдХрдВрдЯреЗрдирд░ рд▓реЙрдиреНрдЪ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдбреЙрдХрд░реНрд╕ рдкреЛрд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рд╕реЗрд╡рд╛ рдореЗрдЬрдмрд╛рди рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ 50051 рд╕реЗ 50052 рддрдХ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рд╣реЛ рдЬрд╛рдПред

рдЕрдм рд╣рдореЗрдВ рдЕрдкрдиреЗ рдирдП рдмрд╣реБ-рдордВрдЪ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЙрдХрдлрд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 # vessel-service/Dockerfile FROM golang:alpine as builder RUN apk --no-cache add git WORKDIR /app/shippy-service-vessel COPY . . RUN go mod download RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o shippy-service-vessel FROM alpine:latest RUN apk --no-cache add ca-certificates RUN mkdir /app WORKDIR /app COPY --from=builder /app/shippy-service-vessel . CMD ["./shippy-service-vessel"] 

рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЕрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

рдкреЛрдд-рд╕реЗрд╡рд╛ / main.go
 // vessel-service/main.go package main import ( "context" "errors" "fmt" pb "github.com/EwanValentine/shippy/vessel-service/proto/vessel" "github.com/micro/go-micro" ) type Repository interface { FindAvailable(*pb.Specification) (*pb.Vessel, error) } type VesselRepository struct { vessels []*pb.Vessel } // FindAvailable -     , //           , //      . func (repo *VesselRepository) FindAvailable(spec *pb.Specification) (*pb.Vessel, error) { for _, vessel := range repo.vessels { if spec.Capacity <= vessel.Capacity && spec.MaxWeight <= vessel.MaxWeight { return vessel, nil } } //     return nil, errors.New("     ") } //    grpc type service struct { repo repository } func (s *service) FindAvailable(ctx context.Context, req *pb.Specification, res *pb.Response) error { //     vessel, err := s.repo.FindAvailable(req) if err != nil { return err } //       res.Vessel = vessel return nil } func main() { vessels := []*pb.Vessel{ &pb.Vessel{Id: "vessel001", Name: "Boaty McBoatface", MaxWeight: 200000, Capacity: 500}, } repo := &VesselRepository{vessels} srv := micro.NewService( micro.Name("shippy.service.vessel"), ) srv.Init() //    pb.RegisterVesselServiceHandler(srv.Server(), &service{repo}) if err := srv.Run(); err != nil { fmt.Println(err) } } 


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

shippy / рдЦреЗрдк-рд╕реЗрд╡рд╛ / main.go
 package main import ( "context" "fmt" "log" "sync" pb "github.com/EwanValentine/shippy-service-consignment/proto/consignment" vesselProto "github.com/EwanValentine/shippy-service-vessel/proto/vessel" "github.com/micro/go-micro" ) const ( port = ":50051" ) type repository interface { Create(*pb.Consignment) (*pb.Consignment, error) GetAll() []*pb.Consignment } // Repository -    , //       type Repository struct { mu sync.RWMutex consignments []*pb.Consignment } //Create -     func (repo *Repository) Create(consignment *pb.Consignment) (*pb.Consignment, error) { repo.mu.Lock() updated := append(repo.consignments, consignment) repo.consignments = updated repo.mu.Unlock() return consignment, nil } //GetAll -       func (repo *Repository) GetAll() []*pb.Consignment { return repo.consignments } //         //       proto. //            type service struct { repo repository vesselClient vesselProto.VesselServiceClient } // CreateConsignment -         create, //     ,     gRPC. func (s *service) CreateConsignment(ctx context.Context, req *pb.Consignment, res *pb.Response) error { //         , //    vesselResponse, err := s.vesselClient.FindAvailable(context.Background(), &vesselProto.Specification{ MaxWeight: req.Weight, Capacity: int32(len(req.Containers)), }) log.Printf(" : %s \n", vesselResponse.Vessel.Name) if err != nil { return err } //     id  req.VesselId = vesselResponse.Vessel.Id //      consignment, err := s.repo.Create(req) if err != nil { return err } res.Created = true res.Consignment = consignment return nil } // GetConsignments -         func (s *service) GetConsignments(ctx context.Context, req *pb.GetRequest, res *pb.Response) error { consignments := s.repo.GetAll() res.Consignments = consignments return nil } func main() { //   repo := &Repository{} //  micro srv := micro.NewService( micro.Name("shippy.service.consignment"), ) srv.Init() vesselClient := vesselProto.NewVesselServiceClient("shippy.service.vessel", srv.Client()) //      gRPC. pb.RegisterShippingServiceHandler(srv.Server(), &service{repo, vesselClient}) //   if err := srv.Run(); err != nil { fmt.Println(err) } } 


рдпрд╣рд╛рдВ рд╣рдордиреЗ рдЕрдкрдиреА рдЬрд╣рд╛рдЬ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛, рдЬреЛ рд╣рдореЗрдВ рд╕реЗрд╡рд╛ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред shipy.service.vessel рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╣рд╛рдЬ рдХреА рд╕реЗрд╡рд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдФрд░ рдЙрд╕рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПредрдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдзрд┐ (FindAvailable)ред рд╣рдо рдЬрд╣рд╛рдЬ рдХреЗ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрдВрдЯреЗрдирд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдмреИрдЪ рд╡рдЬрди рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЬреЛ рд╣рдореЗрдВ рдЗрд╕ рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдХреЗ рдЕрдиреБрд░реВрдк рдкреЛрдд рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рдЦреЗрдк-рдХреНрд▓реА / consignment.json рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ, рд╣рд╛рд░реНрдб-рдХреЛрдбреЗрдб рдЬрд╣рд╛рдЬ_рдЖрдИрдбреА рдХреЛ рд╣рдЯрд╛рдПрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдкреБрд╖реНрдЯрд┐ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реА рдЬрд╣рд╛рдЬ рдЦреЛрдЬ рд╕реЗрд╡рд╛ рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪрд▓реЛ рдХреБрдЫ рдФрд░ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рд╡рдЬрди рдмрдврд╝рд╛рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 { "description": "  ", "weight": 55000, "containers": [ { "customer_id": "_001", "user_id": "_001", "origin": "--" }, { "customer_id": "_002", "user_id": "_001", "origin": "" }, { "customer_id": "_003", "user_id": "_001", "origin": "" } ] } 

рдЕрдм рдХрдВрд╕рд╛рдЗрдирдореЗрдВрдЯ-рдХреНрд▓реА рдореЗрдВ $ рдореЗрдХ рдмрд┐рд▓реНрдб && рдореЗрдХ рд░рди рдЪрд▓рд╛рдПрдВ ред рдЖрдкрдХреЛ рдмрдирд╛рдП рдЧрдП рд╕рд╛рдорд╛рдиреЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдПрдХ рдЙрддреНрддрд░ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдкрдиреА рдкрд╛рд░реНрдЯрд┐рдпреЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдмрд░реНрддрди_рдЖрдИрдбреА рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рд╣реИред

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

рднрд╛рдЧ I
рдореВрд▓ рдЗрд╡рд╛рдирд╡реИрд▓реЗрдВрдЯрд╛рдЗрди рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА

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


All Articles