αž€αžΆαžšαž”αž„αŸ’αžšαŸ€αž“ Kubernetes αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 1αŸ– αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ αž“αž·αž„αž€αž»αž„αžαžΊαž“αŸαžš

αžαžΆαž˜αžŸαŸ†αžŽαžΎαžšαž”αžŸαŸ‹αž™αžΎαž„ Habr αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž˜αž‡αŸ’αžˆαž˜αžŽαŸ’αžŒαž›αž˜αž½αž™αŸ” Kubernetes αž αžΎαž™αž™αžΎαž„αžšαžΈαž€αžšαžΆαž™αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαžΆαž€αŸ‹αž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž›αžΎαž€αžŠαŸ†αž”αžΌαž„αž“αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαŸ” αž‡αžΆαžœ!

Kubernetes αž‚αžΊαž„αžΆαž™αžŸαŸ’αžšαž½αž›αŸ” αž αŸαžαž»αž’αŸ’αžœαžΈαž”αžΆαž“αž‡αžΆαž’αž“αžΆαž‚αžΆαžšαž”αž„αŸ‹αž”αŸ’αžšαžΆαž€αŸ‹αž±αŸ’αž™αžαŸ’αž‰αž»αŸ†αž…αŸ’αžšαžΎαž“αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αžαŸ†αž”αž“αŸ‹αž“αŸαŸ‡ αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αž“αžšαžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αž’αžΆαž…αž’αŸ’αžœαžΎαž‡αžΆαž˜αŸ’αž…αžΆαžŸαŸ‹αž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆαž“αŸαŸ‡αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αžαŸ‚αž”αŸ‰αž»αž“αŸ’αž˜αžΆαž“αž˜αŸ‰αŸ„αž„?

αž€αžΆαžšαž”αž„αŸ’αžšαŸ€αž“ Kubernetes αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 1αŸ– αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ αž“αž·αž„αž€αž»αž„αžαžΊαž“αŸαžš

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αžŸαž„αŸ’αžŸαŸαž™αžαžΆ Kubernetes αž’αžΆαž…αžšαŸ€αž“αž”αžΆαž“αž™αŸ‰αžΆαž„αž†αžΆαž”αŸ‹αžšαž αŸαžŸ αžαŸ’αž‰αž»αŸ†αžŸαŸ’αž“αžΎαž±αŸ’αž™αž’αŸ’αž“αž€αž–αŸ’αž™αžΆαž™αžΆαž˜αž’αŸ’αžœαžΎαžœαžΆαžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αŸ” αž˜αžΆαž“αž“αŸαž™αžαžΆ αžŠαŸ„αž™αž”αžΆαž“αžŸαŸ’αž‘αžΆαžαŸ‹αž‡αŸ†αž“αžΆαž‰αžŸαž˜αŸ’αž—αžΆαžšαŸˆαž“αŸαŸ‡ αž’αŸ’αž“αž€αž“αžΉαž„αž’αžΆαž…αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌαž“αŸ…αž€αŸ’αž“αž»αž„αž…αž„αŸ’αž€αŸ„αž˜ Kubernetes αŸ” αžαŸ’αž‰αž»αŸ†αž’αžΆαž…αž’αžΆαž“αžΆαž”αžΆαž“ αž–αŸ’αžšαŸ„αŸ‡αžœαžΆαžŸαŸ’αžαž·αžαž“αŸ…αž€αŸ’αž“αž»αž„αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαžŠαžΌαž…αž‚αŸ’αž“αžΆαžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αŸ’αžšαžΎαž“αŸ…αž‘αžΈαž“αŸαŸ‡ αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αž„αŸ’αžšαŸ€αž“αž’αžαž·αžαž·αž‡αž“αžšαž”αžŸαŸ‹αž™αžΎαž„αž–αžΈαžšαž”αŸ€αž”αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ Kubernetes αŸ” αžαžΎαž’αŸ’αžœαžΈαž’αŸ’αžœαžΎαž±αŸ’αž™αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž“αŸαŸ‡αžαž»αžŸαž–αžΈαž’αŸ’αž“αž€αžŠαž‘αŸƒ? αžαžΆαž˜αž–αž·αžαžšαžΏαž„αž‡αžΆαž…αŸ’αžšαžΎαž“αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αžŸαž˜αŸ’αž—αžΆαžšαŸˆαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž—αžΆαž‚αž…αŸ’αžšαžΎαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ„αž™αž€αžΆαžšαž–αž“αŸ’αž™αž›αŸ‹αž’αŸ†αž–αžΈαžšαžΏαž„αžŸαžΆαž˜αž‰αŸ’αž‰ - αž‚αŸ„αž›αž‚αŸ†αž“αž·αžαžšαž”αžŸαŸ‹ Kubernetes αž“αž·αž„αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž“αŸƒαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ kubectl αŸ” αž’αŸ’αž“αž€αž“αž·αž–αž“αŸ’αž’αž“αŸƒαž’αžαŸ’αžαž”αž‘αž‘αžΆαŸ†αž„αž“αŸαŸ‡αžŸαž“αŸ’αž˜αžαŸ‹αžαžΆαž’αŸ’αž“αž€αž’αžΆαž“αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαžŸαŸŠαžΆαŸ†αž‡αžΆαž˜αž½αž™αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž˜αžΈαž€αŸ’αžšαžΌ αž“αž·αž„αž€αž»αž„αžαžΊαž“αŸαžš Docker αŸ” αž™αžΎαž„αž“αžΉαž„αž‘αŸ…αžœαž·αž’αžΈαž•αŸ’αžŸαŸαž„αŸ” αž‡αžΆαžŠαŸ†αž”αžΌαž„ αžŸαžΌαž˜αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎ microservices αž“αŸ…αž›αžΎαž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž™αžΎαž„αž“αžΉαž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž€αžΆαžšαž€αžŸαžΆαž„αžšαžΌαž”αž—αžΆαž–αž€αž»αž„αžαžΊαž“αŸαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌαž“αžΈαž˜αž½αž™αŸ—αŸ” αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡ αž™αžΎαž„αž“αžΉαž„αžŸαŸ’αž‚αžΆαž›αŸ‹ Kubernetes αž“αž·αž„αžœαž·αž—αžΆαž‚αž›αžΎαž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎ microservices αž“αŸ…αž€αŸ’αž“αž»αž„αž…αž„αŸ’αž€αŸ„αž˜αžŠαŸ‚αž›αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŠαŸ„αž™ KubernetesαŸ”

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

αž₯αž‘αžΌαžœαž“αŸαŸ‡ αžŠαŸ„αž™αž˜αž·αž“αž˜αžΆαž“αž€αžΆαžšαžšαŸ†αžαžΆαž“αž‘αŸ€αžαž‘αŸ αž…αžΌαžšαž™αžΎαž„αž‘αŸ…αž’αŸ’αžœαžΎαž€αžΆαžš αž αžΎαž™αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž™αžΎαž„αž“αžΉαž„αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αŸ”

αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž–αž·αžŸαŸ„αž’αž“αŸ

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

αž“αŸαŸ‡αž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž”αž„αŸ’αž’αž½αž…αžŸαŸ†αžαžΆαž“αŸ‹αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αŸαŸ‡αž˜αžΎαž›αž‘αŸ…αŸ”

αž€αžΆαžšαž”αž„αŸ’αžšαŸ€αž“ Kubernetes αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 1αŸ– αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ αž“αž·αž„αž€αž»αž„αžαžΊαž“αŸαžš
αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αžŽαŸ’αžαžΆαž‰αžœαž·αž—αžΆαž‚αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸ

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

  • SA-Frontend αž‚αžΊαž‡αžΆαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž”αžŽαŸ’αžαžΆαž‰ Nginx αžŠαŸ‚αž›αž”αž˜αŸ’αžšαžΎαž―αž€αžŸαžΆαžšαž‹αž·αžαž·αžœαž“αŸ’αž React αŸ”
  • SA-WebApp αž‚αžΊαž‡αžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‚αŸαž αž‘αŸ†αž–αŸαžšαžŠαŸ‚αž›αžŸαžšαžŸαŸαžšαž€αŸ’αž“αž»αž„ Java αžŠαŸ‚αž›αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŸαŸ†αžŽαžΎαž–αžΈαž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž˜αž»αžαŸ”
  • SA-Logic αž‚αžΊαž‡αžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Python αžŠαŸ‚αž›αž’αŸ’αžœαžΎαž€αžΆαžšαžœαž·αž—αžΆαž‚αž˜αž“αŸ„αžŸαž‰αŸ’αž…αŸαžαž“αžΆαŸ”

αžœαžΆαž‡αžΆαž€αžΆαžšαžŸαŸ†αžαžΆαž“αŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžαžΆαžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌαž˜αž·αž“αž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž—αžΆαž–αž―αž€αŸ„αž‘αŸαŸ” αž–αž½αž€αž‚αŸαž’αž“αž»αžœαžαŸ’αžαž‚αŸ†αž“αž·αžαž“αŸƒ "αž€αžΆαžšαž”αŸ‚αž„αž…αŸ‚αž€αž—αžΆαžšαž€αž·αž…αŸ’αž…" αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž–αž½αž€αž‚αŸαž€αŸ’αž“αž»αž„αž–αŸαž›αžαŸ‚αž˜αž½αž™αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αž‚αŸ’αž“αžΆαž‘αŸ…αžœαž·αž‰αž‘αŸ…αž˜αž€αŸ”

