เบฎเบฝเบ™โ€‹เบฎเบนเป‰โ€‹เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰ microservicesโ€‹. เบชเปˆเบงเบ™เบ—เบต 1. Spring Boot เปเบฅเบฐ Docker

เบฎเบฝเบ™โ€‹เบฎเบนเป‰โ€‹เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰ microservicesโ€‹. เบชเปˆเบงเบ™เบ—เบต 1. Spring Boot เปเบฅเบฐ Docker

Hey Habr.

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰, เบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบ›เบฐเบชเบปเบšเบเบฒเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบเปƒเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบเบฒเบ™เบฎเบฝเบ™เบฎเบนเป‰เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ—เบปเบ”เบฅเบญเบ‡เบเบฑเบš microservices. เป€เบกเบทเปˆเบญเบฎเบฝเบ™เบฎเบนเป‰เบ—เบธเบเป€เบ„เบทเปˆเบญเบ‡เบกเบทเปƒเบซเบกเปˆ, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบชเบฐเป€เบซเบกเบตเบขเบฒเบเบžเบฐเบเบฒเบเบฒเบกเบกเบฑเบ™เบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบเป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™, เปเบ•เปˆเบเบฑเบ‡เบขเบนเปˆเปƒเบ™เบชเบฐเบžเบฒเบšเบ•เบปเบงเบˆเบดเบ‡เบซเบผเบฒเบเบ‚เบถเป‰เบ™. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบชเป‰เบฒเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบˆเบธเบ™เบฅเบฐเบžเบฒเบเบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบ, เป€เบŠเบดเปˆเบ‡เบ•เปเปˆเบกเบฒเบชเบฒเบกเบฒเบ” "เบซเป‰เบญเบ" เบเบฑเบšเบ—เบธเบเบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เป€เบ•เบฑเบเป‚เบ™เป‚เบฅเบขเบตเบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆ. เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ•เบปเป‰เบ™เบ•เปเบชเปเบฒเบฅเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เปเบกเปˆเบ™เบ„เบงเบฒเบกเปƒเบเป‰เบŠเบดเบ”เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบชเบนเบ‡เบชเบธเบ”เบเบฑเบšเบฅเบฐเบšเบปเบšเบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡.

เปƒเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เปเบšเปˆเบ‡เบเบฒเบ™เบชเป‰เบฒเบ‡เป‚เบ„เบ‡เบเบฒเบ™เบญเบญเบเป€เบ›เบฑเบ™เบซเบผเบฒเบเบ‚เบฑเป‰เบ™เบ•เบญเบ™:

  1. เบชเป‰เบฒเบ‡เบชเบญเบ‡เบšเปเบฅเบดเบเบฒเบ™ - 'backend' เปเบฅเบฐ 'gateway', pack เบžเบงเบเบกเบฑเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฎเบนเบš docker เปเบฅเบฐ configure เปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเป€เบฎเบฑเบ”เบงเบฝเบเบฎเปˆเบงเบกเบเบฑเบ™

    เบ„เปเบฒเบชเปเบฒเบ„เบฑเบ™: Java 11, Spring Boot, Docker, เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบฎเบนเบšเบžเบฒเบš

  2. เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบฅเบฐเบšเบปเบšเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ เปเบฅเบฐเบเบฒเบ™เบ™เบณเปƒเบŠเป‰ Kubernetes เปƒเบ™ Google Kubernetes Engine

    เบ„เปเบฒเบชเปเบฒเบ„เบฑเบ™: Kubernetes, GKE, เบเบฒเบ™เบ„เบธเป‰เบกเบ„เบญเบ‡เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™, autoscaling, เบ„เบงเบฒเบกเบฅเบฑเบš

  3. เบชเป‰เบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เป‚เบ”เบเปƒเบŠเป‰ Helm 3 เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เบเบธเปˆเบกเบ—เบตเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบซเบผเบฒเบเบ‚เบถเป‰เบ™

    เบ„เปเบฒเบชเปเบฒเบ„เบฑเบ™: Helm 3, เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบ•เบฐเบฅเบฒเบ‡

  4. เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ Jenkins เปเบฅเบฐเบ—เปเปˆเบชเบปเปˆเบ‡เบฅเบฐเบซเบฑเบ”เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เป„เบ›เบซเบฒเบเบธเปˆเบก

    เบ„เปเบฒเบชเปเบฒเบ„เบฑเบ™: เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ Jenkins, plugins, repository configs เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ

เบ‚เป‰เบญเบเบงเบฒเบ‡เปเบœเบ™เบ—เบตเปˆเบˆเบฐเบญเบธเบ—เบดเบ”เบšเบปเบ”เบ„เบงเบฒเบกเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเปƒเบ™เปเบ•เปˆเบฅเบฐเบ‚เบฑเป‰เบ™เบ•เบญเบ™.

