āĻŽāĻžāχāĻ•ā§āϰ⧋āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāϤ⧇ āĻšāϝāĻŧ āϤāĻž āϜāĻžāύ⧁āύāĨ¤ āĻĒāĻžāĻ°ā§āϟ 1. āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻŦ⧁āϟ āĻāĻŦāĻ‚ āĻĄāĻ•āĻžāϰ

āĻŽāĻžāχāĻ•ā§āϰ⧋āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāϤ⧇ āĻšāϝāĻŧ āϤāĻž āϜāĻžāύ⧁āύāĨ¤ āĻĒāĻžāĻ°ā§āϟ 1. āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻŦ⧁āϟ āĻāĻŦāĻ‚ āĻĄāĻ•āĻžāϰ

āφāϰ⧇ āĻšāĻžāĻŦāϰāĨ¤

āĻāχ āύāĻŋāĻŦāĻ¨ā§āϧ⧇, āφāĻŽāĻŋ āĻŽāĻžāχāĻ•ā§āϰ⧋āϏāĻžāĻ°ā§āĻ­āĻŋāϏ⧇ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻļ⧇āĻ–āĻžāϰ āĻĒāϰāĻŋāĻŦ⧇āĻļ āϤ⧈āϰāĻŋāϤ⧇ āφāĻŽāĻžāϰ āĻ…āĻ­āĻŋāĻœā§āĻžāϤāĻž āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻ•āĻĨāĻž āĻŦāϞāϤ⧇ āϚāĻžāχāĨ¤ āϝāĻ–āύ āφāĻŽāĻŋ āĻĒā§āϰāϤāĻŋāϟāĻŋ āύāϤ⧁āύ āϟ⧁āϞ āĻļāĻŋāϖ⧇āĻ›āĻŋ, āφāĻŽāĻŋ āϏāĻŦāϏāĻŽāϝāĻŧ āĻāϟāĻŋ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ āĻŽā§‡āĻļāĻŋāύ⧇ āύāϝāĻŧ, āφāϰāĻ“ āĻŦāĻžāĻ¸ā§āϤāĻŦāϏāĻŽā§āĻŽāϤ āĻĒāϰāĻŋāĻ¸ā§āĻĨāĻŋāϤāĻŋāϤ⧇āĻ“ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāϤ⧇ āĻšā§‡āϝāĻŧ⧇āĻ›āĻŋāϞāĻžāĻŽāĨ¤ āĻ…āϤāĻāĻŦ, āφāĻŽāĻŋ āĻāĻ•āϟāĻŋ āϏāϰāϞ⧀āĻ•ā§ƒāϤ āĻŽāĻžāχāĻ•ā§āϰ⧋āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤ āύāĻŋāϝāĻŧ⧇āĻ›āĻŋ, āϝāĻž āĻĒāϰ⧇ āϏāĻŽāĻ¸ā§āϤ āϧāϰāϪ⧇āϰ āφāĻ•āĻ°ā§āώāĻŖā§€āϝāĻŧ āĻĒā§āϰāϝ⧁āĻ•ā§āϤāĻŋāϰ āϏāĻžāĻĨ⧇ "āφāĻšā§āĻ›āĻ¨ā§āύ" āĻšāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāϧāĻžāύ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧāϤāĻž āĻšāϞ āĻŦāĻžāĻ¸ā§āϤāĻŦ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āϏāĻ°ā§āĻŦāĻžāϧāĻŋāĻ• āĻ•āĻžāĻ°ā§āϝāĻ•āϰ⧀ āύ⧈āĻ•āĻŸā§āϝāĨ¤

āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ•āĻ­āĻžāĻŦ⧇, āφāĻŽāĻŋ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āύāĻŋāĻ°ā§āĻŽāĻžāĻŖāϕ⧇ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āϧāĻžāĻĒ⧇ āϭ⧇āϙ⧇ āĻĻāĻŋāϝāĻŧ⧇āĻ›āĻŋ:

  1. āĻĻ⧁āϟāĻŋ āĻĒāϰāĻŋāώ⧇āĻŦāĻž āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ - 'āĻŦā§āϝāĻžāϕ⧇āĻ¨ā§āĻĄ' (āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ) āĻāĻŦāĻ‚ 'āϗ⧇āϟāĻ“āϝāĻŧ⧇' (āϗ⧇āϟāĻ“āϝāĻŧ⧇), āϏ⧇āϗ⧁āϞāĻŋāϕ⧇ āĻĄāĻ•āĻžāϰ āχāĻŽā§‡āĻœā§‡ āĻĒā§āϝāĻžāĻ• āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āĻāĻ•āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āϏ⧇āϟ āφāĻĒ āĻ•āϰ⧁āύ

    āϕ⧀āĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ: āϜāĻžāĻ­āĻž 11, āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻŦ⧁āϟ, āĻĄāĻ•āĻžāϰ, āχāĻŽā§‡āϜ āĻ…āĻĒā§āϟāĻŋāĻŽāĻžāχāĻœā§‡āĻļāĻžāύ

  2. Google Kubernetes āχāĻžā§āϜāĻŋāύ⧇ Kubernetes āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻāĻŦāĻ‚ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ¸ā§āĻĨāĻžāĻĒāύāĻžāϰ āωāĻ¨ā§āύāϝāĻŧāύ

    āϕ⧀āĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ: āϕ⧁āĻŦāĻžāϰāύ⧇āϟāϏ, āϜāĻŋāϕ⧇āχ, āϰāĻŋāϏ⧋āĻ°ā§āϏ āĻŽā§āϝāĻžāύ⧇āϜāĻŽā§‡āĻ¨ā§āϟ, āĻ…āĻŸā§‹āĻ¸ā§āϕ⧇āϞāĻŋāĻ‚, āϏāĻŋāĻ•ā§āϰ⧇āϟāϏ

  3. āφāϰāĻ“ āĻ­āĻžāϞ⧋ āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻžāĻĒāύāĻžāϰ āϜāĻ¨ā§āϝ Helm 3 āĻĻāĻŋāϝāĻŧ⧇ āĻāĻ•āϟāĻŋ āϚāĻžāĻ°ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰāĻž

    āĻŸā§āϝāĻžāĻ—: āĻšā§‡āϞāĻŽ 3, āϚāĻžāĻ°ā§āϟ āĻ¸ā§āĻĨāĻžāĻĒāύāĻž

  4. āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ⧇ āϕ⧋āĻĄā§‡āϰ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧ āĻŦāĻŋāϤāϰāϪ⧇āϰ āϜāĻ¨ā§āϝ āĻœā§‡āύāĻ•āĻŋāĻ¨ā§āϏ āĻāĻŦāĻ‚ āĻĒāĻžāχāĻĒāϞāĻžāχāύ āϏ⧇āϟ āφāĻĒ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇

    āϕ⧀āĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ: āĻœā§‡āύāĻ•āĻŋāĻ¨ā§āϏ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ, āĻĒā§āϞāĻžāĻ—āχāύ, āφāϞāĻžāĻĻāĻž āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋ

āφāĻŽāĻŋ āĻĒā§āϰāϤāĻŋāϟāĻŋ āϧāĻžāĻĒ⧇ āĻāĻ•āϟāĻŋ āĻĒ⧃āĻĨāĻ• āύāĻŋāĻŦāĻ¨ā§āϧ āĻ‰ā§ŽāϏāĻ°ā§āĻ— āĻ•āϰāĻžāϰ āĻĒāϰāĻŋāĻ•āĻ˛ā§āĻĒāύāĻž āĻ•āϰāĻ›āĻŋāĨ¤

āύāĻŋāĻŦāĻ¨ā§āϧāϗ⧁āϞāĻŋāϰ āĻāχ āϏāĻŋāϰāĻŋāĻœā§‡āϰ āĻĢā§‹āĻ•āĻžāϏ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻŽāĻžāχāĻ•ā§āϰ⧋āϏāĻžāĻ°ā§āĻ­āĻŋāϏāϗ⧁āϞāĻŋ āϞāĻŋāĻ–āϤ⧇ āĻšāϝāĻŧ āϤāĻž āύāϝāĻŧ, āϤāĻŦ⧇ āϕ⧀āĻ­āĻžāĻŦ⧇ āϏ⧇āϗ⧁āϞāĻŋāϕ⧇ āĻāĻ•āĻ• āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡ āĻ•āĻžāϜ āĻ•āϰāĻž āϝāĻžāϝāĻŧāĨ¤ āϝāĻĻāĻŋāĻ“ āĻāχ āϏāĻŽāĻ¸ā§āϤ āϜāĻŋāύāĻŋāϏāϗ⧁āϞāĻŋ āϏāĻžāϧāĻžāϰāĻŖāϤ āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāϰ⧀āϰ āĻĻāĻžāϝāĻŧāĻŋāĻ¤ā§āĻŦ⧇āϰ āĻŦāĻžāχāϰ⧇ āĻĨāĻžāϕ⧇, āϤāĻŦ⧇ āφāĻŽāĻŋ āĻŽāύ⧇ āĻ•āϰāĻŋ āĻāϟāĻŋ āϤāĻžāĻĻ⧇āϰ āϏāĻžāĻĨ⧇ āĻĒāϰāĻŋāϚāĻŋāϤ āĻšāĻ“āϝāĻŧāĻž āĻāĻ–āύāĻ“ āĻ•āĻžāĻ°ā§āϝāĻ•āϰ āĻšāĻŦ⧇ āĻ•āĻŽāĻĒāĻ•ā§āώ⧇ 20% (āϝāĻž, āφāĻĒāύāĻŋ āϜāĻžāύ⧇āύ, āĻĢāϞāĻžāĻĢāϞ⧇āϰ 80% āĻĻ⧇āϝāĻŧ)āĨ¤ āĻ•āĻŋāϛ⧁ āύāĻŋāσāĻļāĻ°ā§āϤ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻŦāĻŋāώāϝāĻŧ, āϝ⧇āĻŽāύ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž, āĻāχ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ āĻĨ⧇āϕ⧇ āĻŦāĻžāĻĻ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāĻŦ⧇, āϝ⧇āĻšā§‡āϤ⧁ āϞ⧇āĻ–āĻ• āĻāχ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āϖ⧁āĻŦ āĻ•āĻŽāχ āĻŦā§‹āĻā§‡āύ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻŦā§āϝāĻ•ā§āϤāĻŋāĻ—āϤ āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āϜāĻ¨ā§āϝ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇⧎ āφāĻŽāĻŋ āϕ⧋āύ āĻŽāϤāĻžāĻŽāϤ āĻāĻŦāĻ‚ āĻ—āĻ āύāĻŽā§‚āϞāĻ• āϏāĻŽāĻžāϞ⧋āϚāύāĻž āĻ¸ā§āĻŦāĻžāĻ—āϤ āϜāĻžāύāĻžāχ.