αž€αžΆαžšαž”αž„αŸ’αžšαŸ€αž“ Kubernetes αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 1αŸ– αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ αž“αž·αž„αž€αž»αž„αžαžΊαž“αŸαžš
αž›αŸ†αž αžΌαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ

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

  1. αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž»αž€αžšαž€αžŸαŸ’αž“αžΎαžŸαž»αŸ†αž―αž€αžŸαžΆαžšαž–αžΈαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ index.html (αžŠαŸ‚αž›αž“αŸ…αž€αŸ’αž“αž»αž„αžœαŸαž“αž•αŸ’αž‘αž»αž€αž€αž‰αŸ’αž…αž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ React) αŸ”
  2. αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž’αŸ’αžœαžΎαž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αž‡αžΆαž˜αž½αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž“αŸαŸ‡αž”αžŽαŸ’αžαžΆαž›αž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαž αŸ…αž‘αŸ…αž€αžΆαž“αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αžŽαŸ’αžαžΆαž‰αž•αŸ’αž’αŸ‚αž€αž›αžΎ Spring αŸ”
  3. αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αžŽαŸ’αžαžΆαž‰αž”αž‰αŸ’αž‡αžΌαž“αž”αž“αŸ’αžαžŸαŸ†αžŽαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž‰αŸ‚αž€αž’αžαŸ’αžαž”αž‘αž‘αŸ…αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Python αŸ”
  4. αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Python αžœαž·αž—αžΆαž‚αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž“αŸƒαž’αžαŸ’αžαž”αž‘ αž αžΎαž™αžαŸ’αžšαž‘αž”αŸ‹αž›αž‘αŸ’αž’αž•αž›αž‡αžΆαž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αž‘αŸ…αž“αžΉαž„αžŸαŸ†αžŽαžΎαŸ”
  5. αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Spring αž•αŸ’αž‰αžΎαž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αž‘αŸ…αž€αžΆαž“αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ React (αžŠαŸ‚αž›αž”αž„αŸ’αž αžΆαž‰αž›αž‘αŸ’αž’αž•αž›αž“αŸƒαž’αžαŸ’αžαž”αž‘αžŠαŸ‚αž›αž”αžΆαž“αž‰αŸ‚αž€αž‘αŸ…αž€αžΆαž“αŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹)αŸ”

αž€αžΌαžŠαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αž’αžΆαž…αžšαž€αž”αžΆαž“ αž“αŸ…αž‘αžΈαž“αŸαŸ‡. αžαŸ’αž‰αž»αŸ†αžŸαžΌαž˜αžŽαŸ‚αž“αžΆαŸ†αž±αŸ’αž™αž’αŸ’αž“αž€αž…αž˜αŸ’αž›αž„αžƒαŸ’αž›αžΆαŸ†αž„αž“αŸαŸ‡αž‘αŸ…αžαŸ’αž›αž½αž“αž’αŸ’αž“αž€αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž–αŸ’αžšαŸ„αŸ‡αž˜αžΆαž“αž€αžΆαžšαž–αž·αžŸαŸ„αž’αž“αŸαž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž‡αžΆαž…αŸ’αžšαžΎαž“αž‡αžΆαž˜αž½αž™αžœαžΆαž“αŸ…αžαžΆαž„αž˜αž»αžαž™αžΎαž„αŸ”

αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαžŸαŸαžœαžΆαžαŸ’αž“αžΆαžαžαžΌαž…αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“

αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž™αžΎαž„αžαŸ’αžšαžΌαžœαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž˜αžΈαž€αŸ’αžšαžΌαž‘αžΆαŸ†αž„αž”αžΈαŸ” αž…αžΌαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž–αž½αž€αž‚αŸαžŸαŸ’αž’αžΆαžαž”αŸ†αž•αž»αž - αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž˜αž»αžαŸ”

▍ αžšαŸ€αž”αž…αŸ† React αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“

αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ React αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžŠαŸ†αž‘αžΎαž„ Node.js framework αž“αž·αž„ NPM αž“αŸ…αž›αžΎαž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹β€‹αž–αžΈβ€‹αž’αŸ’αž“αž€β€‹αžŠαŸ†αž‘αžΎαž„β€‹αž‘αžΆαŸ†αž„β€‹αž’αžŸαŸ‹β€‹αž αžΎαž™ αžŸαžΌαž˜β€‹αž…αžΌαž›β€‹αž‘αŸ…β€‹αž”αŸ’αžšαžΎβ€‹αžŸαŸ’αžαžΆαž“αžΈαž™β€‹αž‘αŸ…β€‹αžαžβ€‹αž‚αž˜αŸ’αžšαŸ„αž„ sa-frontend αž αžΎαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

npm install

αžŠαŸ„αž™αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αžαžαž―αž€αžŸαžΆαžš node_modules αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ React αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‘αž»αž€ αž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆαžŠαŸ‚αž›αž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš package.json. αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž‘αžΆαž‰αž™αž€αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αž“αŸ…αž€αŸ’αž“αž»αž„αžαžαžŠαžΌαž…αž‚αŸ’αž“αžΆ αžŸαžΌαž˜αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

npm start

αž’αžŸαŸ‹αž αžΎαž™αŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ React αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž αžΎαž™αž’αžΆαž…αž…αžΌαž›αž”αŸ’αžšαžΎαž”αžΆαž“αžŠαŸ„αž™αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž»αž€αžšαž€ localhost:3000. αž’αŸ’αž“αž€αž’αžΆαž…αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž’αŸ’αžœαžΈαž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„αž›αŸαžαž€αžΌαžŠαžšαž”αžŸαŸ‹αž‚αžΆαžαŸ‹αŸ” αž’αŸ’αž“αž€αž“αžΉαž„αžƒαžΎαž‰αž₯αž‘αŸ’αž’αž·αž–αž›αž“αŸƒαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž»αž€αžšαž€αž—αŸ’αž›αžΆαž˜αŸ—αŸ” αž“αŸαŸ‡αž’αžΆαž…αž‘αŸ…αžšαž½αž…αžŠαŸ„αž™αžŸαžΆαžšαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž‚αŸαž αŸ…αžαžΆ "αž€αŸ’αžαŸ…" αž‡αŸ†αž“αž½αžŸαž˜αŸ‰αžΌαžŒαž»αž›αŸ” αž’αžšαž‚αž»αžŽαž…αŸ†αž–αŸ„αŸ‡αž”αž‰αŸ’αž αžΆαž“αŸαŸ‡ αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž˜αž»αžαž”αŸ’αžšαŸ‚αž‘αŸ…αž‡αžΆαž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαžŠαŸαžŸαžΆαž˜αž‰αŸ’αž‰ αž“αž·αž„αžšαžΈαž€αžšαžΆαž™αŸ”

▍ αž€αŸ†αž–αž»αž„αžšαŸ€αž”αž…αŸ†αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ React αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž•αž›αž·αž

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸ„αž›αž”αŸ†αžŽαž„αž“αŸƒαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ React αž–αž·αžαž”αŸ’αžšαžΆαž€αžŠ αž™αžΎαž„αžαŸ’αžšαžΌαžœαž”αŸ†αž”αŸ’αž›αŸ‚αž„αžœαžΆαž‘αŸ…αž‡αžΆαžŸαŸ†αžŽαž»αŸ†αž―αž€αžŸαžΆαžšαž‹αž·αžαž·αžœαž“αŸ’αž αž αžΎαž™αž”αž˜αŸ’αžšαžΎαžœαžΆαžŠαž›αŸ‹αž’αžαž·αžαž·αž‡αž“αžŠαŸ„αž™αž”αŸ’αžšαžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‚αŸαž αž‘αŸ†αž–αŸαžšαŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ React αž˜αŸ’αžαž„αž‘αŸ€αžαžŠαŸ„αž™αž”αŸ’αžšαžΎαžŸαŸ’αžαžΆαž“αžΈαž™ αžŸαžΌαž˜αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αžαžαž―αž€αžŸαžΆαžš sa-frontend αž αžΎαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

npm run build

αžœαžΆαž“αžΉαž„αž”αž„αŸ’αž€αžΎαžαžαžαž―αž€αžŸαžΆαžšαž€αŸ’αž“αž»αž„αžαžαž‚αž˜αŸ’αžšαŸ„αž„ build. αžœαžΆαž“αžΉαž„αž˜αžΆαž“αž―αž€αžŸαžΆαžšαž‹αž·αžαž·αžœαž“αŸ’αžαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ React αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ”

▍ αž”αž˜αŸ’αžšαžΎαž―αž€αžŸαžΆαžšαž‹αž·αžαž·αžœαž“αŸ’αžαž‡αžΆαž˜αž½αž™ Nginx

αžŠαŸ†αž”αžΌαž„αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžŠαŸ†αž‘αžΎαž„ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž”αžŽαŸ’αžαžΆαž‰ Nginx αŸ” αžœαžΆαž‚αžΊαž‡αžΆαž€αžΆαžš αž’αŸ’αž“αž€αž’αžΆαž…αž‘αžΆαž‰αž™αž€αžœαžΆ αž αžΎαž™αžŸαŸ’αžœαŸ‚αž„αžšαž€αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαŸ†αž‘αžΎαž„ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžœαžΆαŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž…αž˜αŸ’αž›αž„αž˜αžΆαžαž·αž€αžΆαž“αŸƒαžαž sa-frontend/build αž‘αŸ…αžαž [your_nginx_installation_dir]/html.

αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž“αŸαŸ‡ αž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž€αŸ†αž‘αž»αž„αž–αŸαž›αž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ React index.html αž“αžΉαž„αž˜αžΆαž“αž“αŸ… [your_nginx_installation_dir]/html/index.html. αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αžαžΆαž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ Nginx αž˜αžΆαž“αž”αž‰αŸ’αž αžΆαž“αŸ…αž–αŸαž›αž…αžΌαž›αž”αŸ’αžšαžΎαžœαžΆαŸ” αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αžαžΆαž”αŸ‹αž“αŸ…αž›αžΎαž…αŸ’αžšαž€αž˜αž½αž™αŸ” 80αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžŠαžΌαžšαžœαžΆαžαžΆαž˜αž”αŸ†αžŽαž„αžαžΆαž˜αžŠαŸ‚αž›αž’αŸ’αž“αž€αž…αž„αŸ‹αž”αžΆαž“αžŠαŸ„αž™αž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αž―αž€αžŸαžΆαžš [your_nginx_installation_dir]/conf/nginx.conf.

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž”αžΎαž€αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž»αž€αžšαž€αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž αžΎαž™αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹ localhost:80. αž’αŸ’αž“αž€αž“αžΉαž„αžƒαžΎαž‰αž‘αŸ†αž–αŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ React αŸ”

αž€αžΆαžšαž”αž„αŸ’αžšαŸ€αž“ Kubernetes αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 1αŸ– αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ αž“αž·αž„αž€αž»αž„αžαžΊαž“αŸαžš
αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ React αž”αž˜αŸ’αžšαžΎαžŠαŸ„αž™αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ Nginx

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž₯αž‘αžΌαžœαž“αŸαŸ‡αž”αž‰αŸ’αž…αžΌαž›αž’αŸ’αžœαžΈαž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαž› Type your sentence αž αžΎαž™αž…αž»αž…αž”αŸŠαžΌαžαž»αž„ Send - αž‚αŸ’αž˜αžΆαž“αž’αŸ’αžœαžΈαž“αžΉαž„αž€αžΎαžαž‘αžΎαž„αž‘αŸαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αž€αž»αž„αžŸαžΌαž› αž’αŸ’αž“αž€αž’αžΆαž…αžƒαžΎαž‰αžŸαžΆαžšαž€αŸ†αž αž»αžŸαž“αŸ…αž‘αžΈαž“αŸ„αŸ‡αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž™αž›αŸ‹αž…αŸ’αž”αžΆαžŸαŸ‹αž–αžΈαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αž€αŸ†αž αž»αžŸαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž€αžΎαžαž‘αžΎαž„ αž…αžΌαžšαž™αžΎαž„αžœαž·αž—αžΆαž‚αž€αžΌαžŠαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ”

▍ αž€αžΆαžšαžœαž·αž—αžΆαž‚αž€αžΌαžŠαž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαžΆαž„αž˜αž»αž

αžšαž€αž˜αžΎαž›αž›αŸαžαž€αžΌαžŠαž―αž€αžŸαžΆαžš App.jsαž™αžΎαž„αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αžαžΆαž…αž»αž…αž›αžΎαž”αŸŠαžΌαžαž»αž„ Send αž αŸ…αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž˜αž½αž™αŸ” analyzeSentence(). αž€αžΌαžŠαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ” αž€αŸ’αž“αž»αž„αž–αŸαž›αž‡αžΆαž˜αž½αž™αž‚αŸ’αž“αžΆαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹αž›αžΎαž€αžΆαžšαž–αž·αžαžŠαŸ‚αž›αžαžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž“αŸ’αž‘αžΆαžαŸ‹αž“αžΈαž˜αž½αž™αŸ—αžŠαŸ‚αž›αž˜αžΆαž“αž˜αžαž·αž™αŸ„αž”αž›αŸ‹αž“αŸƒαž‘αž˜αŸ’αžšαž„αŸ‹ # ΠΠΎΠΌΠ΅Ρ€αž˜αžΆαž“αž€αžΆαžšαž–αž“αŸ’αž™αž›αŸ‹αžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž€αžΌαžŠαŸ” αžŠαžΌαž…αž‚αŸ’αž“αžΆαžŠαŸ‚αžš αž™αžΎαž„αž“αžΉαž„αž‰αŸ‚αž€αž”αŸ†αžŽαŸ‚αž€αž€αžΌαžŠαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ”

analyzeSentence() {
    fetch('http://localhost:8080/sentiment', {  // #1
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({
                       sentence: this.textField.getValue()})// #2
    })
        .then(response => response.json())
        .then(data => this.setState(data));  // #3
}

1. URL αžŠαŸ‚αž›αžŸαŸ†αžŽαžΎ POST αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž‘αžΎαž„αŸ” αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαž“αŸ’αž˜αžαŸ‹αžαžΆαž‡αžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžšαž„αŸ‹αž…αžΆαŸ†αžŸαŸ†αžŽαžΎαž”αŸ‚αž”αž“αŸαŸ‡αŸ”

2.αž’αž„αŸ’αž‚αž—αžΆαž–αžŸαŸ†αžŽαžΎαžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αž‰αžΎαž‘αŸ…αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαžŸαŸ’αžαžΆαž”αŸαž“αžŸαŸ’αž“αžΎαžŸαž»αŸ†αŸ–

{
    sentence: "I like yogobella!"
}

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

const polarityComponent = this.state.polarity !== undefined ?
    <Polarity sentence={this.state.sentence} 
              polarity={this.state.polarity}/> :
    null;

αž€αžΌαžŠαž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αŸ’αž’αžŽαžΆαžŸαŸ‹αŸ” αžαžΎαž˜αžΆαž“αž’αŸ’αžœαžΈαžαž»αžŸαž“αŸ…αž‘αžΈαž“αŸαŸ‡? αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αžŸαž“αŸ’αž˜αžαŸ‹αžαžΆαž“αŸ…αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αžŠαŸ‚αž›αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αž–αž»αž„αž–αŸ’αž™αžΆαž™αžΆαž˜αž•αŸ’αž‰αžΎαžŸαŸ†αžŽαžΎ POST αž“αŸ„αŸ‡αž˜αž·αž“αž‘αžΆαž“αŸ‹αž˜αžΆαž“αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž’αžΆαž…αž‘αž‘αž½αž›αž™αž€ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ†αžŽαžΎαž“αŸαŸ‡αž”αžΆαž“αž‘αŸ αž“αŸ„αŸ‡αž’αŸ’αž“αž€αž“αžΉαž„αž–αž·αžαž‡αžΆαžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαŸ” αž–αŸ„αž›αž‚αžΊ αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ†αžŽαžΎαžŠαŸ‚αž›αž…αžΌαž›αž˜αž€αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ http://localhost:8080/sentimentαž™αžΎαž„αžαŸ’αžšαžΌαžœαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‚αŸαž αž‘αŸ†αž–αŸαžšαžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎ Spring αŸ”

αž€αžΆαžšαž”αž„αŸ’αžšαŸ€αž“ Kubernetes αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 1αŸ– αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ αž“αž·αž„αž€αž»αž„αžαžΊαž“αŸαžš
αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Spring αžŠαŸ‚αž›αž’αžΆαž…αž‘αž‘αž½αž›αž™αž€αžŸαŸ†αžŽαžΎ POST

▍ αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αžŽαŸ’αžαžΆαž‰αž•αŸ’αž’αŸ‚αž€αž›αžΎ Spring

αžŠαžΎαž˜αŸ’αž”αžΈαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Spring αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžš JDK8 αž“αž·αž„ Maven αž“αž·αž„αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αžŠαŸ‚αž›αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž™αŸ‰αžΆαž„αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž’αŸ’αž“αž€αžŠαŸ†αž‘αžΎαž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡ αž’αŸ’αž“αž€αž’αžΆαž…αž”αž“αŸ’αžαž’αŸ’αžœαžΎαž€αžΆαžšαž›αžΎαž‚αž˜αŸ’αžšαŸ„αž„αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ”

▍ αž€αžΆαžšαžœαŸαž…αžαŸ’αž…αž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‘αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαž–αžΆαž„

αžšαž»αž€αžšαž€ αžŠαŸ„αž™αž”αŸ’αžšαžΎαžŸαŸ’αžαžΆαž“αžΈαž™αž‘αŸ…αž€αžΆαž“αŸ‹αžαžαž―αž€αžŸαžΆαžš sa-webapp αž αžΎαž™αž”αž‰αŸ’αž…αžΌαž›αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

mvn install

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αžαž sa-webapp αžαžαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαž target. αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Java αž“αžΉαž„αž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ… αžαŸ’αž…αž”αŸ‹αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš jar αžαŸ†αžŽαžΆαž„αžŠαŸ„αž™αž―αž€αžŸαžΆαžš sentiment-analysis-web-0.0.1-SNAPSHOT.jar.

▍ αž€αžΆαžšαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Java

αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αžαžαž―αž€αžŸαžΆαžš target αž αžΎαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar

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

Error creating bean with name 'sentimentController': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'sa.logic.api.url' in value "${sa.logic.api.url}"

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž™αžΎαž„ αž’αŸ’αžœαžΈαžŠαŸ‚αž›αžŸαŸ†αžαžΆαž“αŸ‹αž”αŸ†αž•αž»αžαž“αŸ…αž‘αžΈαž“αŸαŸ‡αž‚αžΊαž€αžΆαžšαž›αžΎαž€αž‘αžΎαž„αž–αžΈαž—αžΆαž–αž˜αž·αž“αž’αžΆαž…αž–αž“αŸ’αž™αž›αŸ‹αž”αžΆαž“αž…αŸ’αž”αžΆαžŸαŸ‹αž–αžΈαž’αžαŸ’αžαž“αŸαž™ sa.logic.api.url. αž…αžΌαžšαž™αžΎαž„αžœαž·αž—αžΆαž‚αž€αžΌαžŠαžŠαŸ‚αž›αž€αŸ†αž αž»αžŸαž€αžΎαžαž‘αžΎαž„αŸ”

▍ αž€αžΆαžšαžœαž·αž—αžΆαž‚αž€αžΌαžŠαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Java

αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž–αŸαžαŸŒαž˜αžΆαž“αžŸαž„αŸ’αžαŸαž”αž“αŸƒαž€αžΌαžŠαžŠαŸ‚αž›αž€αŸ†αž αž»αžŸαž€αžΎαžαž‘αžΎαž„αŸ”

@CrossOrigin(origins = "*")
@RestController
public class SentimentController {
    @Value("${sa.logic.api.url}")    // #1
    private String saLogicApiUrl;
    @PostMapping("/sentiment")
    public SentimentDto sentimentAnalysis(
        @RequestBody SentenceDto sentenceDto) 
    {
        RestTemplate restTemplate = new RestTemplate();
        return restTemplate.postForEntity(
                saLogicApiUrl + "/analyse/sentiment",    // #2
                sentenceDto, SentimentDto.class)
                .getBody();
    }
}

  1. αž“αŸ…αž€αŸ’αž“αž»αž„ SentimentController αž˜αžΆαž“αžœαžΆαž›αž˜αž½αž™αŸ” saLogicApiUrl. αžαž˜αŸ’αž›αŸƒαžšαž”αžŸαŸ‹αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžŠαŸ„αž™αž‘αŸ’αžšαž–αŸ’αž™αžŸαž˜αŸ’αž”αžαŸ’αžαž· sa.logic.api.url.
  2. αž”αž“αŸ’αž‘αžΆαžαŸ‹ saLogicApiUrl αž—αŸ’αž‡αžΆαž”αŸ‹αž‡αžΆαž˜αž½αž™αžαž˜αŸ’αž›αŸƒ /analyse/sentiment. αž–αž½αž€αž‚αŸαžšαž½αž˜αž‚αŸ’αž“αžΆαž”αž„αŸ’αž€αžΎαžαž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž αŸ…αž‘αŸ…αž€αžΆαž“αŸ‹αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌαžŠαŸ‚αž›αž’αŸ’αžœαžΎαž€αžΆαžšαžœαž·αž—αžΆαž‚αž’αžαŸ’αžαž”αž‘αŸ”

▍ αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžαž˜αŸ’αž›αŸƒαž’αž…αž›αž“αž‘αŸ’αžšαž–αŸ’αž™

αž“αŸ…αž“αž·αž‘αžΆαžƒαžšαžŠαžΌαžœαž”αŸ’αžšαž—αž–αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αž“αŸƒαžαž˜αŸ’αž›αŸƒαž‘αŸ’αžšαž–αŸ’αž™αžŸαž˜αŸ’αž”αžαŸ’αžαž·αž‚αžΊαž‡αžΆαž―αž€αžŸαžΆαžš application.propertiesαžŠαŸ‚αž›αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αžƒαžΎαž‰αž“αŸ… sa-webapp/src/main/resources. αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αžΆαžšαž”αŸ’αžšαžΎαžœαžΆαž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž˜αž’αŸ’αž™αŸ„αž”αžΆαž™αžαŸ‚αž˜αž½αž™αž‚αžαŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ†αžŽαžαŸ‹αžαž˜αŸ’αž›αŸƒαž‘αŸ’αžšαž–αŸ’αž™αžŸαž˜αŸ’αž”αžαŸ’αžαž·αž“αŸ„αŸ‡αž‘αŸαŸ” αž’αŸ’αž“αž€αž€αŸαž’αžΆαž…αž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αž”αžΆαž“αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar --sa.logic.api.url=WHAT.IS.THE.SA.LOGIC.API.URL

αžαž˜αŸ’αž›αŸƒαž“αŸƒαž‘αŸ’αžšαž–αŸ’αž™αžŸαž˜αŸ’αž”αžαŸ’αžαž·αž“αŸαŸ‡αž‚αž½αžšαžαŸ‚αž…αž„αŸ’αž’αž»αž›αž‘αŸ…αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Python αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ”

αžαžΆαž˜αžšαž™αŸˆαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžœαžΆ αž™αžΎαž„αž”αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‚αŸαž αž‘αŸ†αž–αŸαžš Spring αž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αžœαžΆαžαŸ’αžšαžΌαžœαž‘αŸ…αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αžŸαŸ†αžŽαžΎαž‰αŸ‚αž€αž’αžαŸ’αžαž”αž‘αŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž€αž»αŸ†αž’αŸ’αžœαžΎαž±αŸ’αž™αž‡αžΈαžœαž·αžαžšαž”αžŸαŸ‹αž™αžΎαž„αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰ αž™αžΎαž„αž“αžΉαž„αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαžαžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Python αž“αžΉαž„αž˜αžΆαž“αž“αŸ… localhost:5000 αž αžΎαž™αž–αŸ’αž™αžΆαž™αžΆαž˜αž€αž»αŸ†αž—αŸ’αž›αŸαž…αž’αŸ†αž–αžΈαžœαžΆαŸ” αž‡αžΆαž›αž‘αŸ’αž’αž•αž› αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαžΎαž˜αŸ’αž”αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Spring αž“αžΉαž„αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ–

java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar --sa.logic.api.url=http://localhost:5000

αž€αžΆαžšαž”αž„αŸ’αžšαŸ€αž“ Kubernetes αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 1αŸ– αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ αž“αž·αž„αž€αž»αž„αžαžΊαž“αŸαžš
αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžšαž”αžŸαŸ‹αž™αžΎαž„αž”αžΆαžαŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Python

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Python αž αžΎαž™αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž“αžΉαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαžΌαž…αž€αžΆαžšαžšαŸ†αž–αžΉαž„αž‘αž»αž€αŸ”

▍ αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Python

αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Python αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžαŸ‚αžŠαŸ†αž‘αžΎαž„ Python 3 αž“αž·αž„ Pip αž αžΎαž™αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžαŸ‚αž˜αžΆαž“αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αžŸαž˜αžŸαŸ’αžšαž”αžŠαŸ‚αž›αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž±αŸ’αž™αž”αžΆαž“αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαŸ”

β–αžŠαŸ†αž‘αžΎαž„αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™

αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αžαžαž‚αž˜αŸ’αžšαŸ„αž„ sa-logic/sa αž αžΎαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

python -m pip install -r requirements.txt
python -m textblob.download_corpora

▍ αž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ

αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™ αž™αžΎαž„αžαŸ’αžšαŸ€αž˜αžαŸ’αž›αž½αž“αžšαž½αž…αž‡αžΆαžŸαŸ’αžšαŸαž…αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ–

python sentiment_analysis.py

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΆαž”αŸ‹αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜:

* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

αž“αŸαŸ‡αž˜αžΆαž“αž“αŸαž™αžαžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž αžΎαž™αžšαž„αŸ‹αž…αžΆαŸ†αž€αžΆαžšαžŸαŸ’αž“αžΎαžŸαž»αŸ†αž“αŸ… localhost:5000/

▍ αž€αžΆαžšαžŸαŸ’αžšαžΆαžœαž‡αŸ’αžšαžΆαžœαž€αžΌαžŠ

αžαŸ„αŸ‡αž˜αžΎαž›αž€αžΌαžŠαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Python αžŠαžΎαž˜αŸ’αž”αžΈαž™αž›αŸ‹αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αžœαžΆαž†αŸ’αž›αžΎαž™αžαž”αž‘αŸ…αž“αžΉαž„αžŸαŸ†αžŽαžΎαŸ–

from textblob import TextBlob
from flask import Flask, request, jsonify
app = Flask(__name__)                                   #1
@app.route("/analyse/sentiment", methods=['POST'])      #2
def analyse_sentiment():
    sentence = request.get_json()['sentence']           #3
    polarity = TextBlob(sentence).sentences[0].polarity #4
    return jsonify(                                     #5
        sentence=sentence,
        polarity=polarity
    )
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)                #6

  1. αž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžœαžαŸ’αžαž» Flask.
  2. αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαžŸαŸ†αžŽαžΎ POST αž‘αŸ…αžœαžΆαŸ”
  3. αž€αžΆαžšαž‘αžΆαž‰αž™αž€αž‘αŸ’αžšαž–αŸ’αž™αžŸαž˜αŸ’αž”αžαŸ’αžαž· sentence αž–αžΈαžŸαŸ’αžαžΆαž”αŸαž“αžŸαŸ’αž“αžΎαžŸαž»αŸ†αŸ”
  4. αž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžœαžαŸ’αžαž»αž’αž“αžΆαž˜αž·αž€ TextBlob αž“αž·αž„αž‘αž‘αž½αž›αž”αžΆαž“αžαž˜αŸ’αž›αŸƒ polarity αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸ†αžŽαžΎαžŠαŸ†αž”αžΌαž„αžŠαŸ‚αž›αž”αžΆαž“αž‘αž‘αž½αž›αž“αŸ…αž€αŸ’αž“αž»αž„αžαž½αž“αŸƒαžŸαŸ†αžŽαžΎ (αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αž™αžΎαž„ αž“αŸαŸ‡αž‚αžΊαž‡αžΆαžŸαŸ†αžŽαžΎαžαŸ‚αž˜αž½αž™αž‚αžαŸ‹αžŠαŸ‚αž›αž”αžΆαž“αžŠαžΆαž€αŸ‹αž‡αžΌαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžœαž·αž—αžΆαž‚)αŸ”
  5. αžαŸ’αžšαž‘αž”αŸ‹β€‹αž€αžΆαžšβ€‹αž†αŸ’αž›αžΎαž™β€‹αžαž” αžαž½β€‹αž’αž„αŸ’αž‚β€‹αžŠαŸ‚αž›β€‹αž˜αžΆαž“β€‹αž’αžαŸ’αžαž”αž‘β€‹αž“αŸƒβ€‹αž€αžΆαžšβ€‹αž•αŸ’αžαž›αŸ‹β€‹αž‡αžΌαž“ αž“αž·αž„β€‹αžŸαžΌαž…αž“αžΆαž€αžšβ€‹αžŠαŸ‚αž›β€‹αž”αžΆαž“β€‹αž‚αžŽαž“αžΆβ€‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αžœαžΆαŸ” polarity.
  6. αž€αžΆαžšαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Flask αžŠαŸ‚αž›αž“αžΉαž„αž˜αžΆαž“αž“αŸ… 0.0.0.0:5000 (αž’αŸ’αž“αž€αž€αŸαž’αžΆαž…αž…αžΌαž›αž”αŸ’αžšαžΎαžœαžΆαžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αžΆαžšαžŸαŸ’αžαžΆαž”αž“αžΆαž‘αž˜αŸ’αžšαž„αŸ‹ localhost:5000).

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