เบˆเบธเบ”เบชเบธเบกเบ‚เบญเบ‡เบšเบปเบ”เบ„เบงเบฒเบกเบŠเบธเบ”เบ™เบตเป‰เปเบกเปˆเบ™เบšเปเปˆเปเบกเปˆเบ™เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบฝเบ™ microservices, เปเบ•เปˆเบงเบดเบ—เบตเบเบฒเบ™เป€เบฎเบฑเบ”เปƒเบซเป‰เบžเบงเบเบกเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เบฅเบฐเบšเบปเบšเบ”เบฝเบง. เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบชเบดเปˆเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบกเบฑเบเบˆเบฐเบขเบนเปˆเบ™เบญเบเบ„เบงเบฒเบกเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเบ‚เบญเบ‡เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ„เบดเบ”เบงเปˆเบฒเบกเบฑเบ™เบเบฑเบ‡เป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบ—เบตเปˆเบˆเบฐเบกเบตเบ„เบงเบฒเบกเบ„เบธเป‰เบ™เป€เบ„เบตเบเบเบฑเบšเบžเบงเบเป€เบ‚เบปเบฒเบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบ 20% (เป€เบŠเบดเปˆเบ‡เบฎเบนเป‰เบงเปˆเบฒเบเบงเบกเป€เบญเบปเบฒ 80% เบ‚เบญเบ‡เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš). เบšเบฒเบ‡เบซเบปเบงเบ‚เปเป‰เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เป€เบŠเบฑเปˆเบ™: เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž, เบˆเบฐเบ–เบทเบเบ›เบฐเป„เบงเป‰เบˆเบฒเบเป‚เบ„เบ‡เบเบฒเบ™เบ™เบตเป‰, เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบœเบนเป‰เบ‚เบฝเบ™เป€เบ‚เบปเป‰เบฒเปƒเบˆเบžเบฝเบ‡เป€เบฅเบฑเบเบ™เป‰เบญเบเบเปˆเบฝเบงเบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰; เบฅเบฐเบšเบปเบšเบเปเบฒเบฅเบฑเบ‡เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เบชเบฐเป€เบžเบฒเบฐเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบชเปˆเบงเบ™เบšเบธเบเบ„เบปเบ™. เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบเบดเบ™โ€‹เบ”เบตโ€‹เบ•เป‰เบญเบ™โ€‹เบฎเบฑเบšโ€‹เบ„เบงเบฒเบกโ€‹เบ„เบดเบ”โ€‹เป€เบซเบฑเบ™โ€‹เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เบงเบดโ€‹เบˆเบฒเบ™โ€‹เปƒเบ™โ€‹เบเบฒเบ™โ€‹เบเปเปˆโ€‹เบชเป‰เบฒเบ‡.

เบเบฒเบ™เบชเป‰เบฒเบ‡ microservices

เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เป„เบ”เป‰เบ–เบทเบเบ‚เบฝเบ™เป„เบงเป‰เปƒเบ™ Java 11 เป‚เบ”เบเปƒเบŠเป‰ Spring Boot. เบเบฒเบ™เบชเบทเปˆเบชเบฒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ–เบทเบเบˆเบฑเบ”เบ•เบฑเป‰เบ‡เป‚เบ”เบเปƒเบŠเป‰ REST. เป‚เบ„เบ‡เบเบฒเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบˆเบฐเบ›เบฐเบเบญเบšเบกเบตเบˆเปเบฒเบ™เบงเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ•เปเบฒเปˆเบชเบธเบ”เบ—เบตเปˆ (เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ•เปเปˆเบกเบฒเบˆเบฐเบกเบตเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ—เบตเปˆเบˆเบฐเบ—เบปเบ”เบชเบญเบšเปƒเบ™ Jenkins). เบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เปเบกเปˆเบ™เบกเบตเบขเบนเปˆเปƒเบ™ GitHub: เบ”เป‰เบฒเบ™เบซเบผเบฑเบ‡ ะธ เบ›เบฐเบ•เบน.

เป€เบžเบทเปˆเบญเปƒเบซเป‰เบชเบฒเบกเบฒเบ”เบเบงเบ”เบชเบญเบšเบชเบฐเบ–เบฒเบ™เบฐเบ‚เบญเบ‡เปเบ•เปˆเบฅเบฐเบšเปเบฅเบดเบเบฒเบ™, Spring Actuator เป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบกเป€เบ‚เบปเป‰เบฒเปƒเบ™เบเบฒเบ™เป€เบžเบดเปˆเบ‡เบžเบฒเบญเบฒเป„เบชเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ. เบกเบฑเบ™เบˆเบฐเบชเป‰เบฒเบ‡เบˆเบธเบ”เบชเบดเป‰เบ™เบชเบธเบ” / เบ•เบปเบงเบเบฐเบ•เบธเป‰เบ™ / เบชเบธเบ‚เบฐเบžเบฒเบšเปเบฅเบฐเบˆเบฐเบเบฑเบšเบ„เบทเบ™เบชเบฐเบ–เบฒเบ™เบฐเบžเบฒเบšเบ‚เบญเบ‡ 200 เบ–เป‰เบฒเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบžเป‰เบญเบกเบ—เบตเปˆเบˆเบฐเบเบญเบกเบฎเบฑเบšเบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™, เบซเบผเบท 504 เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบกเบตเบšเบฑเบ™เบซเบฒ. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ—เบตเปˆเบชเบปเบกเบกเบธเบ”เบ•เบดเบ–เบฒเบ™, เป€เบžเบฒเบฐเบงเปˆเบฒเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเบซเบผเบฒเบ, เปเบฅเบฐเบžเบฒเบเปƒเบ•เป‰เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบšเบฑเบ‡เบ„เบฑเบšเบšเบฒเบ‡เบŠเบฐเบ™เบดเบ”, เบžเบงเบเบกเบฑเบ™เบกเบฑเบเบˆเบฐเบšเปเปˆเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป„เบ”เป‰เบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™เบเปˆเบงเบฒเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบšเบฒเบ‡เบชเปˆเบงเบ™. เปเบ•เปˆเปƒเบ™เบฅเบฐเบšเบปเบšเบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡, Actuator เบชเบฒเบกเบฒเบ”เบŠเปˆเบงเบเบงเบดเบ™เบดเบ”เป„เบชเบšเบฑเบ™เบซเบฒเบเปˆเบญเบ™เบ—เบตเปˆเบœเบนเป‰เปƒเบŠเป‰เบˆเบฐเป€เบฅเบตเปˆเบกเบ•เบตเบกเบฑเบ™. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ–เป‰เบฒเบšเบฑเบ™เบซเบฒเป€เบเบตเบ”เบ‚เบถเป‰เบ™เบเบฑเบšเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบชเบฒเบกเบฒเบ”เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ•เปเปˆเบเบฑเบšเบเบฒเบ™เบ™เบตเป‰เป‚เบ”เบเบเบฒเบ™เบขเบธเบ”เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ”เป‰เบงเบเบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเปเบ•เบเบซเบฑเบเบ‚เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™.

เบšเปเบฅเบดเบเบฒเบ™เบ”เป‰เบฒเบ™เบซเบผเบฑเบ‡

เบšเปเบฅเบดเบเบฒเบ™ backend เบžเบฝเบ‡เปเบ•เปˆเบˆเบฐเบ™เบฑเบšเปเบฅเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™เบˆเปเบฒเบ™เบงเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ—เบตเปˆเบเบญเบกเบฎเบฑเบš.

เบฅเบฐเบซเบฑเบ”เบ„เบงเบšเบ„เบธเบก:

@RestController
public class RequestsCounterController {

    private final AtomicLong counter = new AtomicLong();

    @GetMapping("/requests")
    public Long getRequestsCount() {
        return counter.incrementAndGet();
    }
}

เบเบฒเบ™โ€‹เบ—เบปเบ”โ€‹เบชเบญเบšโ€‹เบเบฒเบ™โ€‹เบ„เบงเบšโ€‹เบ„เบธเบกโ€‹:

@WebMvcTest(RequestsCounterController.class)
public class RequestsCounterControllerTests {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void firstRequest_one() throws Exception {
        mockMvc.perform(get("/requests"))
            .andExpect(status().isOk())
            .andExpect(MockMvcResultMatchers.content().string("1"));
    }
}

เบšเปเบฅเบดเบเบฒเบ™เบœเปˆเบฒเบ™เบ›เบฐเบ•เบน

gateway เบˆเบฐเบชเบปเปˆเบ‡เบ•เปเปˆเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเป„เบ›เบเบฑเบ‡เบšเปเบฅเบดเบเบฒเบ™ backend, เป€เบชเบตเบกเบกเบฑเบ™เบ”เป‰เบงเบเบ‚เปเป‰เบกเบนเบ™เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

  • เบฅเบฐเบซเบฑเบ”เบ›เบฐเบ•เบน. เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบˆเปเบฒเป€เบ›เบฑเบ™เป€เบžเบทเปˆเบญเปƒเบซเป‰เบ•เบปเบงเบขเปˆเบฒเบ‡เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบ›เบฐเบ•เบนเบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบˆเปเบฒเปเบ™เบเบˆเบฒเบเบญเบทเปˆเบ™เป‚เบ”เบเบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ
  • "เบ„เบงเบฒเบกเบฅเบฑเบš" เบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™เบ—เบตเปˆเบˆเบฐเบกเบตเบšเบปเบ”เบšเบฒเบ”เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบซเบผเบฒเบ (เบซเบกเบฒเบเป€เบฅเบเบฅเบฐเบซเบฑเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบ„เบธเบเบเบตเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™)

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเปƒเบ™ application.properties:

backend.url=http://localhost:8081
instance.id=${random.int}
secret="default-secret"

เบญเบฐเปเบ”เบฑเบšเป€เบ•เบตเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบทเปˆเบชเบฒเบ™เบเบฑเบš backend:

@Service
public class BackendAdapter {

    private static final String REQUESTS_ENDPOINT = "/requests";

    private final RestTemplate restTemplate;

    @Value("${backend.url}")
    private String backendUrl;

    public BackendAdapter(RestTemplateBuilder builder) {
        restTemplate = builder.build();
    }

    public String getRequests() {
        ResponseEntity<String> response = restTemplate.getForEntity(
backendUrl + REQUESTS_ENDPOINT, String.class);
        return response.getBody();
    }
}

เบ•เบปเบงเบ„เบงเบšเบ„เบธเบก:

@RestController
@RequiredArgsConstructor
public class EndpointController {

    private final BackendAdapter backendAdapter;

    @Value("${instance.id}")
    private int instanceId;

    @Value("${secret}")
    private String secret;

    @GetMapping("/")
    public String getRequestsCount() {
        return String.format("Number of requests %s (gateway %d, secret %s)", backendAdapter.getRequests(), instanceId, secret);
    }
}

เป€เบ›เบตเบ”เบ•เบปเบง:

เบกเบฒเป€เบ›เบตเบ”เบชเบฒเบเบซเบผเบฑเบ‡:

./mvnw package -DskipTests
java -Dserver.port=8081 -jar target/microservices-backend-1.0.0.jar

เปƒเบซเป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ›เบฐเบ•เบน:

./mvnw package -DskipTests
java -jar target/microservices-gateway-1.0.0.jar

เบžเบงเบเป€เบฎเบปเบฒเบเบงเบ”เป€เบšเบดเปˆเบ‡:

$ curl http://localhost:8080/
Number of requests 1 (gateway 38560358, secret "default-secret")

เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เป€เบฎเบฑเบ”เบงเบฝเบ. เบœเบนเป‰เบญเปˆเบฒเบ™เบ—เบตเปˆเป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆเบˆเบฐเบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบšเปเปˆเบกเบตเบซเบเบฑเบ‡เบเบตเบ”เบ‚เบงเบฒเบ‡เบžเบงเบเป€เบฎเบปเบฒเบˆเบฒเบเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡ backend เป‚เบ”เบเบเบปเบ‡, เบ‚เป‰เบฒเบกเบ›เบฐเบ•เบน (http://localhost:8081/requests). เป€เบžเบทเปˆเบญเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ™เบตเป‰, เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ•เป‰เบญเบ‡เบ–เบทเบเบฅเบงเบกเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป€เบ›เบฑเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ”เบฝเบง, เปเบฅเบฐเบžเบฝเบ‡เปเบ•เปˆเบ›เบฐเบ•เบนเบ—เบตเปˆเบ„เบงเบ™เบˆเบฐ "เบ•เบดเบ”" เบžเบฒเบเบ™เบญเบ.
เบ™เบญเบเบˆเบฒเบเบ™เบตเป‰, เบ—เบฑเบ‡เบชเบญเบ‡เบšเปเบฅเบดเบเบฒเบ™เปเบšเปˆเบ‡เบ›เบฑเบ™เบฅเบฐเบšเบปเบšเป„เบŸเบฅเปŒเบ”เบฝเบงเบเบฑเบ™, เบชเป‰เบฒเบ‡เบเบฐเบ—เบนเป‰, เปเบฅเบฐเบˆเบธเบ”เบซเบ™เบถเปˆเบ‡เบชเบฒเบกเบฒเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปเบŠเบเปเบŠเบ‡เป€เบŠเบดเปˆเบ‡เบเบฑเบ™เปเบฅเบฐเบเบฑเบ™. เบกเบฑเบ™เบˆเบฐเป€เบ›เบฑเบ™เบเบฒเบ™เบ”เบตเบ—เบตเปˆเบˆเบฐเปเบเบ microservices เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ. เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบšเบฑเบ™เบฅเบธเป„เบ”เป‰เป‚เบ”เบเบเบฒเบ™เปเบˆเบเบขเบฒเบเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเปƒเบ™เบ—เบปเปˆเบงเป€เบ„เบทเปˆเบญเบ‡เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™ (เป€เบ‡เบดเบ™เบซเบผเบฒเบ, เบกเบตเบ„เบงเบฒเบกเบซเบเบธเป‰เบ‡เบเบฒเบ), เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบ virtual (เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบซเบผเบฒเบ, เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบง) เบซเบผเบทเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ containerization. เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบ„เบฒเบ”เป„เบงเป‰, เบžเบงเบเป€เบฎเบปเบฒเป€เบฅเบทเบญเบเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเบชเบฒเบกเปเบฅเบฐ Docker เป€เบ›เบฑเบ™เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบšเบฑเบ™เบˆเบธ.

Docker

เปƒเบ™เบชเบฑเป‰เบ™, Docker เบชเป‰เบฒเบ‡เบšเบฑเบ™เบˆเบธเบ—เบตเปˆเป‚เบ”เบ”เบ”เปˆเบฝเบง, เบซเบ™เบถเปˆเบ‡เบ•เปเปˆเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ. เป€เบžเบทเปˆเบญเปƒเบŠเป‰ Docker, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ‚เบฝเบ™ Dockerfile - เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เปเบฅเบฐเปเบฅเปˆเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™. เบ•เปเปˆโ€‹เป„เบ›โ€‹, เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบชเป‰เบฒเบ‡โ€‹เบฎเบนเบšโ€‹เบžเบฒเบšโ€‹, เบญเบฑเบšโ€‹เบกเบฑเบ™โ€‹เบเบฑเบšโ€‹เบเบฒเบ™โ€‹เบˆเบปเบ”โ€‹เบ—เบฐโ€‹เบšเบฝเบ™โ€‹เบฎเบนเบšโ€‹เบžเบฒเบš (เบšเปเปˆโ€‹. Dockerhub) เปเบฅเบฐเบ™เบณเปƒเบŠเป‰เบšเปเบฅเบดเบเบฒเบ™เบˆเบธเบ™เบฅเบฐเบžเบฒเบเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก dockerized เปƒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบ”เบฝเบง.

dockerfile

เบซเบ™เบถเปˆเบ‡เปƒเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบชเบธเบ”เบ‚เบญเบ‡เบฎเบนเบšเบžเบฒเบšเปเบกเปˆเบ™เบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เบกเบฑเบ™. เบฎเบนเบšเบžเบฒเบšเบ‚เบฐเปœเบฒเบ”เบ™เป‰เบญเบเบˆเบฐเบ”เบฒเบงเป‚เบซเบผเบ”เป„เบงเบ‚เบถเป‰เบ™เบˆเบฒเบเบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™เบ—เบฒเบ‡เป„เบ, เปƒเบŠเป‰เบžเบทเป‰เบ™เบ—เบตเปˆเปœเป‰เบญเบเบฅเบปเบ‡, เปเบฅเบฐเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบˆเบฐเป€เบฅเบตเปˆเบกเป„เบงเบ‚เบถเป‰เบ™. เบฎเบนเบšเบžเบฒเบšเปƒเบ”เบเปเปˆเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เบšเบปเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบฎเบนเบšเบžเบฒเบšเบžเบทเป‰เบ™เบ–เบฒเบ™, เปเบฅเบฐเปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เป€เบฅเบทเบญเบเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบซเบ™เป‰เบญเบเบ—เบตเปˆเบชเบธเบ”. เบ—เบฒเบ‡โ€‹เป€เบฅเบทเบญเบโ€‹เบ—เบตเปˆโ€‹เบ”เบตโ€‹เปเบกเปˆเบ™ Alpine, เบเบฒเบ™โ€‹เปเบœเปˆโ€‹เบเบฐโ€‹เบˆเบฒเบ Linux เบขเปˆเบฒเบ‡โ€‹เป€เบ•เบฑเบกโ€‹เบ—เบตเปˆโ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบขเปˆเบฒเบ‡โ€‹เบซเบ™เป‰เบญเบโ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบซเบธเป‰เบกโ€‹เบซเปเปˆ.

เบ—เปเบฒเบญเบดเบ”, เปƒเบซเป‰เบžเบฐเบเบฒเบเบฒเบกเบ‚เบฝเบ™ Dockerfile "head-on" (เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเป€เบงเบปเป‰เบฒเบ—เบฑเบ™เบ—เบตเบงเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบงเบดเบ—เบตเบ—เบตเปˆเบšเปเปˆเบ”เบต, เบขเปˆเบฒเป€เบฎเบฑเบ”):

FROM adoptopenjdk/openjdk11:jdk-11.0.5_10-alpine
ADD . /src
WORKDIR /src
RUN ./mvnw package -DskipTests
EXPOSE 8080
ENTRYPOINT ["java","-jar","target/microservices-gateway-1.0.0.jar"]

เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เปƒเบŠเป‰เบฎเบนเบšเบžเบฒเบšเบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡ Alpine เบเบฑเบš JDK เบ—เบตเปˆเบ•เบดเบ”เบ•เบฑเป‰เบ‡เปเบฅเป‰เบงเป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ. เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ„เปเบฒเบชเบฑเปˆเบ‡ ADD, เบžเบงเบเป€เบฎเบปเบฒเป€เบžเบตเปˆเบกเป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบต src เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เปƒเบชเปˆเบฎเบนเบšเบžเบฒเบš, เบซเบกเบฒเบเบงเปˆเบฒเบกเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบ (WORKDIR) เปเบฅเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡. เบ„เปเบฒเบชเบฑเปˆเบ‡ EXPOSE 8080 เบชเบฑเบ™เบเบฒเบ™เบเบฑเบš docker เบงเปˆเบฒเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เปƒเบ™ container เบˆเบฐเปƒเบŠเป‰เบžเบญเบ” 8080 เบ‚เบญเบ‡เบกเบฑเบ™ (เบญเบฑเบ™เบ™เบตเป‰เบˆเบฐเบšเปเปˆเป€เบฎเบฑเบ”เปƒเบซเป‰เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป„เบ”เป‰เบˆเบฒเบเบžเบฒเบเบ™เบญเบ, เปเบ•เปˆเบˆเบฐเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป„เบ”เป‰, เบ•เบปเบงเบขเปˆเบฒเบ‡, เบˆเบฒเบ container เบญเบทเปˆเบ™เปƒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบ docker เบ”เบฝเบงเบเบฑเบ™. ).

เป€เบžเบทเปˆเบญเบซเบธเป‰เบกเบซเปเปˆเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฎเบนเบšเบžเบฒเบš, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบˆเบฒเบเบฎเบฒเบเบ‚เบญเบ‡เปเบ•เปˆเบฅเบฐเป‚เบ„เบ‡เบเบฒเบ™:

docker image build . -t msvc-backend:1.0.0

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบฎเบนเบšเบžเบฒเบšเบ—เบตเปˆเบกเบตเบ‚เบฐเบซเบ™เบฒเบ” 456 MB (เป€เบŠเบดเปˆเบ‡เบฎเบนเบšเบžเบฒเบš JDK 340 เบžเบทเป‰เบ™เบ–เบฒเบ™เป„เบ”เป‰ MB). เปเบฅเบฐเบ—เบฑเบ‡เบซเบกเบปเบ”เป€เบ–เบดเบ‡เบงเปˆเบฒเบˆเบฐเบกเบตเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบซเป‰เบญเบ‡เบฎเบฝเบ™เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เบฑเบšเบขเบนเปˆเปƒเบ™เบ™เบดเป‰เบงเบกเบทเบซเบ™เบถเปˆเบ‡. เป€เบžเบทเปˆเบญเบซเบผเบธเบ”เบ‚เบฐเปœเบฒเบ”เบ‚เบญเบ‡เบฎเบนเบšเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:

  • เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰เบเบฒเบ™เบ›เบฐเบเบญเบšเบซเบผเบฒเบเบ‚เบฑเป‰เบ™เบ•เบญเบ™. เปƒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เปเบฒเบญเบดเบ”เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ›เบฐเบเบญเบšเป‚เบ„เบ‡เบเบฒเบ™, เปƒเบ™เบ—เบตเบชเบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡ JRE, เปเบฅเบฐเปƒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เบตเบชเบฒเบกเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ„เบฑเบ”เบฅเบญเบเบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฎเบนเบš Alpine เบ—เบตเปˆเบชเบฐเบญเบฒเบ”เปƒเบซเบกเปˆ. เปƒเบ™เบˆเปเบฒเบ™เบงเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”, เบฎเบนเบšเบžเบฒเบšเบชเบธเบ”เบ—เป‰เบฒเบเบˆเบฐเบกเบตเบžเบฝเบ‡เปเบ•เปˆเบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™.
  • เปƒเบซเป‰เปƒเบŠเป‰ java modularization. เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบ Java 9, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบกเบท jlink เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡ JRE เบˆเบฒเบเบžเบฝเบ‡เปเบ•เปˆเป‚เบกเบ”เบนเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™

เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เบ—เบตเปˆเบขเบฒเบเบฎเบนเป‰เบขเบฒเบเป€เบซเบฑเบ™, เบ™เบตเป‰เปเบกเปˆเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ—เบตเปˆเบ”เบตเบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบซเบผเบธเบ”เบœเปˆเบญเบ™เบ‚เบฐเบซเบ™เบฒเบ”เบฎเบนเบšเบžเบฒเบš https://habr.com/ru/company/ruvds/blog/485650/.

Dockerfile เบชเบธเบ”เบ—เป‰เบฒเบ:

FROM adoptopenjdk/openjdk11:jdk-11.0.5_10-alpine as builder
ADD . /src
WORKDIR /src
RUN ./mvnw package -DskipTests

FROM alpine:3.10.3 as packager
RUN apk --no-cache add openjdk11-jdk openjdk11-jmods
ENV JAVA_MINIMAL="/opt/java-minimal"
RUN /usr/lib/jvm/java-11-openjdk/bin/jlink 
    --verbose 
    --add-modules 
        java.base,java.sql,java.naming,java.desktop,java.management,java.security.jgss,java.instrument 
    --compress 2 --strip-debug --no-header-files --no-man-pages 
    --release-info="add:IMPLEMENTOR=radistao:IMPLEMENTOR_VERSION=radistao_JRE" 
    --output "$JAVA_MINIMAL"

FROM alpine:3.10.3
LABEL maintainer="Anton Shelenkov [email protected]"
ENV JAVA_HOME=/opt/java-minimal
ENV PATH="$PATH:$JAVA_HOME/bin"
COPY --from=packager "$JAVA_HOME" "$JAVA_HOME"
COPY --from=builder /src/target/microservices-backend-*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]

เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เบฎเบนเบšเบ„เบทเบ™เปƒเปเปˆ, เปเบฅเบฐเปƒเบ™เบ—เบตเปˆเบชเบธเบ”เบกเบฑเบ™เบเปเบšเบฒเบ‡เบฅเบปเบ‡ 6 เป€เบ—เบปเปˆเบฒ, เป€เบ—เบปเปˆเบฒเบเบฑเบš 77 MB. เบšเปเปˆเบ”เบต. เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบ™เบฑเป‰เบ™โ€‹, เบฎเบนเบšโ€‹เบžเบฒเบšโ€‹เบชเปเบฒโ€‹เป€เบฅเบฑเบ”โ€‹เบฎเบนเบšโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบญเบฑเบšโ€‹เป‚เบซเบผเบ”โ€‹เบเบฑเบšโ€‹เบเบฒเบ™โ€‹เบˆเบปเบ”โ€‹เบ—เบฐโ€‹เบšเบฝเบ™โ€‹เบฎเบนเบšโ€‹เบžเบฒเบšโ€‹เป€เบžเบทเปˆเบญโ€‹เปƒเบซเป‰โ€‹เบฎเบนเบšโ€‹เบžเบฒเบšโ€‹เบ‚เบญเบ‡โ€‹เบ—เปˆเบฒเบ™โ€‹เบกเบตโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ”เบฒเบงโ€‹เป‚เบซเบผเบ”โ€‹เบˆเบฒเบโ€‹เบญเบดเบ™โ€‹เป€เบ•เบตโ€‹เป€เบ™เบฑเบ”โ€‹.

เปเบฅเปˆเบ™เบšเปเบฅเบดเบเบฒเบ™เบฎเปˆเบงเบกเบเบฑเบ™เปƒเบ™ Docker

เป€เบžเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบ, เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบขเบนเปˆเปƒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ”เบฝเบงเบเบฑเบ™. เบกเบตเบซเบผเบฒเบเบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เป€เบ„เบทเบญเบ‚เปˆเบฒเบเปƒเบ™ Docker, เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰ primitive เบ—เบตเปˆเบชเบธเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ - เบ‚เบปเบง, เป€เบŠเบดเปˆเบ‡เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบšเบฑเบ™เบˆเบธเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เป‚เบฎเบ”เบ”เบฝเบงเบเบฑเบ™. เบกเบฒเบชเป‰เบฒเบ‡เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ”เป‰เบงเบเบ„เบณเบชเบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

docker network create msvc-network

เบ•เปเปˆเป„เบ›, เปƒเบซเป‰เป€เบ›เบตเบ”เบ•เบปเบงเบšเบฑเบ™เบˆเบธ backend เบ—เบตเปˆเบกเบตเบŠเบทเปˆเบงเปˆเบฒ 'backend' เบเบฑเบš microservices-backend: 1.0.0:

docker run -dit --name backend --network msvc-net microservices-backend:1.0.0

เบกเบฑเบ™เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ‚เบปเบงเบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ„เบปเป‰เบ™เบžเบปเบšเบญเบญเบเบˆเบฒเบเบเปˆเบญเบ‡เบชเปเบฒเบฅเบฑเบšเบ•เบนเป‰เบ„เบญเบ™เป€เบ—เบ™เป€เบ™เบตเป‚เบ”เบเบŠเบทเปˆเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ. เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™ backend เบˆเบฐเบกเบตเบขเบนเปˆเปƒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบ Docker เบขเบนเปˆ http://backend:8080.

เปƒเบซเป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ›เบฐเบ•เบน:

docker run -dit -p 80:8080 --env secret=my-real-secret --env BACKEND_URL=http://backend:8080/ --name gateway --network msvc-net microservices-gateway:1.0.0

เปƒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เบชเบปเปˆเบ‡เบ•เปเปˆเบžเบญเบ” 80 เบ‚เบญเบ‡เป‚เบฎเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป„เบ›เบซเบฒเบžเบญเบ” 8080 เบ‚เบญเบ‡เบ•เบนเป‰เบ„เบญเบ™เป€เบ—เบ™เป€เบ™เบต. เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰เบ•เบปเบงเป€เบฅเบทเบญเบ env เป€เบžเบทเปˆเบญเบเปเบฒเบ™เบปเบ”เบ•เบปเบงเปเบ›เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ—เบตเปˆเบˆเบฐเบ–เบทเบเบญเปˆเบฒเบ™เป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปƒเบ™เบžเบฒเบเบฎเบฝเบ™ spring เปเบฅเบฐ override เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบˆเบฒเบ application.properties.

เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง, เป‚เบ—เบซเบฒ http://localhost/ เปเบฅเบฐเปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เป€เบฎเบฑเบ”เบงเบฝเบ, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ.

เบชเบฐเบซเบฅเบธเบš

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบชเป‰เบฒเบ‡เบชเบญเบ‡ microservices เบ‡เปˆเบฒเบเบ”เบฒเบ, เบซเบธเป‰เบกเบซเปเปˆเบžเบงเบเบกเบฑเบ™เบขเบนเปˆเปƒเบ™ docker containers เปเบฅเบฐเป€เบ›เบตเบ”เบ•เบปเบงเบกเบฑเบ™เบฎเปˆเบงเบกเบเบฑเบ™เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เบ”เบฝเบงเบเบฑเบ™. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบฅเบฐเบšเบปเบšเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš, เบกเบตเบ‚เปเป‰เป€เบชเบเบ›เบฝเบšเบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡:

  • เบ„เบงเบฒเบกเบ—เบปเบ™เบ—เบฒเบ™เบ•เปเปˆเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเบšเปเปˆเบ”เบต - เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ”เบฝเบงเบชเปเบฒเบฅเบฑเบšเบžเบงเบเป€เบฎเบปเบฒ
  • เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเป„เบ”เป‰เบšเปเปˆเบ”เบต - เป€เบกเบทเปˆเบญเบเบฒเบ™เป‚เบซเบผเบ”เป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™, เบกเบฑเบ™เบˆเบฐเป€เบ›เบฑเบ™เบเบฒเบ™เบ”เบตเบ—เบตเปˆเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰เบ•เบปเบงเบขเปˆเบฒเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปเบฅเบฐเบ”เบธเปˆเบ™เบ”เปˆเบฝเบ‡เบเบฒเบ™เป‚เบซเบผเบ”เบฅเบฐเบซเบงเปˆเบฒเบ‡เบžเบงเบเบกเบฑเบ™.
  • เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบ„เบงเบฒเบกเบชเบฑเบšเบชเบปเบ™ - เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบชเปˆเบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบ 3 เบ„เปเบฒเบชเบฑเปˆเบ‡, เบกเบตเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™ (เบ™เบตเป‰เปเบกเปˆเบ™เบชเปเบฒเบฅเบฑเบš 2 เบšเปเบฅเบดเบเบฒเบ™เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™)

เป€เบžเบทเปˆเบญเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡, เบกเบตเบงเบดเบ—เบตเปเบเป‰เป„เบ‚เบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡เป€เบŠเบฑเปˆเบ™ Docker Swarm, Nomad, Kubernetes เบซเบผเบท OpenShift. เบ–เป‰เบฒเบฅเบฐเบšเบปเบšเบ—เบฑเบ‡เบซเบกเบปเบ”เบ–เบทเบเบ‚เบฝเบ™เปƒเบ™ Java, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เป„เบ›เบซเบฒ Spring Cloud (เบšเบปเบ”โ€‹เบ„เบงเบฒเบกโ€‹เบ—เบตเปˆโ€‹เบ”เบตโ€‹).

ะ’ เบชเปˆเบงเบ™เบ•เปเปˆเป„เบ› เบ‚เป‰เบญเบเบˆเบฐเบšเบญเบเป€เบˆเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบ—เบตเปˆเบ‚เป‰เบญเบเบ•เบฑเป‰เบ‡ Kubernetes เปเบฅเบฐเปƒเบŠเป‰เป‚เบ„เบ‡เบเบฒเบ™เบเบฑเบš Google Kubernetes Engine.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™