āĻŽāĻžāχāĻ•ā§āϰ⧋ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āϤ⧈āϰāĻŋ āĻ•āϰāĻž

āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻŦ⧁āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϗ⧁āϞāĻŋ āϜāĻžāĻ­āĻž 11 āĻ āϞ⧇āĻ–āĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞāĨ¤ āχāĻ¨ā§āϟāĻžāϰāϏāĻžāĻ°ā§āĻ­āĻŋāϏ āĻŽāĻŋāĻĨāĻ¸ā§āĻ•ā§āϰāĻŋāϝāĻŧāĻž REST āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϏāĻ‚āĻ—āĻ āĻŋāϤ āĻšāϝāĻŧāĨ¤ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒāϟāĻŋāϤ⧇ āĻ¨ā§āϝ⧂āύāϤāĻŽ āϏāĻ‚āĻ–ā§āϝāĻ• āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ…āĻ¨ā§āϤāĻ°ā§āϭ⧁āĻ•ā§āϤ āĻĨāĻžāĻ•āĻŦ⧇ (āϝāĻžāϤ⧇ āĻĒāϰ⧇ āĻœā§‡āύāĻ•āĻŋāĻ¨ā§āϏ⧇ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻžāϰ āĻŽāϤ⧋ āĻ•āĻŋāϛ⧁ āφāϛ⧇)āĨ¤ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āωāĻ¤ā§āϏ āϕ⧋āĻĄ GitHub āĻ āωāĻĒāϞāĻŦā§āϧ: āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ и āĻĒā§āϰāĻŦ⧇āĻļāĻĒāĻĨ.

āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϰ āĻ¸ā§āĻĨāĻŋāϤāĻŋ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāϤ⧇ āϏāĻ•ā§āώāĻŽ āĻšāĻ“āϝāĻŧāĻžāϰ āϜāĻ¨ā§āϝ, āϤāĻžāĻĻ⧇āϰ āύāĻŋāĻ°ā§āĻ­āϰāϤāĻžāϗ⧁āϞāĻŋāϤ⧇ āĻāĻ•āϟāĻŋ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻ…ā§āϝāĻžāĻ•āϚ⧁āϝāĻŧ⧇āϟāϰ āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇āĨ¤ āĻāϟāĻŋ āĻāĻ•āϟāĻŋ /āĻ…ā§āϝāĻžāĻ•āϚ⧁āϝāĻŧ⧇āϟāϰ/āĻ¸ā§āĻŦāĻžāĻ¸ā§āĻĨā§āϝ āĻāĻ¨ā§āĻĄāĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰāĻŦ⧇ āĻāĻŦāĻ‚ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϟāĻŋ āĻŸā§āϰāĻžāĻĢāĻŋāĻ• āĻ—ā§āϰāĻšāϪ⧇āϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāĻ¸ā§āϤ⧁āϤ āĻšāϞ⧇ āĻāĻ•āϟāĻŋ 200 āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰāĻŦ⧇, āĻ…āĻĨāĻŦāĻž āϝāĻĻāĻŋ āϕ⧋āύ āϏāĻŽāĻ¸ā§āϝāĻž āĻšāϝāĻŧ 504āĨ¤ āĻāχ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇, āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āĻŦāϰāĻ‚ āĻ•āĻžāĻ˛ā§āĻĒāύāĻŋāĻ• āĻšā§‡āĻ•, āϝ⧇āĻšā§‡āϤ⧁ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϗ⧁āϞāĻŋ āϖ⧁āĻŦ āϏāĻšāϜ, āĻāĻŦāĻ‚ āĻ•āĻŋāϛ⧁ āĻŦāϞāĻĒā§āϰāϝāĻŧā§‹āϗ⧇āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇, āϏ⧇āϗ⧁āϞāĻŋ āφāĻ‚āĻļāĻŋāĻ•āĻ­āĻžāĻŦ⧇ āϚāĻžāϞ⧁ āĻĨāĻžāĻ•āĻžāϰ āĻšā§‡āϝāĻŧ⧇ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖāϰ⧂āĻĒ⧇ āĻ…āύ⧁āĻĒāϞāĻŦā§āϧ āĻšāĻ“āϝāĻŧāĻžāϰ āϏāĻŽā§āĻ­āĻžāĻŦāύāĻž āĻŦ⧇āĻļāĻŋāĨ¤ āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻŦāĻžāĻ¸ā§āϤāĻŦ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰāĻž āĻāϟāĻŋ āύāĻŋāϝāĻŧ⧇ āϞāĻĄāĻŧāĻžāχ āĻļ⧁āϰ⧁ āĻ•āϰāĻžāϰ āφāϗ⧇ Actuator āĻāĻ•āϟāĻŋ āϏāĻŽāĻ¸ā§āϝāĻž āύāĻŋāĻ°ā§āĻŖāϝāĻŧ āĻ•āϰāϤ⧇ āϏāĻžāĻšāĻžāĻ¯ā§āϝ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āϝāĻĻāĻŋ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻ•āϰāϤ⧇ āϏāĻŽāĻ¸ā§āϝāĻž āĻšāϝāĻŧ, āφāĻŽāϰāĻž āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āĻāĻ•āϟāĻŋ āĻ­āĻžāĻ™āĻž āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϰ āĻĻ⧃āĻˇā§āϟāĻžāĻ¨ā§āϤ⧇āϰ āϏāĻžāĻĨ⧇ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϰāϪ⧇āϰ āĻ…āύ⧁āϰ⧋āϧāϗ⧁āϞāĻŋ āĻŦāĻ¨ā§āϧ āĻ•āϰ⧇ āĻāϰ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āϜāĻžāύāĻžāϤ⧇ āĻĒāĻžāϰāĻŋāĨ¤

āĻŦā§āϝāĻžāĻ• āĻāĻ¨ā§āĻĄ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ

āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ āĻĒāϰāĻŋāώ⧇āĻŦāĻž āϕ⧇āĻŦāϞ āĻ—āĻŖāύāĻž āĻ•āϰāĻŦ⧇ āĻāĻŦāĻ‚ āĻ—ā§ƒāĻšā§€āϤ āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āϏāĻ‚āĻ–ā§āϝāĻž āĻĢ⧇āϰāϤ āĻĻ⧇āĻŦ⧇āĨ¤

āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ āϕ⧋āĻĄ:

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

āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āϗ⧇āϟāĻ“āϝāĻŧ⧇

āϗ⧇āϟāĻ“āϝāĻŧ⧇ āĻ…āύ⧁āϰ⧋āϧāϟāĻŋ āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϤ⧇ āĻĢāϰ⧋āϝāĻŧāĻžāĻ°ā§āĻĄ āĻ•āϰāĻŦ⧇, āĻāϟāĻŋ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āϤāĻĨā§āϝ⧇āϰ āϏāĻžāĻĨ⧇ āĻĒāϰāĻŋāĻĒā§‚āϰāĻ• āĻ•āϰ⧇:

  • āϗ⧇āϟāĻ“āϝāĻŧ⧇ āφāχāĻĄāĻŋāĨ¤ āĻāϟāĻŋ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āϝāĻžāϤ⧇ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻĻā§āĻŦāĻžāϰāĻž āϗ⧇āϟāĻ“āϝāĻŧ⧇āϰ āĻāĻ•āϟāĻŋ āωāĻĻāĻžāĻšāϰāĻŖāϕ⧇ āĻ…āĻ¨ā§āϝāϟāĻŋ āĻĨ⧇āϕ⧇ āφāϞāĻžāĻĻāĻž āĻ•āϰāĻž āϏāĻŽā§āĻ­āĻŦ āĻšāϝāĻŧ
  • āĻ•āĻŋāϛ⧁ "āĻ—ā§‹āĻĒāύ" āϝāĻž āĻāĻ•āϟāĻŋ āĻ…āĻ¤ā§āϝāĻ¨ā§āϤ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄā§‡āϰ āĻ­ā§‚āĻŽāĻŋāĻ•āĻž āĻĒāĻžāϞāύ āĻ•āϰāĻŦ⧇ (āĻāĻ•āϟāĻŋ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āϕ⧁āĻ•āĻŋāϰ āĻāύāĻ•ā§āϰāĻŋāĻĒāĻļāύ āϕ⧀ āϏāĻ‚āĻ–ā§āϝāĻž)

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) āĻāϟāĻŋ āĻ āĻŋāĻ• āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ, āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϗ⧁āϞāĻŋāϕ⧇ āĻ…āĻŦāĻļā§āϝāχ āĻāĻ•āϟāĻŋ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āϕ⧇ āĻāĻ•āĻ¤ā§āϰāĻŋāϤ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āĻāĻŦāĻ‚ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āϗ⧇āϟāĻ“āϝāĻŧ⧇āϟāĻŋ āĻŦāĻžāχāϰ⧇ "āĻ¸ā§āϟāĻŋāĻ• āφāωāϟ" āĻšāĻ“āϝāĻŧāĻž āωāϚāĻŋāϤāĨ¤
āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“, āωāĻ­āϝāĻŧ āĻĒāϰāĻŋāώ⧇āĻŦāĻž āĻāĻ•āϟāĻŋ āĻĢāĻžāχāϞ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ­āĻžāĻ— āĻ•āϰ⧇, āĻ¸ā§āĻŸā§āϰāĻŋāĻŽ āωāĻ¤ā§āĻĒāĻžāĻĻāύ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻāĻ• āĻŽā§āĻšā§‚āĻ°ā§āϤ⧇ āĻāϕ⧇ āĻ…āĻĒāϰ⧇āϰ āϏāĻžāĻĨ⧇ āĻšāĻ¸ā§āϤāĻ•ā§āώ⧇āĻĒ āĻļ⧁āϰ⧁ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āφāĻŽāĻžāĻĻ⧇āϰ āĻŽāĻžāχāĻ•ā§āϰ⧋āϏāĻžāĻ°ā§āĻ­āĻŋāϏāϗ⧁āϞ⧋āϕ⧇ āĻŦāĻŋāĻšā§āĻ›āĻŋāĻ¨ā§āύ āĻ•āϰāĻž āĻ­āĻžāϞ⧋ āĻšāĻŦ⧇āĨ¤ āĻāϟāĻŋ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻŽā§‡āĻļāĻŋāύ⧇ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āĻŦāĻŋāϤāϰāĻŖ āĻ•āϰ⧇ (āĻ…āύ⧇āĻ• āĻ…āĻ°ā§āĻĨ, āĻ•āĻ āĻŋāύ), āĻ­āĻžāĻ°ā§āϚ⧁āϝāĻŧāĻžāϞ āĻŽā§‡āĻļāĻŋāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ (āϏāĻŽā§āĻĒāĻĻ āύāĻŋāĻŦāĻŋāĻĄāĻŧ, āĻĻā§€āĻ°ā§āϘ āĻ¸ā§āϟāĻžāĻ°ā§āϟāφāĻĒ) āĻŦāĻž āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰāĻžāχāĻœā§‡āĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ…āĻ°ā§āϜāύ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻĒā§āϰāĻ¤ā§āϝāĻžāĻļāĻŋāϤ āĻšāĻŋāϏāĻžāĻŦ⧇, āφāĻŽāϰāĻž āϤ⧃āϤ⧀āϝāĻŧ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āĻĄāĻ•āĻļā§āϰāĻŽāĻŋāĻ• āϧāĻžāϰāĻ•āĻ•āϰāϪ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻšāĻžāϤāĻŋāϝāĻŧāĻžāϰ āĻšāĻŋāϏāĻžāĻŦ⧇āĨ¤

āĻĄāĻ•āĻļā§āϰāĻŽāĻŋāĻ•

āϏāĻ‚āĻ•ā§āώ⧇āĻĒ⧇, āĻĄāĻ•āĻžāϰ āĻŦāĻŋāĻšā§āĻ›āĻŋāĻ¨ā§āύ āĻĒāĻžāĻ¤ā§āϰ āϤ⧈āϰāĻŋ āĻ•āϰ⧇, āĻĒā§āϰāϤāĻŋ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ⧇ āĻāĻ•āϟāĻŋāĨ¤ āĻĄāĻ•āĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ, āφāĻĒāύāĻžāϕ⧇ āĻāĻ•āϟāĻŋ āĻĄāĻ•āĻžāϰāĻĢāĻžāχāϞ āϞāĻŋāĻ–āϤ⧇ āĻšāĻŦ⧇ - āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϤ⧈āϰāĻŋ āĻāĻŦāĻ‚ āϚāĻžāϞāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āύāĻŋāĻ°ā§āĻĻ⧇āĻļāĻžāĻŦāϞ⧀āĨ¤ āĻāϰ āĻĒāϰ⧇, āφāĻĒāύāĻŋ āĻ›āĻŦāĻŋāϟāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ, āĻāϟāĻŋ āχāĻŽā§‡āϜ āϰ⧇āϜāĻŋāĻ¸ā§āĻŸā§āϰāĻŋāϤ⧇ āφāĻĒāϞ⧋āĻĄ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ (āύāĻ‚āĨ¤ āĻĄāĻ•āĻžāϰāĻšāĻžāĻŦ) āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ āĻ•āĻŽāĻžāĻ¨ā§āĻĄā§‡ āϝ⧇āϕ⧋āύ⧋ āĻĄāĻ•āĻžāϰāĻžāχāϜāĻĄ āĻĒāϰāĻŋāĻŦ⧇āĻļ⧇ āφāĻĒāύāĻžāϰ āĻŽāĻžāχāĻ•ā§āϰ⧋āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰ⧁āύāĨ¤

Dockerfile

āĻāĻ•āϟāĻŋ āχāĻŽā§‡āĻœā§‡āϰ āĻ…āĻ¨ā§āϝāϤāĻŽ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ āĻšāϞ⧋ āĻāϰ āφāĻ•āĻžāϰāĨ¤ āĻāĻ•āϟāĻŋ āĻ•āĻŽā§āĻĒā§āϝāĻžāĻ•ā§āϟ āχāĻŽā§‡āϜ āϰāĻŋāĻŽā§‹āϟ āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋ āĻĨ⧇āϕ⧇ āĻĻā§āϰ⧁āϤ āĻĄāĻžāωāύāϞ⧋āĻĄ āĻšāϝāĻŧ, āĻ•āĻŽ āϜāĻžāϝāĻŧāĻ—āĻž āύ⧇āϝāĻŧ āĻāĻŦāĻ‚ āφāĻĒāύāĻžāϰ āϏāĻžāĻ°ā§āĻ­āĻŋāϏāĻ“ āĻĻā§āϰ⧁āϤ āϚāĻžāϞ⧁ āĻšāϝāĻŧāĨ¤ āϝ⧇āϕ⧋āύ⧋ āχāĻŽā§‡āϜ āĻāĻ•āϟāĻŋ āĻŦ⧇āϏ āχāĻŽā§‡āĻœā§‡āϰ āωāĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇ āϤ⧈āϰāĻŋ āĻšāϝāĻŧ, āĻāĻŦāĻ‚ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āϏāĻ‚āĻ•ā§āώāĻŋāĻĒā§āϤ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāϟāĻŋ āĻŦ⧇āϛ⧇ āύ⧇āĻ“āϝāĻŧāĻžāϰ āĻĒāϰāĻžāĻŽāĻ°ā§āĻļ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧāĨ¤ āĻāĻ•āϟāĻŋ āĻ­āĻžāϞ⧋ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻšāϞ⧋ āφāϞāĻĒāĻžāχāύ, āϝāĻž āĻāĻ•āϟāĻŋ āĻĒā§‚āĻ°ā§āĻŖāĻžāĻ™ā§āĻ— āĻĢāĻŋāϚāĻžāϰāϝ⧁āĻ•ā§āϤ āĻĄāĻŋāĻ¸ā§āĻŸā§āϰāĻŋāĻŦāĻŋāωāĻļāύāĨ¤ Linux āĻ¨ā§āϝ⧂āύāϤāĻŽ āϏāĻ‚āĻ–ā§āϝāĻ• āĻĒā§āϝāĻžāϕ⧇āϜ āϏāĻšāĨ¤

āĻļ⧁āϰ⧁ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ, āφāϏ⧁āύ āĻāĻ•āϟāĻŋ āĻĄāĻ•āĻžāϰāĻĢāĻžāχāϞ "āĻ•āĻĒāĻžāϞ⧇" āϞ⧇āĻ–āĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāĻŋ (āφāĻŽāĻŋ āĻāĻ–āύāχ āĻŦāϞāĻŦ āϝ⧇ āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āĻ–āĻžāϰāĻžāĻĒ āωāĻĒāĻžāϝāĻŧ, āĻāϟāĻŋ āĻ•āϰāĻŦ⧇āύ āύāĻž):

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 āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋ āϝ⧋āĻ— āĻ•āϰāĻŋ, āĻāϟāĻŋāϕ⧇ āĻ•āĻžāϜ (āĻ“āϝāĻŧāĻžāĻ°ā§āĻ•āĻĄāĻŋāϰ) āĻšāĻŋāϏāĻžāĻŦ⧇ āϚāĻŋāĻšā§āύāĻŋāϤ āĻ•āϰāĻŋ āĻāĻŦāĻ‚ āĻŦāĻŋāĻ˛ā§āĻĄ āĻļ⧁āϰ⧁ āĻ•āϰāĻŋāĨ¤ EXPOSE 8080 āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻĄāĻ•āĻžāϰāϕ⧇ āϏāĻ‚āϕ⧇āϤ āĻĻ⧇āϝāĻŧ āϝ⧇ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ⧇ āĻĨāĻžāĻ•āĻž āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύāϟāĻŋ āϤāĻžāϰ āĻĒā§‹āĻ°ā§āϟ 8080 āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇ (āĻāϟāĻŋ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύāϟāĻŋāϕ⧇ āĻŦāĻžāχāϰ⧇ āĻĨ⧇āϕ⧇ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏāϝ⧋āĻ—ā§āϝ āĻ•āϰ⧇ āϤ⧁āϞāĻŦ⧇ āύāĻž, āϤāĻŦ⧇ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύāϟāĻŋāϕ⧇ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻ•āϰāĻžāϰ āĻ…āύ⧁āĻŽāϤāĻŋ āĻĻ⧇āĻŦ⧇, āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āĻāĻ•āχ āĻĄāĻ•āĻžāϰ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āϕ⧇āϰ āĻ…āĻ¨ā§āϝ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ āĻĨ⧇āϕ⧇ )

āχāĻŽā§‡āϜāϗ⧁āϞāĻŋāϤ⧇ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϗ⧁āϞāĻŋ āĻĒā§āϝāĻžāϕ⧇āϜ āĻ•āϰāϤ⧇, āφāĻĒāύāĻžāϕ⧇ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āϰ⧁āϟ āĻĨ⧇āϕ⧇ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āϚāĻžāϞāĻžāϤ⧇ āĻšāĻŦ⧇:

docker image build . -t msvc-backend:1.0.0

āĻĢāϞāĻžāĻĢāϞ āĻšāϞ āĻāĻ•āϟāĻŋ 456 MB āϚāĻŋāĻ¤ā§āϰ (āϝāĻžāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ JDK āϚāĻŋāĻ¤ā§āϰāϟāĻŋ 340 MB āĻĻāĻ–āϞ āĻ•āϰ⧇āϛ⧇)⧎ āĻāĻŦāĻ‚ āϏāĻŦ āϏāĻ¤ā§āĻ¤ā§āĻŦ⧇āĻ“ āϝ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āĻ•ā§āϞāĻžāϏ āĻāĻ•āϟāĻŋ āφāϙ⧁āϞ⧇āϰ āωāĻĒāϰ āĻ—āĻŖāύāĻž āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇. āφāĻŽāĻžāĻĻ⧇āϰ āĻ›āĻŦāĻŋāϰ āφāĻ•āĻžāϰ āĻ•āĻŽāĻžāϤ⧇:

  • āφāĻŽāϰāĻž āĻŦāĻšā§-āĻĒāĻĻāĻ•ā§āώ⧇āĻĒ āϏāĻŽāĻžāĻŦ⧇āĻļ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŋāĨ¤ āĻĒā§āϰāĻĨāĻŽ āϧāĻžāĻĒ⧇ āφāĻŽāϰāĻž āĻĒā§āϰāĻ•āĻ˛ā§āĻĒāϟāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰāĻŦ, āĻĻā§āĻŦāĻŋāϤ⧀āϝāĻŧ āϧāĻžāĻĒ⧇ āφāĻŽāϰāĻž JRE āχāύāĻ¸ā§āϟāϞ āĻ•āϰāĻŦ āĻāĻŦāĻ‚ āϤ⧃āϤ⧀āϝāĻŧ āϧāĻžāĻĒ⧇ āφāĻŽāϰāĻž āĻāϟāĻŋāϕ⧇ āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āφāϞāĻĒāĻžāχāύ āĻ›āĻŦāĻŋāϤ⧇ āĻ•āĻĒāĻŋ āĻ•āϰāĻŦāĨ¤ āĻŽā§‹āϟ, āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āωāĻĒāĻžāĻĻāĻžāύāϗ⧁āϞāĻŋ āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āϤ āϚāĻŋāĻ¤ā§āϰ⧇ āĻĨāĻžāĻ•āĻŦ⧇āĨ¤
  • āϜāĻžāĻ­āĻž āĻŽāĻĄā§āϞāĻžāϰāĻžāχāĻœā§‡āĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝāĻžāĻ•āĨ¤ Java 9 āĻĻāĻŋāϝāĻŧ⧇ āĻļ⧁āϰ⧁ āĻ•āϰ⧇, āφāĻĒāύāĻŋ āφāĻĒāύāĻžāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āĻŽāĻĄāĻŋāωāϞāϗ⧁āϞāĻŋ āĻĨ⧇āϕ⧇ āĻāĻ•āϟāĻŋ JRE āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ jlink āϟ⧁āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ

āĻ…āύ⧁āϏāĻ¨ā§āϧāĻŋā§ŽāϏ⧁āĻĻ⧇āϰ āϜāĻ¨ā§āϝ, āĻāĻ–āĻžāύ⧇ āϚāĻŋāĻ¤ā§āϰ āĻšā§āϰāĻžāϏ āĻĒāĻĻā§āϧāϤāĻŋāϰ āωāĻĒāϰ āĻāĻ•āϟāĻŋ āĻ­āĻžāϞ āύāĻŋāĻŦāĻ¨ā§āϧ āϰāϝāĻŧ⧇āϛ⧇āĨ¤ https://habr.com/ru/company/ruvds/blog/485650/.

āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āϤ āĻĄāĻ•āĻžāϰāĻĢāĻžāχāϞ:

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 anshelen@yandex.ru"
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 āϗ⧁āĻŖ āĻ“āϜāύ āĻšāĻžāϰāĻŋāϝāĻŧ⧇āϛ⧇āĨ¤ āĻ–āĻžāϰāĻžāĻĒ āύāĻž. āĻāϰ āĻĒāϰ⧇, āϰ⧇āĻĄāĻŋāĻŽā§‡āĻĄ āĻ›āĻŦāĻŋāϗ⧁āϞāĻŋ āχāĻŽā§‡āϜ āϰ⧇āϜāĻŋāĻ¸ā§āĻŸā§āϰāĻŋāϤ⧇ āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇ āϝāĻžāϤ⧇ āφāĻĒāύāĻžāϰ āĻ›āĻŦāĻŋāϗ⧁āϞāĻŋ āχāĻ¨ā§āϟāĻžāϰāύ⧇āϟ āĻĨ⧇āϕ⧇ āĻĄāĻžāωāύāϞ⧋āĻĄā§‡āϰ āϜāĻ¨ā§āϝ āωāĻĒāϞāĻŦā§āϧ āĻĨāĻžāϕ⧇āĨ¤

āĻĄāĻ•āĻžāϰ⧇ āϏāĻš-āϚāϞāĻŽāĻžāύ āĻĒāϰāĻŋāώ⧇āĻŦāĻž

āĻļ⧁āϰ⧁āϤ⧇, āφāĻŽāĻžāĻĻ⧇āϰ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϗ⧁āϞāĻŋ āĻāĻ•āχ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āϕ⧇ āĻĨāĻžāĻ•āĻž āφāĻŦāĻļā§āϝāϕ⧎ āĻĄāĻ•āĻžāϰ⧇ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āϧāϰāϪ⧇āϰ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āϰāϝāĻŧ⧇āϛ⧇ āĻāĻŦāĻ‚ āφāĻŽāϰāĻž āϤāĻžāĻĻ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āφāĻĻāĻŋāĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŋ - āĻŦā§āϰāĻŋāϜ, āϝāĻž āφāĻĒāύāĻžāϕ⧇ āĻāĻ•āχ āĻšā§‹āĻ¸ā§āĻŸā§‡ āϚāϞāĻŽāĻžāύ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰāϗ⧁āϞāĻŋāϕ⧇ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻ•āϰāϤ⧇ āĻĻ⧇āϝāĻŧāĨ¤ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻĻāĻŋāϝāĻŧ⧇ āĻāĻ•āϟāĻŋ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ:

docker network create msvc-network

āĻāϰ āĻĒāϰ⧇, āĻŽāĻžāχāĻ•ā§āϰ⧋āϏāĻžāĻ°ā§āĻ­āĻŋāϏ⧇āϏ-āĻŦā§āϝāĻžāϕ⧇āĻ¨ā§āĻĄ:1.0.0 āϚāĻŋāĻ¤ā§āϰ⧇āϰ āϏāĻžāĻĨ⧇ 'āĻŦā§āϝāĻžāϕ⧇āĻ¨ā§āĻĄ' āύāĻžāĻŽā§‡āϰ āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰāϟāĻŋ āĻļ⧁āϰ⧁ āĻ•āϰ⧁āύ:

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

āĻāϟāĻž āϞāĻ•ā§āώāĻŖā§€āϝāĻŧ āϝ⧇ āĻŦā§āϰāĻŋāϜ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āϤāĻžāĻĻ⧇āϰ āύāĻžāĻŽ āĻ…āύ⧁āϏāĻžāϰ⧇ āĻŦāĻ•ā§āϏ āĻĒāϰāĻŋāώ⧇āĻŦāĻž āφāĻŦāĻŋāĻˇā§āĻ•āĻžāϰ⧇āϰ āĻŦāĻžāχāϰ⧇ āϏāϰāĻŦāϰāĻžāĻš āĻ•āϰ⧇āĨ¤ āĻ…āĻ°ā§āĻĨāĻžā§Ž, āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϟāĻŋ āĻĄāĻ•āĻžāϰ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āϕ⧇āϰ āĻ­āĻŋāϤāϰ⧇ āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāĻŦ⧇ 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/ āĻāĻŦāĻ‚ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰ⧁āύ āϝ⧇ āϏāĻŦāĻ•āĻŋāϛ⧁ āĻ•āĻžāϜ āĻ•āϰ⧇, āφāϗ⧇āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻšāĻŋāϏāĻžāĻŦ⧇āĨ¤