αž€αžΆαžšαž”αž„αŸ’αžšαŸ€αž“ Kubernetes αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 1αŸ– αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ αž“αž·αž„αž€αž»αž„αžαžΊαž“αŸαžš
αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαžΌαžœαž”αžΆαž“αž“αžΆαŸ†αž™αž€αž‘αŸ…αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžŠαŸ‚αž›αž˜αžΆαž“αžŸαž»αžαž—αžΆαž–αž›αŸ’αž’

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

αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αž‘αžΆαž”αŸ‹ αž™αžΎαž„αž“αžΉαž„αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž˜αžΈαž€αŸ’αžšαžΌαžšαž”αžŸαŸ‹αž™αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„ Docker containersαŸ” αž“αŸαŸ‡αž‚αžΊαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαžšαŸ€αž”αž…αŸ†αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž±αŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž…αž„αŸ’αž€αŸ„αž˜ Kubernetes αŸ”

αž’αž»αž„ Docker

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

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

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

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

▍ αž”αž˜αŸ’αžšαžΎαž―αž€αžŸαžΆαžšαž‹αž·αžαž·αžœαž“αŸ’αžαž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ React αžŠαŸ„αž™αž”αŸ’αžšαžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αž

αž€αžΆαžšαž–αŸ’αž™αžΆαž™αžΆαž˜αžšαŸ€αž”αž…αŸ†αž€αžΆαžšαžαŸ‚αž‘αžΆαŸ†αž―αž€αžŸαžΆαžšαž‹αž·αžαž·αžœαž“αŸ’αžαžŠαŸ„αž™αž”αŸ’αžšαžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αž αž™αžΎαž„αž“αžΉαž„αž‡αž½αž”αž”αŸ’αžšαž‘αŸ‡αž“αžΌαžœαž‚αž»αžŽαžœαž·αž”αžαŸ’αžαž·αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

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

αž€αžΆαžšαž”αž„αŸ’αžšαŸ€αž“ Kubernetes αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 1αŸ– αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ αž“αž·αž„αž€αž»αž„αžαžΊαž“αŸαžš
αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž”αžŽαŸ’αžαžΆαž‰ Nginx αž”αž˜αŸ’αžšαžΎαž―αž€αžŸαžΆαžšαž‹αž·αžαž·αžœαž“αŸ’αžαžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸ’αž“αž»αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αž

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αž»αž„αžαžΊαž“αŸαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαžŸαŸ’αžšαžŠαŸ€αž„αž‚αŸ’αž“αžΆαž“αŸ„αŸ‡ αž”αžΎαž”αŸ’αžšαŸ€αž”αž’αŸ€αž”αž‡αžΆαž˜αž½αž™αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αž αž—αžΆαž–αžαŸ’αž›αžΆαŸ†αž„αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžƒαžΎαž‰αŸ–

  1. αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž’αž“αž’αžΆαž“αž”αŸ’αžšαž€αž”αžŠαŸ„αž™αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αŸ– αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ„αž™αž”αŸ’αžšαžΎ Docker αŸ”
  2. αž―αž€αžšαžΆαž‡αŸ’αž™αž—αžΆαž–αž“αŸƒαžœαŸαž‘αž·αž€αžΆαŸ” αž€αž»αž„αžαžΊαž“αŸαžšαžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž’αžΆαž…αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αžΎαž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαž•αŸ’αž‘αžΆαž›αŸ‹αž“αžΉαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‘αžΈαž€αž“αŸ’αž›αŸ‚αž„αŸ”
  3. αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‘αž˜αŸ’αž„αž“αŸ‹αžŸαŸ’αžšαžΆαž›αžαžΆαž˜αžšαž™αŸˆαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸ’αžšαž‘αžΆαž”αŸ‹αžšαžΌαž”αž—αžΆαž–αŸ”

αž€αžΆαžšαž”αž„αŸ’αžšαŸ€αž“ Kubernetes αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 1αŸ– αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ αž“αž·αž„αž€αž»αž„αžαžΊαž“αŸαžš
αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž”αžŽαŸ’αžαžΆαž‰ Nginx αž”αž˜αŸ’αžšαžΎαž―αž€αžŸαžΆαžšαž‹αž·αžαž·αžœαž“αŸ’αžαžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸ’αž“αž»αž„αž€αž»αž„αžαžΊαž“αŸαžš

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

▍ αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž–αž€αž»αž„αžαžΊαž“αŸαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ React

αž”αŸ’αž›αž»αž€αž’αž‚αžΆαžšαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž“αŸƒαž’αž»αž„ Docker αž‚αžΊαž‡αžΆαž―αž€αžŸαžΆαžš Dockerfile. αž“αŸ…αžŠαžΎαž˜αž―αž€αžŸαžΆαžšαž“αŸαŸ‡ αžšαžΌαž”αž—αžΆαž–αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž“αŸƒαž€αž»αž„αžαžΊαž“αŸαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αžαŸ‹αžαŸ’αžšαžΆ αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž›αŸ†αžŠαžΆαž”αŸ‹αž“αŸƒαž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αžŠαŸ‚αž›αž”αž„αŸ’αž αžΆαž‰αž–αžΈαžšαž”αŸ€αž”αž”αž„αŸ’αž€αžΎαžαž€αž»αž„αžαžΊαž“αŸαžšαžŠαŸ‚αž›αž“αžΉαž„αž”αŸ†αž–αŸαž‰αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαžšαž”αžŸαŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ”

αž˜αž»αž“αž–αŸαž›αž™αžΎαž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž―αž€αžŸαžΆαžš Dockerfileαž…αž„αž…αžΆαŸ†αž“αžΌαžœαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αž’αŸ’αžœαžΎαžŠαžΎαž˜αŸ’αž”αžΈαžšαŸ€αž”αž…αŸ†αž―αž€αžŸαžΆαžšαž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ React αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αŸ’αž‘αž»αž€αž‘αžΎαž„αž‘αŸ…αž€αžΆαž“αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ NginxαŸ–

  1. αž€αžΆαžšαž€αžŸαžΆαž„αž€αž‰αŸ’αž…αž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ React (npm run build).
  2. αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ Nginx αŸ”
  3. αž€αžΆαžšαž…αž˜αŸ’αž›αž„αž˜αžΆαžαž·αž€αžΆαž“αŸƒαžαžαž―αž€αžŸαžΆαžš build αž–αžΈαžαžαž‚αž˜αŸ’αžšαŸ„αž„ sa-frontend αž‘αŸ…αžαžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ nginx/html.

αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αŸαŸ‡ αž’αŸ’αž“αž€αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αž—αžΆαž–αžŸαŸ’αžšαž”αž‚αŸ’αž“αžΆαžšαžœαžΆαž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž€αž»αž„αžαžΊαž“αŸαžš αž“αž·αž„αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αžαžΆαž„αž›αžΎαžŠαŸ‚αž›αž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž“αŸ…αž›αžΎαž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αŸ”

▍ αž€αŸ†αž–αž»αž„αžšαŸ€αž”αž…αŸ† Dockerfile αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ SA-Frontend

αžŸαŸαž…αž€αŸ’αžαžΈαžŽαŸ‚αž“αžΆαŸ†αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αž‰αŸ’αž…αžΌαž›αž€αŸ’αž“αž»αž„ Dockerfile αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αžΆαž€αŸ’αž™αžŸαž»αŸ† SA-Frontendαž˜αžΆαž“αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαŸ‚αž–αžΈαžšαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αž€αžΆαžšαž–αž·αžαž‚αžΊαžαžΆαž€αŸ’αžšαž»αž˜αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ Nginx αž”αžΆαž“αžšαŸ€αž”αž…αŸ†αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ αžšαžΌαž”αž—αžΆαž–αž˜αž½αž™ αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Nginx αžŠαŸ‚αž›αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž–αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž‡αŸ†αž αžΆαž“αž–αžΈαžšαžŠαŸ‚αž›αž™αžΎαž„αžαŸ’αžšαžΌαžœαž–αžŽαŸŒαž“αžΆαŸ–

  1. αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαž±αŸ’αž™αžšαžΌαž”αž—αžΆαž– Nginx αž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž“αŸƒαžšαžΌαž”αž—αžΆαž–αŸ”
  2. αž˜αžΆαžαž·αž€αžΆαžαžαž―αž€αžŸαžΆαžš sa-frontend/build αžαŸ’αžšαžΌαžœαž€αžΆαžšαž…αž˜αŸ’αž›αž„αž‘αŸ…αžαžαžšαžΌαž”αž—αžΆαž– nginx/html.

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αž‘αŸ…αž–αžΈαž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž“αŸαŸ‡αž‘αŸ…αž―αž€αžŸαžΆαžš Dockerfileαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αžœαžΆαž“αžΉαž„αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ–

