рдпрд╣ рдХрдВрдЯреЗрдирд░реЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдирд╡реАрдирддрдо рд▓рд┐рдирдХреНрд╕ рдЕрд▓реНрдкрд╛рдЗрди рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд▓рд┐рдирдХреНрд╕ рдЕрд▓реНрдкрд╛рдЗрди рдПрдХ рд╣рд▓реНрдХрд╛ рд▓рд┐рдирдХреНрд╕ рд╡рд┐рддрд░рдг рд╣реИ рдЬрд┐рд╕реЗ рдбреЙрдХрд░ рдореЗрдВ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдФрд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд▓рд┐рдирдХреНрд╕ рдЕрд▓реНрдкрд╛рдЗрди рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд┐рд░реНрднрд░рддрд╛ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЫрд╡рд┐ рдХрд╛ рдЖрдХрд╛рд░ рд▓рдЧрднрдЧ 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 рдпрд╣рд╛рдБ рдореБрдЦреНрдп рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рдо рдЕрдкрдиреЗ 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())
рдпрд╣рд╛рдВ, рд╣рдордиреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛ-рдорд╛рдЗрдХреНрд░реЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдХреЛ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдФрд░ рдореМрдЬреВрджрд╛ рдХрдиреЗрдХреНрд╢рди рдХреЛрдб рдХреЛ рдЧреЛ-рдорд╛рдЗрдХреНрд░реЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛, рдЬреЛ рдкрддреЗ рд╕реЗ рд╕реАрдзреЗ рдЬреБрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕реЗрд╡рд╛ рдХреА рдЕрдиреБрдорддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрдм рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЕрдкрдиреА рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ 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 рдЕрдм рджрд┐рд▓рдЪрд╕реНрдк рднрд╛рдЧ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред рдЬрдм рд╣рдо рдПрдХ рдЦреЗрдк рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЬрд╣рд╛рдЬ рдЦреЛрдЬ рд╕реЗрд╡рд╛ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдиреЗ, рдЬрд╣рд╛рдЬ рдЦреЛрдЬрдиреЗ рдФрд░ рдирд┐рд░реНрдорд┐рдд рдЦреЗрдк рдореЗрдВ рд╢рд┐рдк_рдб рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдХрд╛рд░реНрдЧреЛ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд╕реЗрд╡рд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:
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 }
рдпрд╣рд╛рдВ рд╣рдордиреЗ рдЕрдкрдиреА рдЬрд╣рд╛рдЬ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛, рдЬреЛ рд╣рдореЗрдВ рд╕реЗрд╡рд╛ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред 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рдореВрд▓ рдЗрд╡рд╛рдирд╡реИрд▓реЗрдВрдЯрд╛рдЗрди рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА