αžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹αž–αžΈαžšαž”αŸ€αž”αžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌαŸ” αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 1. Spring Boot αž“αž·αž„ Docker

αžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹αž–αžΈαžšαž”αŸ€αž”αžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌαŸ” αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 1. Spring Boot αž“αž·αž„ Docker

ហេ αž αžΆαž”αŸ‹

αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž”αžšαž·αž™αžΆαž€αžΆαžŸαžŸαž·αž€αŸ’αžŸαžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž–αž·αžŸαŸ„αž’αž“αŸαž‡αžΆαž˜αž½αž™αž˜αžΈαž€αŸ’αžšαžΌαžŸαžΊαžœαžΈαžŸαŸ” αž“αŸ…αž–αŸαž›αžαŸ’αž‰αž»αŸ†αžšαŸ€αž“αž§αž”αž€αžšαžŽαŸαžαŸ’αž˜αžΈαž“αžΈαž˜αž½αž™αŸ— αžαŸ’αž‰αž»αŸ†αžαŸ‚αž„αžαŸ‚αž…αž„αŸ‹αžŸαžΆαž€αž›αŸ’αž”αž„αžœαžΆαž˜αž·αž“αžαŸ’αžšαžΉαž˜αžαŸ‚αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž€αŸ’αž“αž»αž„αžŸαŸ’αžšαž»αž€αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ‚αž˜αž‘αžΆαŸ†αž„αž“αŸ…αž€αŸ’αž“αž»αž„αž›αž€αŸ’αžαžαžŽαŸ’αžŒαž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αžαŸ‚αž˜αž‘αŸ€αžαŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž αžΎαž™ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ microservice αžŸαžΆαž˜αž‰αŸ’αž‰αž˜αž½αž™ αžŠαŸ‚αž›αž€αŸ’αžšαŸ„αž™αž˜αž€αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“ "αž‚αŸ’αžšαž”αžŠαžŽαŸ’αžαž”αŸ‹" αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž‚αŸ’αžšαž”αŸ‹αž”αŸ’αžšαž—αŸαž‘αž“αŸƒαž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆαž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαŸ” αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž…αž˜αŸ’αž”αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„αž‚αžΊαž—αžΆαž–αž‡αž·αžαž˜αž»αžαž„αžΆαžšαž’αžαž·αž”αžšαž˜αžΆαžšαž”αžŸαŸ‹αžœαžΆαž‘αŸ…αž“αžΉαž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž–αž·αžαŸ”

αž‡αžΆαžŠαŸ†αž”αžΌαž„ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž”αŸ‚αž„αž…αŸ‚αž€αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž‚αž˜αŸ’αžšαŸ„αž„αž‡αžΆαž‡αŸ†αž αžΆαž“αŸ—αž‡αžΆαž…αŸ’αžšαžΎαž“αŸ–

  1. αž”αž„αŸ’αž€αžΎαžαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž–αžΈαžš - 'backend' (backend) αž“αž·αž„ 'gateway' (gateway) αžαŸ’αž…αž”αŸ‹αžœαžΆαž‘αŸ…αž€αŸ’αž“αž»αž„αžšαžΌαž”αž—αžΆαž– docker αž αžΎαž™αž€αŸ†αžŽαžαŸ‹αž–αž½αž€αžœαžΆαž±αŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž‚αŸ’αž“αžΆ

    αž–αžΆαž€αŸ’αž™αž‚αž“αŸ’αž›αžΉαŸ‡αŸ– Java 11, Spring Boot, Docker, αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αžšαžΌαž”αž—αžΆαž–

  2. αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ Kubernetes αž“αž·αž„αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž“αŸ…αž€αŸ’αž“αž»αž„ Google Kubernetes Engine

    αž–αžΆαž€αŸ’αž™αž‚αž“αŸ’αž›αžΉαŸ‡αŸ– Kubernetes, GKE, αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž’αž“αž’αžΆαž“, αž€αžΆαžšαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·, αž’αžΆαžαŸŒαž€αŸ†αž”αžΆαŸ†αž„

  3. αž”αž„αŸ’αž€αžΎαžαžαžΆαžšαžΆαž„αžŠαŸ„αž™αž”αŸ’αžšαžΎ Helm 3 αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž…αž„αŸ’αž€αŸ„αž˜αž€αžΆαž“αŸ‹αžαŸ‚αž˜αžΆαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–

    αžŸαŸ’αž›αžΆαž€: Helm 3, αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‚αŸ†αž“αžΌαžŸαžαžΆαž„

  4. αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ Jenkins αž“αž·αž„αž”αŸ†αž–αž„αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž‰αŸ’αž‡αžΌαž“αž€αžΌαžŠαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž‘αŸ…αž…αž„αŸ’αž€αŸ„αž˜

    αž–αžΆαž€αŸ’αž™αž‚αž“αŸ’αž›αžΉαŸ‡αŸ– αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ Jenkins αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‡αŸ†αž“αž½αž™ αžƒαŸ’αž›αžΆαŸ†αž„αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€

αžαŸ’αž‰αž»αŸ†αž‚αŸ’αžšαŸ„αž„αž“αžΉαž„αž›αŸ‡αž”αž„αŸ‹αž’αžαŸ’αžαž”αž‘αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αž˜αž½αž™αž‘αŸ…αž‡αŸ†αž αžΆαž“αž“αžΈαž˜αž½αž™αŸ—αŸ”

αž€αžΆαžšαž•αŸ’αžαŸ„αžαž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž“αŸƒαž’αžαŸ’αžαž”αž‘αžŸαŸŠαŸαžšαžΈαž“αŸαŸ‡ αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαžšαž”αŸ€αž”αžŸαžšαžŸαŸαžšαžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌαž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžšαž”αŸ€αž”αž’αŸ’αžœαžΎαž±αŸ’αž™αž–αž½αž€αžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸ’αž“αž»αž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžαŸ‚αž˜αž½αž™αŸ” αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαžšαžΏαž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαž“αŸ…αžαžΆαž„αž€αŸ’αžšαŸ…αž€αžΆαžšαž‘αž‘αž½αž›αžαž»αžŸαžαŸ’αžšαžΌαžœαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž€αŸαžŠαŸ„αž™ αžαŸ’αž‰αž»αŸ†αž‚αž·αžαžαžΆαžœαžΆαž“αŸ…αžαŸ‚αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαŸ’αž‚αžΆαž›αŸ‹αž–αž½αž€αž‚αŸαž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹ 20% (αžŠαŸ‚αž›αžŠαžΌαž…αžŠαŸ‚αž›αž’αŸ’αž“αž€αž”αžΆαž“αžŠαžΉαž„αž αžΎαž™αžαžΆ 80% αž“αŸƒαž›αž‘αŸ’αž’αž•αž›)αŸ” αž”αŸ’αžšαž’αžΆαž“αž”αž‘αžŸαŸ†αžαžΆαž“αŸ‹αŸ—αž˜αž½αž™αž…αŸ†αž“αž½αž“αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž›αž€αŸ’αžαžαžŽαŸ’αžŒ αžŠαžΌαž…αž‡αžΆαžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αž»αž€αž…αŸ„αž›αž–αžΈαž‚αž˜αŸ’αžšαŸ„αž„αž“αŸαŸ‡ αžŠαŸ„αž™αžŸαžΆαžšαž’αŸ’αž“αž€αž“αž·αž–αž“αŸ’αž’αž™αž›αŸ‹αžαž·αž…αžαž½αž…αž’αŸ†αž–αžΈαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ‚αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αžαŸ’αž‰αž»αŸ†αžŸαŸ’αžœαžΆαž‚αž˜αž“αŸαžšαžΆαž›αŸ‹αž˜αžαž·αž™αŸ„αž”αž›αŸ‹ αž“αž·αž„αž€αžΆαžšαžšαž·αŸ‡αž‚αž“αŸ‹αž€αŸ’αž“αž»αž„αž“αŸαž™αžŸαŸ’αžαžΆαž”αž“αžΆαŸ”

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž˜αžΈαž€αŸ’αžšαžΌ

αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž“αŸ…αž€αŸ’αž“αž»αž„ Java 11 αžŠαŸ„αž™αž”αŸ’αžšαžΎ Spring Boot αŸ” αž’αž“αŸ’αžαžšαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαŸ€αž”αž…αŸ†αžŠαŸ„αž™αž”αŸ’αžšαžΎ REST αŸ” αž‚αž˜αŸ’αžšαŸ„αž„αž“αŸαŸ‡αž“αžΉαž„αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž…αŸ†αž“αž½αž“αž’αž”αŸ’αž”αž”αžšαž˜αžΆαž“αŸƒαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž (αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž“αŸ…αž–αŸαž›αž€αŸ’αžšαŸ„αž™αž˜αžΆαž“αž’αŸ’αžœαžΈαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαžŸαžΆαž€αž›αŸ’αž”αž„αž“αŸ…αž€αŸ’αž“αž»αž„ Jenkins) αŸ” αž€αžΌαžŠαž”αŸ’αžšαž—αž–αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž˜αžΆαž“αž“αŸ…αž›αžΎ GitHubαŸ– αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™ ΠΈ αž…αŸ’αžšαž€αž•αŸ’αž›αžΌαžœ.

αžŠαžΎαž˜αŸ’αž”αžΈαž’αžΆαž…αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸƒαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž“αžΈαž˜αž½αž™αŸ—αž“αŸ„αŸ‡ Spring Actuator αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ…αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαŸ” αžœαžΆαž“αžΉαž„αž”αž„αŸ’αž€αžΎαžαž…αŸ†αžŽαž»αž…αž”αž‰αŸ’αž…αž”αŸ‹ / actuator/health αž αžΎαž™αž“αžΉαž„αžαŸ’αžšαž‘αž”αŸ‹αžŸαŸ’αžαžΆαž“αž—αžΆαž– 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"));
    }
}

αž…αŸ’αžšαž€αž‘αŸ’αžœαžΆαžšαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜

αž…αŸ’αžšαž€αž•αŸ’αž›αžΌαžœαž“αžΉαž„αž”αž‰αŸ’αž‡αžΌαž“αžŸαŸ†αžŽαžΎαž‘αŸ…αž€αžΆαž“αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ backend αžŠαŸ„αž™αž”αž“αŸ’αžαŸ‚αž˜αžœαžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž–αŸαžαŸŒαž˜αžΆαž“αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

  • αž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž…αŸ’αžšαž€αž•αŸ’αž›αžΌαžœαŸ” αžœαžΆαžαŸ’αžšαžΌαžœαž€αžΆαžšαž‡αžΆαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αžœαžΆαž’αžΆαž…αž”αŸ‚αž„αž…αŸ‚αž€αž§αž‘αžΆαž αžšαžŽαŸαž˜αž½αž™αž“αŸƒαž…αŸ’αžšαž€αž•αŸ’αž›αžΌαžœαž…αŸαž‰αž–αžΈαž˜αž½αž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžŠαŸ„αž™αž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αžšαž”αžŸαŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ
  • "αž’αžΆαžαŸŒαž€αŸ†αž”αžΆαŸ†αž„" αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αžŠαŸ‚αž›αž“αžΉαž„αžŠαžΎαžšαžαž½αž“αžΆαž‘αžΈαž“αŸƒαž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžŸαŸ†αžαžΆαž“αŸ‹αžαŸ’αž›αžΆαŸ†αž„αžŽαžΆαžŸαŸ‹ (αž›αŸαžαž‚αž“αŸ’αž›αžΉαŸ‡αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αŸŠαž·αž“αž‚αŸ’αžšαžΈαž”αžαžΌαž‚αžΈαžŠαŸαžŸαŸ†αžαžΆαž“αŸ‹)

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸ…αž€αŸ’αž“αž»αž„ application.properties:

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

αž’αžΆαžŠαžΆαž”αŸ‹αž‘αŸαžšαžαžΆαž„αž€αŸ’αžšαŸ„αž™αŸ–

@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")

αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ” αž’αŸ’αž“αž€αž’αžΆαž“αžŠαŸ‚αž›αž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹αž“αžΉαž„αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžαžΆαž‚αŸ’αž˜αžΆαž“αž’αŸ’αžœαžΈαžšαžΆαžšαžΆαŸ†αž„αž™αžΎαž„αž–αžΈαž€αžΆαžšαž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž‘αŸ αžŠαŸ„αž™αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž…αŸ’αžšαž€αž…αŸαž‰αž…αžΌαž› (http://localhost:8081/requests) αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαž“αŸαŸ‡ αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžαŸ’αžšαžΌαžœαžαŸ‚αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž‘αŸ…αž€αŸ’αž“αž»αž„αž”αžŽαŸ’αžαžΆαž‰αžαŸ‚αž˜αž½αž™ αž αžΎαž™αž˜αžΆαž“αžαŸ‚αž…αŸ’αžšαž€αž…αŸαž‰αž…αžΌαž›αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αžŠαŸ‚αž›αž‚αž½αžšαžαŸ‚ "αž”αž·αž‘" αž“αŸ…αžαžΆαž„αž€αŸ’αžšαŸ…αŸ”
αžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αŸαŸ‡αž•αž„αžŠαŸ‚αžš αžŸαŸαžœαžΆαž‘αžΆαŸ†αž„αž–αžΈαžšαž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž―αž€αžŸαžΆαžšαžαŸ‚αž˜αž½αž™ αž”αž„αŸ’αž€αžΎαžαžŸαŸ’αž‘αŸ’αžšαžΈαž˜ αž αžΎαž™αž“αŸ…αž–αŸαž›αžαŸ‚αž˜αž½αž™αž’αžΆαž…αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‡αŸ’αžšαŸ€αžαž‡αŸ’αžšαŸ‚αž€αž‚αŸ’αž“αžΆαž‘αŸ…αžœαž·αž‰αž‘αŸ…αž˜αž€αŸ” αžœαžΆαž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαžŽαžΆαžŸαŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž‰αŸ‚αž€αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž˜αžΈαž€αŸ’αžšαžΌαžšαž”αžŸαŸ‹αž™αžΎαž„αŸ” αž“αŸαŸ‡αž’αžΆαž…αžŸαž˜αŸ’αžšαŸαž…αž”αžΆαž“αžŠαŸ„αž™αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆ (αž›αž»αž™αž…αŸ’αžšαžΎαž“ αž–αž·αž”αžΆαž€) αžŠαŸ„αž™αž”αŸ’αžšαžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αž (αž”αŸ’αžšαžΎαž’αž“αž’αžΆαž“αž…αŸ’αžšαžΎαž“ αž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž™αžΌαžš) αž¬αž”αŸ’αžšαžΎαž€αž»αž„αžαžΊαž“αŸαžšαŸ” αžŠαžΌαž…αžŠαŸ‚αž›αž”αžΆαž“αžšαŸ†αž–αžΉαž„αž‘αž»αž€αž™αžΎαž„αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž‡αž˜αŸ’αžšαžΎαžŸαž‘αžΈαž”αžΈαž“αž·αž„ Dockers αž‡αžΆαž§αž”αž€αžšαžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž»αž„αžαžΊαž“αŸαžšαŸ”

Dockers

αžŸαžšαž»αž”αž˜αž€ Docker αž”αž„αŸ’αž€αžΎαžαž’αž»αž„αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€ αž˜αž½αž™αž€αŸ’αž“αž»αž„αž˜αž½αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαžΎ Docker αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžŸαžšαžŸαŸαžš Dockerfile - αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαž αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹β€‹αž˜αž€ αž’αŸ’αž“αž€β€‹αž’αžΆαž…β€‹αž”αž„αŸ’αž€αžΎαžβ€‹αžšαžΌαž”αž—αžΆαž– αž•αŸ’αž‘αž»αž€β€‹αž‘αžΎαž„β€‹αž‘αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αž”αž‰αŸ’αž‡αžΈβ€‹αžˆαŸ’αž˜αŸ„αŸ‡β€‹αžšαžΌαž”αž—αžΆαž– (No. Dockerhub) αž“αž·αž„αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž“αŸ…αž€αŸ’αž“αž»αž„αž”αžšαž·αž™αžΆαž€αžΆαžŸ dockered αžŽαžΆαž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž˜αž½αž™αŸ”

Dockerfile

αž›αž€αŸ’αžαžŽαŸˆαžŸαŸ†αžαžΆαž“αŸ‹αž”αŸ†αž•αž»αžαž˜αž½αž™αž“αŸƒαžšαžΌαž”αž—αžΆαž–αž‚αžΊαž‘αŸ†αž αŸ†αžšαž”αžŸαŸ‹αžœαžΆαŸ” αžšαžΌαž”αž—αžΆαž–αž”αž„αŸ’αžšαž½αž˜αž“αžΉαž„αž‘αžΆαž‰αž™αž€αž›αžΏαž“αž‡αžΆαž„αž˜αž»αž“αž–αžΈαžƒαŸ’αž›αžΆαŸ†αž„αž–αžΈαž…αž˜αŸ’αž„αžΆαž™ αž”αŸ’αžšαžΎαž‘αŸ†αž αŸ†αžαž·αž… αž αžΎαž™αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž“αžΉαž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž›αžΏαž“αž‡αžΆαž„αž˜αž»αž“αŸ” αžšαžΌαž”αž—αžΆαž–αžŽαžΆαž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαžšαžΌαž”αž—αžΆαž–αž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ αž αžΎαž™αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŽαŸ‚αž“αžΆαŸ†αž±αŸ’αž™αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž‡αž˜αŸ’αžšαžΎαžŸαžαž·αž…αžαž½αž…αž”αŸ†αž•αž»αžαŸ” αž‡αž˜αŸ’αžšαžΎαžŸαžŠαŸαž›αŸ’αž’αž˜αž½αž™αž‚αžΊ Alpine αžŠαŸ‚αž›αž‡αžΆαž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αž›αžΈαž“αž»αž…αž–αŸαž‰αž›αŸαž‰αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αž‰αŸ’αž…αž”αŸ‹αž’αž”αŸ’αž”αž”αžšαž˜αžΆαŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž…αžΌαžšαž™αžΎαž„αž–αŸ’αž™αžΆαž™αžΆαž˜αžŸαžšαžŸαŸαžš Dockerfile "αž“αŸ…αž›αžΎαžαŸ’αž„αžΆαžŸ" (αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž“αž·αž™αžΆαž™αž—αŸ’αž›αžΆαž˜αŸ—αžαžΆαž“αŸαŸ‡αž‡αžΆαžœαž·αž’αžΈαž’αžΆαž€αŸ’αžšαž€αŸ‹ αž€αž»αŸ†αž’αŸ’αžœαžΎαžœαžΆ):

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"]

αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž™αžΎαž„αž€αŸ†αž–αž»αž„αž”αŸ’αžšαžΎαžšαžΌαž”αž—αžΆαž–αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αžŠαŸ‚αž›αž˜αžΆαž“αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž›αžΎαž’αžΆαž›αŸ‹αž•αŸ‚αž“αž‡αžΆαž˜αž½αž™ JDK αžŠαŸ‚αž›αž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αžšαž½αž…αž αžΎαž™αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž‚αž˜αŸ’αžšαŸ„αž„αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ” αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ ADD αž™αžΎαž„αž”αž“αŸ’αžαŸ‚αž˜αžαž src αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž‘αŸ…αžšαžΌαž”αž—αžΆαž– αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžœαžΆαžαžΆαž’αŸ’αžœαžΎαž€αžΆαžš (WORKDIR) αž αžΎαž™αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αžΆαžšαžŸαŸ’αžαžΆαž”αž“αžΆαŸ” αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ EXPOSE 8080 αž•αŸ’αžαž›αŸ‹αžŸαž‰αŸ’αž‰αžΆαžŠαž›αŸ‹ docker αžαžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αŸ…αž€αŸ’αž“αž»αž„αž€αž»αž„αžαžΊαž“αŸαžšαž“αžΉαž„αž”αŸ’αžšαžΎαž…αŸ’αžšαž€ 8080 αžšαž”αžŸαŸ‹αžœαžΆ (αžœαžΆαž“αžΉαž„αž˜αž·αž“αž’αŸ’αžœαžΎαž±αŸ’αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž’αžΆαž…αž…αžΌαž›αž”αŸ’αžšαžΎαž”αžΆαž“αž–αžΈαžαžΆαž„αž€αŸ’αžšαŸ…αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αžΉαž„αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž’αžΆαž…αž…αžΌαž›αž”αŸ’αžšαžΎαž”αžΆαž“ αž§αž‘αžΆαž αžšαžŽαŸ αž–αžΈαž€αž»αž„αžαžΊαž“αŸαžšαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž“αŸ…αž›αžΎαž”αžŽαŸ’αžαžΆαž‰ docker αžŠαžΌαž…αž‚αŸ’αž“αžΆ )

αžŠαžΎαž˜αŸ’αž”αžΈαžœαŸαž…αžαŸ’αž…αž”αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‘αŸ…αž‡αžΆαžšαžΌαž”αž—αžΆαž– αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž–αžΈ root αž“αŸƒαž‚αž˜αŸ’αžšαŸ„αž„αž“αžΈαž˜αž½αž™αŸ—αŸ–

docker image build . -t msvc-backend:1.0.0

αž›αž‘αŸ’αž’αž•αž›αž‚αžΊαžšαžΌαž”αž—αžΆαž– 456 MB (αžŠαŸ‚αž›αžšαžΌαž”αž—αžΆαž– JDK αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž€αžΆαž“αŸ‹αž€αžΆαž”αŸ‹ 340 MB) αŸ” αž αžΎαž™αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž”αžΎαž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž€αžΆαžšαž–αž·αžαžŠαŸ‚αž›αžαžΆαžαŸ’αž“αžΆαž€αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž‚αž˜αŸ’αžšαŸ„αž„αžšαž”αžŸαŸ‹αž™αžΎαž„αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαžΆαž”αŸ‹αž“αŸ…αž›αžΎαž˜αŸ’αžšαžΆαž˜αžŠαŸƒαž˜αž½αž™αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž‘αŸ†αž αŸ†αžšαžΌαž”αž—αžΆαž–αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ–

  • αž™αžΎαž„αž”αŸ’αžšαžΎαž€αžΆαžšαž•αŸ’αž‚αž»αŸ†αž–αž αž»αž‡αŸ†αž αžΆαž“αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž‡αŸ†αž αžΆαž“αžŠαŸ†αž”αžΌαž„ αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†αž‚αž˜αŸ’αžšαŸ„αž„ αž αžΎαž™αž“αŸ…αž€αŸ’αž“αž»αž„αž‘αžΈαž–αžΈαžš αž™αžΎαž„αž“αžΉαž„αžŠαŸ†αž‘αžΎαž„ JRE αž αžΎαž™αž€αŸ’αž“αž»αž„αž‡αŸ†αž αžΆαž“αž‘αžΈαž”αžΈ αž™αžΎαž„αž“αžΉαž„αž…αž˜αŸ’αž›αž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αž‘αŸ…αž‡αžΆαžšαžΌαž”αž—αžΆαž–αž’αžΆαž›αŸ‹αž•αŸ‚αž“αžαŸ’αž˜αžΈαžŸαŸ’αž’αžΆαžαŸ” αžŸαžšαž»αž”αž˜αž€ αžšαžΌαž”αž—αžΆαž–αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž“αžΉαž„αž˜αžΆαž“αžαŸ‚αžŸαž˜αžΆαžŸαž’αžΆαžαž»αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ”
  • αž…αžΌαžšαž™αžΎαž„αž”αŸ’αžšαžΎ modularization αž“αŸƒ java αŸ” αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‡αžΆαž˜αž½αž™ 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 αž αžΎαž™αž™αžΎαž„αž”αŸ’αžšαžΎαž‡αžΆαž”αž‹αž˜αž”αŸ†αž•αž»αžαž“αŸƒαž–αž½αž€αžœαžΆ - αžŸαŸ’αž–αžΆαž“ αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αžŽαŸ’αžαžΆαž‰αž€αž»αž„αžαžΊαž“αŸαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžαŸ‚αž˜αž½αž™αŸ” αž”αž„αŸ’αž€αžΎαžαž”αžŽαŸ’αžαžΆαž‰αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

docker network create msvc-network

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αž»αž„αžαžΊαž“αŸαžšαž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™αžŠαŸ‚αž›αž˜αžΆαž“αžˆαŸ’αž˜αŸ„αŸ‡αžαžΆ '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 αžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ†αžŽαžαŸ‹αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αžŠαŸ‚αž›αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αžΆαž“αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αžŠαŸ„αž™αž“αž·αž‘αžΆαžƒαžšαžŠαžΌαžœ αž“αž·αž„αž”αžŠαž·αžŸαŸαž’αž›αž€αŸ’αžαžŽαŸˆαžŸαž˜αŸ’αž”αžαŸ’αžαž·αž–αžΈ application.properties αŸ”

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž™αžΎαž„αž αŸ… http://localhost/ αž αžΎαž™αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΆαž€αžŠαžαžΆαž’αŸ’αžœαžΈαŸ—αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαžΌαž…αž€αžšαžŽαžΈαž˜αž»αž“αžŠαŸ‚αžšαŸ”

αžŸαŸαž…αž€αŸ’αžαžΈαžŸαž“αŸ’αž“αž·αžŠαŸ’αž‹αžΆαž“

αž‡αžΆαž›αž‘αŸ’αž’αž•αž› αž™αžΎαž„αž”αžΆαž“αž”αž„αŸ’αž€αžΎαž microservices αžŸαžΆαž˜αž‰αŸ’αž‰αž…αŸ†αž“αž½αž“αž–αžΈαžš αžŠαŸ„αž™αžαŸ’αž…αž”αŸ‹αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„ docker containers αž αžΎαž™αžŠαžΆαž€αŸ‹αž±αŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžœαžΆαž‡αžΆαž˜αž½αž™αž‚αŸ’αž“αžΆαž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžαŸ‚αž˜αž½αž™αŸ” αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆ αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž›αž‘αŸ’αž’αž•αž›αž˜αžΆαž“αž‚αž»αžŽαžœαž·αž”αžαŸ’αžαž·αž˜αž½αž™αž…αŸ†αž“αž½αž“αŸ–

  • αž€αžΆαžšαž’αžαŸ‹αž±αž“αž…αŸ†αž–αŸ„αŸ‡αž€αŸ†αž αž»αžŸαž˜αž·αž“αž›αŸ’αž’ - αž’αŸ’αžœαžΈαŸ—αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž™αžΎαž„αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžαŸ‚αž˜αž½αž™
  • αž€αžΆαžšαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž˜αž·αž“αž›αŸ’αž’ - αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αžΆαžšαž•αŸ’αž‘αž»αž€αž€αžΎαž“αž‘αžΎαž„ αžœαžΆαž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαžŽαžΆαžŸαŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž”αž“αŸ’αžαŸ‚αž˜αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž· αž“αž·αž„αž’αŸ’αžœαžΎαž±αŸ’αž™αž˜αžΆαž“αžαž»αž›αŸ’αž™αž—αžΆαž–αžšαžœαžΆαž„αž”αž“αŸ’αž‘αž»αž€αžšαžœαžΆαž„αž–αž½αž€αžœαžΆαŸ”
  • αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž“αŸƒαž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ - αž™αžΎαž„αžαŸ’αžšαžΌαžœαž”αž‰αŸ’αž…αžΌαž›αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹ 3 αž αžΎαž™αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹ (αž“αŸαŸ‡αž‚αžΊαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ‚αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ 2 αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡)

αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαžαžΆαž„αž›αžΎ αž˜αžΆαž“αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž˜αž½αž™αž…αŸ†αž“αž½αž“αžŠαžΌαž…αž‡αžΆ Docker Swarm, Nomad, Kubernetes ឬ OpenShift αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‘αžΆαŸ†αž„αž˜αžΌαž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž‡αžΆ Java αž’αŸ’αž“αž€αž’αžΆαž…αž˜αžΎαž›αž‘αŸ… Spring Cloud (αž’αžαŸ’αžαž”αž‘αž›αŸ’αž’αŸ”).

Π’ αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αž‘αžΆαž”αŸ‹ αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αžšαŸ€αž”αž…αŸ† Kubernetes αž“αž·αž„αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‚αž˜αŸ’αžšαŸ„αž„αž“αŸαŸ‡αž‘αŸ… Google Kubernetes EngineαŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