FROM nginx
COPY build /usr/share/nginx/html

αžŠαžΌαž…αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αžƒαžΎαž‰αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž‚αžΊαžŸαžΆαž˜αž‰αŸ’αž‰αžŽαžΆαžŸαŸ‹αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αž˜αžΆαžαž·αž€αžΆαž“αŸƒαž―αž€αžŸαžΆαžšαžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αž”αŸ’αžšαŸ‚αž‘αŸ…αž‡αžΆαž’αžΆαž…αž’αžΆαž“αž”αžΆαž“αž“αž·αž„αž’αžΆαž…αž™αž›αŸ‹αž”αžΆαž“αŸ” αž―αž€αžŸαžΆαžšαž“αŸαŸ‡αž”αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž±αŸ’αž™αž™αž€αžšαžΌαž”αž—αžΆαž– nginx αž‡αžΆαž˜αž½αž™αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžŠαŸ‚αž›αžœαžΆαž˜αžΆαž“αžšαž½αž…αž αžΎαž™ αž αžΎαž™αž…αž˜αŸ’αž›αž„αž˜αžΆαžαž·αž€αžΆαž“αŸƒαžαž build αž‘αŸ…αž€αžΆαž“αŸ‹αžαžαž―αž€αžŸαžΆαžš nginx/html.

αž“αŸ…αž‘αžΈαž“αŸαŸ‡ αž’αŸ’αž“αž€αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž˜αžΆαž“αžŸαŸ†αžŽαž½αžšαž˜αž½αž™αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αžŠαžΉαž„αž–αžΈαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž…αž˜αŸ’αž›αž„αž―αž€αžŸαžΆαžšαž…αŸαž‰αž–αžΈαžαž buildαž–αŸ„αž›αž‚αžΊαžαžΎαž•αŸ’αž›αžΌαžœαž˜αž€αž–αžΈαžŽαžΆ /usr/share/nginx/html. αžαžΆαž˜αž–αž·αžαž‘αŸ… αž˜αž·αž“αž˜αžΆαž“αž’αŸ’αžœαžΈαžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž‘αŸαŸ” αž€αžΆαžšαž–αž·αžαž‚αžΊαžαžΆαž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ‚αž›αž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’αž’αžΆαž…αžšαž€αž”αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„ αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆ αžšαžΌαž”αž—αžΆαž–αŸ”

▍ αž€αžΆαžšαž•αŸ’αž‚αž»αŸ†αžšαžΌαž”αž—αžΆαž–αž αžΎαž™αž•αŸ’αž‘αž»αž€αžœαžΆαž‘αŸ…αžƒαŸ’αž›αžΆαŸ†αž„

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

  1. αžŠαŸ†αž‘αžΎαž„ Dockers.
  2. αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αž“αŸ…αž›αžΎαž‚αŸαž αž‘αŸ†αž–αŸαžš Docker Hub αŸ”
  3. αž…αžΌαž›αž‘αŸ…αž‚αžŽαž“αžΈαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αžŠαŸ„αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αžΈαž™αŸ–
    docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžš αžŠαŸ„αž™αž”αŸ’αžšαžΎαžŸαŸ’αžαžΆαž“αžΈαž™ αžŸαžΌαž˜αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αžαž sa-frontend αž αžΎαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡αŸ–

docker build -f Dockerfile -t $DOCKER_USER_ID/sentiment-analysis-frontend .

αž“αŸ…αž‘αžΈαž“αŸαŸ‡ αž“αž·αž„αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αŸ…αž€αŸ’αž“αž»αž„αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŸαŸ’αžšαžŠαŸ€αž„αž‚αŸ’αž“αžΆ $DOCKER_USER_ID αž‚αž½αžšαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‡αŸ†αž“αž½αžŸαžŠαŸ„αž™αžˆαŸ’αž˜αŸ„αŸ‡αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž“αŸ…αž›αžΎ Docker Hub αŸ” αž§αž‘αžΆαž αžšαžŽαŸ αž•αŸ’αž“αŸ‚αž€αž“αŸƒαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž“αŸαŸ‡αž’αžΆαž…αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ– rinormaloku/sentiment-analysis-frontend.

αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžαŸ’αž›αžΈαžŠαŸ„αž™αžŠαž€αž…αŸαž‰αž–αžΈαžœαžΆαŸ” -f Dockerfileαž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαžαžαžŠαŸ‚αž›αž™αžΎαž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž“αŸαŸ‡αž˜αžΆαž“αž―αž€αžŸαžΆαžšαž“αŸαŸ‡αžšαž½αž…αž αžΎαž™αŸ”

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

docker push $DOCKER_USER_ID/sentiment-analysis-frontend

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž”αž‰αŸ’αž…αž”αŸ‹αžœαžΆ αžŸαžΌαž˜αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž”αž‰αŸ’αž‡αžΈαžƒαŸ’αž›αžΆαŸ†αž„αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž“αŸ…αž›αžΎ Docker Hub αžŠαžΎαž˜αŸ’αž”αžΈαž˜αžΎαž›αžαžΆαžαžΎαžšαžΌαž”αž—αžΆαž–αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž»αž‰αž‘αŸ…αž€αž“αŸ’αž›αŸ‚αž„αž•αŸ’αž‘αž»αž€αž–αž–αž€αžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™αž¬αž’αžαŸ‹αŸ”

β–αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž’αž»αž„

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž“αžšαžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αž’αžΆαž…αž‘αžΆαž‰αž™αž€ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžšαžΌαž”αž—αžΆαž–αžŠαŸ‚αž›αž‚αŸαžŸαŸ’αž‚αžΆαž›αŸ‹αžαžΆαž‡αžΆ $DOCKER_USER_ID/sentiment-analysis-frontend. αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αŸ†αžŠαžΆαž”αŸ‹αž“αŸƒαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸˆ

docker pull $DOCKER_USER_ID/sentiment-analysis-frontend
docker run -d -p 80:80 $DOCKER_USER_ID/sentiment-analysis-frontend

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž€αž»αž„αžαžΊαž“αŸαžšαž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž αžΎαž™αž™αžΎαž„αž’αžΆαž…αž”αž“αŸ’αžαž’αŸ’αžœαžΎαž€αžΆαžšαžŠαŸ„αž™αž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž–αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžŠαŸ‚αž›αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αž»αž“αž–αŸαž›αž™αžΎαž„αž”αž“αŸ’αžαžŸαžΌαž˜αž™αž›αŸ‹αž–αžΈαž€αžΆαžšαžšαž…αž“αžΆ 80:80αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αžƒαžΎαž‰αž“αŸ…αž€αŸ’αž“αž»αž„αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžšαžΌαž”αž—αžΆαž– αž αžΎαž™αž’αžΆαž…αž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαž˜αžΆαž“αž€αžΆαžšαž—αŸαž“αŸ’αžαž…αŸ’αžšαž‘αŸ†αŸ”

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

αžŸαžΌαž˜αž–αž·αž…αžΆαžšαžŽαžΆαž§αž‘αžΆαž αžšαžŽαŸαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ”

αž€αžΆαžšαž”αž„αŸ’αžšαŸ€αž“ Kubernetes αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 1αŸ– αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ αž“αž·αž„αž€αž»αž„αžαžΊαž“αŸαžš
αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αž”αž“αŸ’αžαž…αŸ’αžšαž€

αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αž‰αŸ’αž‡αžΌαž“αžŸαŸ†αžŽαžΎαž–αžΈαž…αŸ’αžšαž€ <hostPort> αž‘αŸ…αž€αŸ†αž–αž„αŸ‹αž•αŸ‚ <containerPort>. αž“αŸ„αŸ‡αž‚αžΊαž€αžΆαžšαž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž…αŸ’αžšαž€ 80 αž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž”αž“αŸ’αžαž‘αŸ…αž€αžΆαž“αŸ‹αž…αŸ’αžšαž€ 80 αž’αž»αž„αŸ”

αž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαž…αŸ’αžšαž€ 80 αž”αžΆαž“αž”αžΎαž€αž“αŸ…αž›αžΎαž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ αž’αŸ’αž“αž€αž’αžΆαž…αž…αžΌαž›αž”αŸ’αžšαžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž–αžΈαž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαž“αŸαŸ‡αž“αŸ… localhost:80. αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž”αŸ’αžšαž–αŸαž“αŸ’αž’αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž˜αž·αž“αž‚αžΆαŸ†αž‘αŸ’αžš Docker αž’αŸ’αž“αž€αž’αžΆαž…αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αž Docker αžŠαŸ‚αž›αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αž“αžΉαž„αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž… <docker-machine ip>:80. αžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αžœαŸ‚αž„αžšαž€αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ IP αžšαž”αžŸαŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αž Docker αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ docker-machine ip.

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

αž―αž€αžŸαžΆαžš ▍.dockerignore

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž–αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ SA-Frontendαž™αžΎαž„αž’αžΆαž…αž€αžαŸ‹αžŸαŸ†αž‚αžΆαž›αŸ‹αžαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸαŸ‡αž‚αžΊαž™αžΊαžαžαŸ’αž›αžΆαŸ†αž„αžŽαžΆαžŸαŸ‹αŸ” αž“αŸαŸ‡αž‚αžΊαžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž”αžšαž·αž”αž‘αž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž–αžαŸ’αžšαžΌαžœαžαŸ‚αž•αŸ’αž‰αžΎαž‘αŸ…αžŠαŸαž˜αž·αž“ Docker αŸ” αžαžαžŠαŸ‚αž›αžαŸ†αžŽαžΆαž„αž±αŸ’αž™αž”αžšαž·αž”αž‘αžŸαŸ’αžαžΆαž”αž“αžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž‡αžΆαž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž…αŸ†αž–αŸ„αŸ‡αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ docker build. αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αž™αžΎαž„ αž˜αžΆαž“αž…αŸ†αž“αž»αž…αž˜αž½αž™αž“αŸ…αž…αž»αž„αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸƒαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž“αŸαŸ‡αŸ” αž“αŸαŸ‡αž”αžŽαŸ’αžαžΆαž›αž±αŸ’αž™αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž“αŸ…αž€αŸ’αž“αž»αž„αž”αžšαž·αž”αž‘αž“αŸƒαž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆ:

sa-frontend:
|   .dockerignore
|   Dockerfile
|   package.json
|   README.md
+---build
+---node_modules
+---public
---src

αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αžαžαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž˜αžΆαž“αžœαžαŸ’αžαž˜αžΆαž“αž“αŸ…αž‘αžΈαž“αŸαŸ‡ αž™αžΎαž„αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžαŸ’αžšαžΌαžœαž€αžΆαžšαžαžαž―αž€αžŸαžΆαžšαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” build. αž€αžΆαžšαž‘αžΆαž‰αž™αž€αž’αŸ’αžœαžΈαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž‚αžΊαž‡αžΆαž€αžΆαžšαžαŸ’αž‡αŸ‡αžαŸ’αž‡αžΆαž™αž–αŸαž›αžœαŸαž›αžΆαŸ” αž’αŸ’αž“αž€αž’αžΆαž…αž”αž„αŸ’αž€αžΎαž“αž›αŸ’αž”αžΏαž“αž“αŸƒαž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžŠαŸ„αž™αž”αŸ’αžšαžΆαž”αŸ‹ Docker αžαžΆαžαžΎαžαžαž˜αž½αž™αžŽαžΆαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž˜αž·αž“αž’αžΎαž–αžΎαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž―αž€αžŸαžΆαžš .dockerignore. αž’αŸ’αž“αž€, αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αžŸαŸŠαžΆαŸ†αž‡αžΆαž˜αž½αž™αž―αž€αžŸαžΆαžš .gitignoreαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸƒαž―αž€αžŸαžΆαžšαž“αŸαŸ‡αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž˜αžΎαž›αž‘αŸ…αž’αŸ’αž›αžΆαž”αŸ‹αžŸαŸ’αž‚αžΆαž›αŸ‹αŸ” αžœαžΆαžšαžΆαž™αž”αž‰αŸ’αž‡αžΈαžαžαžŠαŸ‚αž›αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž–αž’αžΆαž…αž˜αž·αž“αž’αžΎαž–αžΎαŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αž™αžΎαž„ αžαŸ’αž›αžΉαž˜αžŸαžΆαžšαž“αŸƒαž―αž€αžŸαžΆαžšαž“αŸαŸ‡αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ–

node_modules
src
public

αž―αž€αžŸαžΆαžš .dockerignore αžαŸ’αžšαžΌαžœαžαŸ‚αž“αŸ…αž€αŸ’αž“αž»αž„αžαžαžŠαžΌαž…αž‚αŸ’αž“αžΆαž‡αžΆαž˜αž½αž™αž―αž€αžŸαžΆαžš Dockerfile. αž₯αž‘αžΌαžœαž“αŸαŸ‡αž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαž“αŸƒαžšαžΌαž”αž—αžΆαž–αž“αžΉαž„αž…αŸ†αžŽαžΆαž™αž–αŸαž›αž–αžΈαžšαž”αžΈαžœαž·αž“αžΆαž‘αžΈαŸ”

αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž…αžΌαžšαž™αžΎαž„αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‡αžΆαž˜αž½αž™αžšαžΌαž”αž—αžΆαž–αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Java αŸ”

▍ αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž–αž€αž»αž„αžαžΊαž“αŸαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Java

αž’αŸ’αž“αž€αžŠαžΉαž„αž–αžΈαž’αŸ’αžœαžΈ αž αžΎαž™αž’αŸ’αž“αž€αž”αžΆαž“αžšαŸ€αž“αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžŠαŸ‚αž›αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž–αž€αž»αž„αžαžΊαž“αŸαžšαŸ” αž“αŸ„αŸ‡αž αžΎαž™αž‡αžΆαž˜αžΌαž›αž αŸαžαž»αžŠαŸ‚αž›αž•αŸ’αž“αŸ‚αž€αž“αŸαŸ‡αž“αžΉαž„αžαŸ’αž›αžΈαžŽαžΆαžŸαŸ‹αŸ”

αž”αžΎαž€αž―αž€αžŸαžΆαžš DockerfileαžŠαŸ‚αž›αž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ…αž€αŸ’αž“αž»αž„αžαžαž‚αž˜αŸ’αžšαŸ„αž„ sa-webapp. αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž’αžΆαž“αž’αžαŸ’αžαž”αž‘αž“αŸƒαž―αž€αžŸαžΆαžšαž“αŸαŸ‡ αž“αŸ„αŸ‡αž’αŸ’αž“αž€αž“αžΉαž„αž‡αž½αž”αžαŸ‚αžŸαŸ†αžŽαž„αŸ‹αžαŸ’αž˜αžΈαž–αžΈαžšαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αžŠαŸ‚αž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ„αž™αž–αžΆαž€αŸ’αž™αž‚αž“αŸ’αž›αžΉαŸ‡ ENV ΠΈ EXPOSE:

ENV SA_LOGIC_API_URL http://localhost:5000
…
EXPOSE 8080

αž–αžΆαž€αŸ’αž™αž‚αž“αŸ’αž›αžΉαŸ‡ ENV αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αŸ’αžšαž€αžΆαžŸαž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž’αž»αž„ Docker αŸ” αž‡αžΆαž–αž·αžŸαŸαžŸαž“αŸ…αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αž™αžΎαž„ αžœαžΆαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž€αŸ†αžŽαžαŸ‹ URL αžŠαžΎαž˜αŸ’αž”αžΈαž…αžΌαž›αž”αŸ’αžšαžΎ API αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž’αŸ’αžœαžΎαž€αžΆαžšαžœαž·αž—αžΆαž‚αž’αžαŸ’αžαž”αž‘αŸ”

αž–αžΆαž€αŸ’αž™αž‚αž“αŸ’αž›αžΉαŸ‡ EXPOSE αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αŸ’αžšαžΆαž”αŸ‹ Docker αž±αŸ’αž™αž”αžΎαž€αž…αŸ’αžšαž€αŸ” αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαž…αŸ’αžšαž€αž“αŸαŸ‡αž“αŸ…αž–αŸαž›αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ” αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž’αŸ’αž“αž€αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αžαžΆαž“αŸ…αž€αŸ’αž“αž»αž„ Dockerfile αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αžΆαž€αŸ’αž™αžŸαž»αŸ† SA-Frontend αž˜αž·αž“αž˜αžΆαž“αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž”αŸ‚αž”αž“αŸαŸ‡αž‘αŸαŸ” αž“αŸαŸ‡αž‚αžΊαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸ„αž›αž”αŸ†αžŽαž„αž―αž€αžŸαžΆαžšαžαŸ‚αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ αž”αžΎαž“αž·αž™αžΆαž™αž˜αŸ’αž™αŸ‰αžΆαž„αž‘αŸ€αž αž€αžΆαžšαžŸαžΆαž„αžŸαž„αŸ‹αž“αŸαŸ‡αž‚αžΊαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž’αžΆαž“ Dockerfile.

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž–αž αžΎαž™αžšαž»αž‰αžœαžΆαž‘αŸ…αžƒαŸ’αž›αžΆαŸ†αž„αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž§αž‘αžΆαž αžšαžŽαŸαž˜αž»αž“αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž˜αž·αž“αž‘αžΆαž“αŸ‹αž˜αžΆαž“αž‘αŸ†αž“αž»αž€αž…αž·αžαŸ’αžαžαŸ’αž›αžΆαŸ†αž„αž›αžΎαžŸαž˜αžαŸ’αžαž—αžΆαž–αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‘αŸ αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž’αžΆαž…αžšαž€αž”αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš README.md αž€αŸ’αž“αž»αž„αžαžαž―αž€αžŸαžΆαžš sa-webapp.

▍ αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž–αž€αž»αž„αžαžΊαž“αŸαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Python

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αžαŸ’αž›αžΉαž˜αžŸαžΆαžšαž“αŸƒαž―αž€αžŸαžΆαžš Dockerfile αž€αŸ’αž“αž»αž„αžαžαž―αž€αžŸαžΆαžš sa-logicαž’αŸ’αž“αž€αž“αžΉαž„αž˜αž·αž“αžšαž€αžƒαžΎαž‰αž’αŸ’αžœαžΈαžαŸ’αž˜αžΈαž“αŸ…αž‘αžΈαž“αŸ„αŸ‡αž‘αŸαŸ” αž–αžΆαž€αŸ’αž™β€‹αž”αž‰αŸ’αž‡αžΆβ€‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αž€αžΆαžšβ€‹αž”αž„αŸ’αž€αžΎαžβ€‹αžšαžΌαž”αž—αžΆαž– αž“αž·αž„β€‹αžšαž»αž‰β€‹αžœαžΆβ€‹αž‘αŸ…β€‹αžƒαŸ’αž›αžΆαŸ†αž„β€‹αž‚αž½αžšαžαŸ‚β€‹αž’αŸ’αž›αžΆαž”αŸ‹β€‹αžŸαŸ’αž‚αžΆαž›αŸ‹β€‹αž’αŸ’αž“αž€β€‹αžšαž½αž…β€‹αž αžΎαž™ αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αžŠαžΌαž…β€‹αž‡αžΆβ€‹αž“αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžšαžŽαžΈβ€‹αž“αŸƒβ€‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈβ€‹αž•αŸ’αžŸαŸαž„β€‹αž‘αŸ€αžβ€‹αžšαž”αžŸαŸ‹β€‹αž™αžΎαž„ αž–αž½αž€αžœαžΆβ€‹αž’αžΆαž…β€‹αžšαž€β€‹αžƒαžΎαž‰β€‹αž€αŸ’αž“αž»αž„β€‹αž―αž€αžŸαžΆαžš README.md αž€αŸ’αž“αž»αž„αžαžαž―αž€αžŸαžΆαžš sa-logic.