āωāĻĒāϏāĻ‚āĻšāĻžāϰ

āĻĢāϞāĻ¸ā§āĻŦāϰ⧂āĻĒ, āφāĻŽāϰāĻž āĻĻ⧁āϟāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āĻŽāĻžāχāĻ•ā§āϰ⧋āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āϤ⧈āϰāĻŋ āĻ•āϰ⧇āĻ›āĻŋ, āϏ⧇āϗ⧁āϞāĻŋāϕ⧇ āĻĄāĻ•āĻžāϰ āĻĒāĻžāĻ¤ā§āϰ⧇ āĻĒā§āϝāĻžāϕ⧇āϜ āĻ•āϰ⧇āĻ›āĻŋ āĻāĻŦāĻ‚ āĻāĻ•āχ āĻŽā§‡āĻļāĻŋāύ⧇ āĻāĻ•āϏāĻžāĻĨ⧇ āϚāĻžāϞ⧁ āĻ•āϰ⧇āĻ›āĻŋāĨ¤ āĻĢāϞāĻ¸ā§āĻŦāϰ⧂āĻĒ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āĻ…āĻŦāĻļā§āϝ āĻŦ⧇āĻļ āĻ•āĻŋāϛ⧁ āĻ…āϏ⧁āĻŦāĻŋāϧāĻž āϰāϝāĻŧ⧇āϛ⧇:

  • āĻĻ⧁āĻ°ā§āĻŦāϞ āĻĻā§‹āώ āϏāĻšāύāĻļā§€āϞāϤāĻž - āϏāĻŦāĻ•āĻŋāϛ⧁ āφāĻŽāĻžāĻĻ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇
  • āĻĻ⧁āĻ°ā§āĻŦāϞ āĻŽāĻžāĻĒāϝ⧋āĻ—ā§āϝāϤāĻž - āϝāĻ–āύ āϞ⧋āĻĄ āĻŦ⧃āĻĻā§āϧāĻŋ āĻĒāĻžāϝāĻŧ, āϤāĻ–āύ āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āĻĒāϰāĻŋāώ⧇āĻŦāĻž āĻĻ⧃āĻˇā§āϟāĻžāĻ¨ā§āϤāϗ⧁āϞāĻŋ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻž āĻāĻŦāĻ‚ āϤāĻžāĻĻ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āϞ⧋āĻĄā§‡āϰ āĻ­āĻžāϰāϏāĻžāĻŽā§āϝ āĻŦāϜāĻžāϝāĻŧ āϰāĻžāĻ–āĻž āĻ­āĻžāϞ āĻšāĻŦ⧇
  • āϞāĻžā§āĻšā§‡āϰ āϜāϟāĻŋāϞāϤāĻž - āφāĻŽāĻžāĻĻ⧇āϰ āĻ•āĻŽāĻĒāĻ•ā§āώ⧇ 3āϟāĻŋ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻĒā§āϰāĻŦ⧇āĻļ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āĻāĻŦāĻ‚ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋ āϏāĻš (āĻāϟāĻŋ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ 2āϟāĻŋ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϰ āϜāĻ¨ā§āϝ)

āωāĻĒāϰ⧇āϰ āϏāĻŽāĻ¸ā§āϝāĻžāϗ⧁āϞāĻŋ āϏāĻŽāĻžāϧāĻžāύ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ, āĻĄāĻ•āĻžāϰ āϏ⧋āϝāĻŧāĻžāĻ°ā§āĻŽ, āύ⧋āĻŽā§āϝāĻžāĻĄ, āϕ⧁āĻŦāĻžāϰāύ⧇āϟāϏ āĻŦāĻž āĻ“āĻĒ⧇āύāĻļāĻŋāĻĢāĻŸā§‡āϰ āĻŽāϤ⧋ āĻŦ⧇āĻļ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āϏāĻŽāĻžāϧāĻžāύ āϰāϝāĻŧ⧇āϛ⧇āĨ¤ āϝāĻĻāĻŋ āĻĒ⧁āϰ⧋ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽāϟāĻŋ āϜāĻžāĻ­āĻžāϤ⧇ āϞ⧇āĻ–āĻž āĻĨāĻžāϕ⧇, āφāĻĒāύāĻŋ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻ•ā§āϞāĻžāωāĻĄā§‡āϰ āĻĻāĻŋāϕ⧇ āϤāĻžāĻ•āĻžāϤ⧇ āĻĒāĻžāϰ⧇āύ (āĻ­āĻžāϞ āύāĻŋāĻŦāĻ¨ā§āϧ).

В āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āĻ…āĻ‚āĻļ āφāĻŽāĻŋ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ Kubernetes āϏ⧇āϟ āφāĻĒ āĻ•āϰ⧇āĻ›āĻŋ āĻāĻŦāĻ‚ Google Kubernetes āχāĻžā§āϜāĻŋāύ⧇ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒāϟāĻŋ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰ⧇āĻ›āĻŋ āϏ⧇ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āφāĻŽāĻŋ āĻ•āĻĨāĻž āĻŦāϞāĻŦāĨ¤

āωāĻ¤ā§āϏ: www.habr.com

DDoS āϏ⧁āϰāĻ•ā§āώāĻž, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϏāĻš āϏāĻžāχāϟāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ đŸ”Ĩ DDoS āϏ⧁āϰāĻ•ā§āώāĻž āϏāĻš āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāϟ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ | ProHoster