▍ αžŸαžΆαž€αž›αŸ’αž”αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαžΆαž€αŸ‹αž’αž»αž„

αžαžΎαž’αŸ’αž“αž€αž’αžΆαž…αž‡αžΏαž‡αžΆαž€αŸ‹αž›αžΎαž’αŸ’αžœαžΈαž˜αž½αž™αžŠαŸ‚αž›αž’αŸ’αž“αž€αž˜αž·αž“αž‘αžΆαž“αŸ‹αž”αžΆαž“αžŸαžΆαž€αž›αŸ’αž”αž„αž‘αŸ? αžαŸ’αž‰αž»αŸ†αž€αŸαž˜αž·αž“αž’αžΆαž…αžŠαŸ‚αžšαŸ” αžαŸ„αŸ‡αžŸαžΆαž€αž›αŸ’αž”αž„αž’αž»αž„αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ”

  1. αžαŸ„αŸ‡αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž’αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ sa-logic αž αžΎαž™αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžœαžΆαžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αžαžΆαž”αŸ‹αž“αŸ…αž›αžΎαž…αŸ’αžšαž€ 5050:
    docker run -d -p 5050:5000 $DOCKER_USER_ID/sentiment-analysis-logic
  2. αžαŸ„αŸ‡αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž’αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ sa-webapp αž αžΎαž™αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžœαžΆαžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αžαžΆαž”αŸ‹αž“αŸ…αž›αžΎαž…αŸ’αžšαž€ 8080. αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ€αž αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αŸ†αžŽαžαŸ‹αž…αŸ’αžšαž€αžŠαŸ‚αž›αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Python αž“αžΉαž„αžŸαŸ’αžαžΆαž”αŸ‹αžŸαŸ†αžŽαžΎαž–αžΈαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Java αžŠαŸ„αž™αž€αŸ†αžŽαžαŸ‹αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αž‘αžΎαž„αžœαž·αž‰αŸ” SA_LOGIC_API_URL:
    $ docker run -d -p 8080:8080 -e SA_LOGIC_API_URL='http://<container_ip or docker machine ip>:5000' $DOCKER_USER_ID/sentiment-analysis-web-app

αžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹αž–αžΈαžšαž”αŸ€αž”αžŸαŸ’αžœαŸ‚αž„αžšαž€αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ IP αžšαž”αžŸαŸ‹αž€αž»αž„αžαžΊαž“αŸαžš ឬ Docker VM αžŸαžΌαž˜αž˜αžΎαž›αž―αž€αžŸαžΆαžš README.

αžαŸ„αŸ‡αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž’αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ sa-frontend:

docker run -d -p 80:80 $DOCKER_USER_ID/sentiment-analysis-frontend

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž‚αžΊαžšαž½αž…αžšαžΆαž›αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαžšαž»αž€αžšαž€αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž»αž€αžšαž€αž‘αŸ…αž€αžΆαž“αŸ‹αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ localhost:80 αž“αž·αž„αžŸαžΆαž€αž›αŸ’αž”αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ”

αžŸαžΌαž˜αž…αŸ†αžŽαžΆαŸ†αžαžΆαž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž…αŸ’αžšαž€αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ sa-webappαž¬αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš Docker VM αž’αŸ’αž“αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αž―αž€αžŸαžΆαžš App.js αž–αžΈαžαž sa-frontendαžŠαŸ„αž™αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ IP αž¬αž›αŸαžαž…αŸ’αžšαž€αž€αŸ’αž“αž»αž„αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš analyzeSentence()αžŠαŸ„αž™αž€αžΆαžšαž‡αŸ†αž“αž½αžŸαž–αŸαžαŸŒαž˜αžΆαž“αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž‡αŸ†αž“αž½αžŸαž±αŸ’αž™αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž›αŸ‚αž„αž”αŸ’αžšαžΎαŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†αžšαžΌαž”αž—αžΆαž–αž‘αžΎαž„αžœαž·αž‰αž αžΎαž™αž”αŸ’αžšαžΎαžœαžΆαŸ”

αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αžŠαŸ’αž™αžΆαž€αŸ’αžšαžΆαž˜αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž™αžΎαž„αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž‡αžΆαž₯αž‘αžΌαžœαž“αŸαŸ‡αŸ”

αž€αžΆαžšαž”αž„αŸ’αžšαŸ€αž“ Kubernetes αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 1αŸ– αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ αž“αž·αž„αž€αž»αž„αžαžΊαž“αŸαžš
αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸ’αž“αž»αž„αž’αž»αž„

αžŸαŸαž…αž€αŸ’αžαžΈαžŸαž„αŸ’αžαŸαž”αŸ– αž αŸαžαž»αž’αŸ’αžœαžΈαž”αžΆαž“αž‡αžΆαž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž…αž„αŸ’αž€αŸ„αž˜ Kubernetes?

αž™αžΎαž„αž‘αžΎαž”αžαŸ‚αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž―αž€αžŸαžΆαžš Dockerfileαž”αžΆαž“αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž– αž“αž·αž„αžšαž»αž‰αž–αž½αž€αžœαžΆαž‘αŸ…αžƒαŸ’αž›αžΆαŸ†αž„ Docker αŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ€αž αž™αžΎαž„αž”αžΆαž“αžšαŸ€αž“αž–αžΈαžšαž”αŸ€αž”αž”αž„αŸ’αž€αžΎαž“αž›αŸ’αž”αžΏαž“αž“αŸƒαž€αžΆαžšαž•αŸ’αž‚αž»αŸ†αžšαžΌαž”αž—αžΆαž–αžŠαŸ„αž™αž”αŸ’αžšαžΎαž―αž€αžŸαžΆαžš .dockerignore. αž‡αžΆαž›αž‘αŸ’αž’αž•αž› αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌαžšαž”αžŸαŸ‹αž™αžΎαž„αž₯αž‘αžΌαžœαž“αŸαŸ‡αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„ Docker containersαŸ” αž“αŸ…αž‘αžΈαž“αŸαŸ‡ αž’αŸ’αž“αž€αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž˜αžΆαž“αžŸαŸ†αžŽαž½αžšαžŸαž˜αž αŸαžαž»αž•αž›αž‘αžΆαŸ†αž„αžŸαŸ’αžšαž»αž„αž’αŸ†αž–αžΈαž˜αžΌαž›αž αŸαžαž»αžŠαŸ‚αž›αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžš Kubernetes αŸ” αž…αž˜αŸ’αž›αžΎαž™αž…αŸ†αž–αŸ„αŸ‡αžŸαŸ†αžŽαž½αžšαž“αŸαŸ‡αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž§αž‘αŸ’αž‘αž·αžŸαžŠαž›αŸ‹αž•αŸ’αž“αŸ‚αž€αž‘αžΈαž–αžΈαžšαž“αŸƒαžŸαž˜αŸ’αž—αžΆαžšαŸˆαž“αŸαŸ‡αŸ” αž€αŸ’αž“αž»αž„αž–αŸαž›αž“αŸαŸ‡ αžŸαžΌαž˜αž–αž·αž…αžΆαžšαžŽαžΆαžŸαŸ†αžŽαž½αžšαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–
αž…αžΌαžšαžŸαž“αŸ’αž˜αžαžαžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‚αŸαž αž‘αŸ†αž–αŸαžšαž€αžΆαžšαžœαž·αž—αžΆαž‚αž’αžαŸ’αžαž”αž‘αžšαž”αžŸαŸ‹αž™αžΎαž„αž”αžΆαž“αž€αŸ’αž›αžΆαž™αž‘αŸ…αž‡αžΆαž€αžΆαžšαž–αŸαž‰αž“αž·αž™αž˜αž‘αžΌαž‘αžΆαŸ†αž„αž–αž·αž—αž–αž›αŸ„αž€αŸ” αžŸαŸ†αžŽαžΎαžšαžΆαž”αŸ‹αž›αžΆαž“αž˜αž€αžšαž€αž‚αžΆαžαŸ‹αžšαžΆαž›αŸ‹αž“αžΆαž‘αžΈαŸ” αž“αŸαŸ‡αž˜αžΆαž“αž“αŸαž™αžαžΆαžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ sa-webapp ΠΈ sa-logic αž“αžΉαž„αžŸαŸ’αžαž·αžαž“αŸ…αž€αŸ’αžšαŸ„αž˜αž—αžΆαž–αžαžΆαž“αžαžΉαž„αžŠαŸαž’αŸ†αžŸαž˜αŸ’αž”αžΎαž˜αŸ” αžšαž”αŸ€αž”αž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž’αž»αž„αžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αžΈαž€αŸ’αžšαžΌαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜?

αž€αžΆαžšαž”αž„αŸ’αžšαŸ€αž“ Kubernetes αž•αŸ’αž“αŸ‚αž€αž‘αžΈ 1αŸ– αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αžŸαŸαžœαžΆαž˜αžΈαž€αŸ’αžšαžΌ αž“αž·αž„αž€αž»αž„αžαžΊαž“αŸαžš

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

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