āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āϕ⧋āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϏ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻāĻŦāĻ‚ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚āϕ⧇ āĻāĻ•āĻ¤ā§āϰāĻŋāϤ āĻ•āϰ⧇

āϏāĻŦāĻžāχāϕ⧇ āĻšā§āϝāĻžāϞ⧋, āĻāĻ–āĻžāύ⧇ āϕ⧋āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϏ āϏāĻŋāϰāĻŋāĻœā§‡āϰ āϤ⧃āϤ⧀āϝāĻŧ āĻĒā§‹āĻ¸ā§āϟ!

āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āϕ⧋āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϏ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻāĻŦāĻ‚ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚āϕ⧇ āĻāĻ•āĻ¤ā§āϰāĻŋāϤ āĻ•āϰ⧇

āϜāĻžāĻ­āĻž āĻŽāĻžāχāĻ•ā§āϰ⧋āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āĻŦāĻŋāĻ•āĻžāĻļ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ, āĻāϟāĻŋ āĻĒā§āϰāĻžāϝāĻŧāĻļāχ āĻŦāĻŋāĻļā§āĻŦāĻžāϏ āĻ•āϰāĻž āĻšāϝāĻŧ āĻ—ā§āϰāĻšāύ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ и āĻŦāϏāĻ¨ā§āϤ āĻŦ⧁āϟ āĻĒ⧃āĻĨāĻ• āĻāĻŦāĻ‚ āĻ¸ā§āĻŦāĻžāϧ⧀āύ APIāĨ¤ āĻĄāĻŋāĻĢāĻ˛ā§āϟāϰ⧂āĻĒ⧇, āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāĻžāϰāϰāĻž āĻāĻŽāύ API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϝ⧇āϗ⧁āϞāĻŋ āϤāĻžāϰāĻž āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇āχ āĻ…āĻ­ā§āϝāĻ¸ā§āϤ, āϝ⧇āĻšā§‡āϤ⧁ āύāϤ⧁āύ āĻĢā§āϰ⧇āĻŽāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻāĻŦāĻ‚ āϰāĻžāύāϟāĻžāχāĻŽ āωāĻĒāĻžāĻĻāĻžāύāϗ⧁āϞāĻŋ āĻļāĻŋāĻ–āϤ⧇ āĻ…āύ⧇āĻ• āϏāĻŽāϝāĻŧ āϞāĻžāϗ⧇āĨ¤ āφāϜ āφāĻŽāϰāĻž āĻ•āĻŋāϛ⧁ āϜāύāĻĒā§āϰāĻŋāϝāĻŧ āωāĻ¨ā§āύāϝāĻŧāύ āϏāĻšāϜ āĻ•āϰāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāĻŦ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰāĻĻ⧇āϰ āϜāĻ¨ā§āϝ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ API āĻāĻŦāĻ‚ āφāĻĒāύāĻžāϕ⧇ āĻĻ⧇āĻ–āĻžāϝāĻŧ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻāĻ•āχ āϏāĻžāĻĨ⧇ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ API āĻāĻŦāĻ‚ āύāϤ⧁āύ āĻĻāϰāĻ•āĻžāϰ⧀ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝāϗ⧁āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻšāϝāĻŧ⧎ āϕ⧋āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϏ.

āĻāĻ•āϟ⧁ āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤāĻ­āĻžāĻŦ⧇, āφāĻŽāϰāĻž āĻĒā§āϰāĻĨāĻŽā§‡ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰāĻĻ⧇āϰ āϤāĻžāĻĻ⧇āϰ āĻĻ⧈āύāĻ¨ā§āĻĻāĻŋāύ āĻ•āĻžāĻœā§‡ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻāĻĒāĻŋāφāχ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻšāϝāĻŧ āϤāĻž āĻĻ⧇āĻ–āĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻāĻĒāĻŋāφāχ āϏāĻŽāĻ°ā§āĻĨāύ āĻ•āϰ⧇ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āϕ⧋āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϏ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻāĻĒāĻŋāφāχ āϏāĻŽāĻ°ā§āĻĨāύ āĻ•āϰ⧇ āϤāĻžāϰ āĻĒāϰāĻŋāϧāĻŋ āĻāĻŦāĻ‚ āĻŦāĻŋāĻļāĻĻ āĻĻ⧇āĻ–āĻŦāĨ¤ āϤāĻžāϰāĻĒāϰ⧇ āφāĻŽāϰāĻž āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ APIāϗ⧁āϞāĻŋ āĻ•āĻ­āĻžāϰ āĻ•āϰāĻŦ, āϝāĻž āĻŽāĻžāχāĻ•ā§āϰ⧋āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰāĻĻ⧇āϰ āϜāĻ¨ā§āϝ āωāĻĒāϝ⧋āĻ—ā§€āĨ¤

āϕ⧋āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϏ āϕ⧇āύ? āĻĒā§āϰāĻĨāĻŽāϤ, āĻāϟāĻŋ āĻšāϞ āϞāĻžāχāĻ­ āϕ⧋āĻĄāĻŋāĻ‚, āĻ…āĻ°ā§āĻĨāĻžā§Ž āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻāĻĒāĻŋāφāχ, āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻāĻĒāĻŋāφāχ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āϜāĻžāĻ­āĻž āĻāĻĒāĻŋāφāχ-āĻāϰ āϝ⧇āϕ⧋āύ⧋ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ⧇āϰ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧ āϰāĻŋāϞ⧋āĻĄāĻŋāĻ‚, āϝāĻž āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻāĻ•āϟāĻŋ āĻ•āĻŽāĻžāĻ¨ā§āĻĄā§‡āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻ•āϰāĻž āĻšāϝāĻŧ: mvn quarkus:devāĨ¤ āĻĻā§āĻŦāĻŋāϤ⧀āϝāĻŧāϤ, āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰāĻž āĻšāϝāĻŧ āφāĻŽāĻžāĻĻ⧇āϰ āωāĻĻāĻžāĻšāϰāϪ⧇ āĻŦā§āϝāĻ•ā§āϤāĻŋ āĻĒāϰāĻŋāώ⧇āĻŦāĻž (āϝāĻž āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚, āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ, āĻāĻŦāĻ‚ JPA API āĻĨ⧇āϕ⧇ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ GraalVM āχāĻŽā§‡āϜ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ āĻŦāĻžāχāύāĻžāϰāĻŋāϤ⧇ āĻ•āĻŽā§āĻĒāĻžāχāϞ āĻ•āϰ⧇) āĻŽāĻžāĻ¤ā§āϰ 0.055 āϏ⧇āϕ⧇āĻ¨ā§āĻĄā§‡ āĻļ⧁āϰ⧁ āĻšāϝāĻŧ āĻāĻŦāĻ‚ RESTful āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āĻāĻ¨ā§āĻĄāĻĒāϝāĻŧ⧇āĻ¨ā§āĻŸā§‡ āĻĒā§āϰāĻžāϝāĻŧ 90 MB RAM (RSS) āύ⧇āϝāĻŧāĨ¤ āĻ…āϧāĻŋāĻ•āĻ¨ā§āϤ⧁, āĻāϰ āϏāĻ‚āĻ•āϞāύ āύāĻŋāĻœā§‡āχ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻāĻ•āϟāĻŋ āĻ•āĻŽāĻžāĻ¨ā§āĻĄā§‡āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āϏāĻžā§āϚāĻžāϞāĻŋāϤ āĻšāϝāĻŧ: mvn package -PnativeāĨ¤

āφāĻŽāϰāĻž āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤ āφāϞ⧋āϚāύāĻž āĻ•āϰāĻŦ āύāĻž, āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰāĻĻ⧇āϰ āĻŦ⧁āĻāϤ⧇ āϏāĻžāĻšāĻžāĻ¯ā§āϝ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āϝ⧇ āϤāĻžāϰāĻž āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻāĻĒāĻŋāφāχ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āϕ⧋āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϏ⧇ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ API āĻāϰ āϏāĻžāĻĨ⧇āĨ¤

āϧāĻžāϰāĻ• āĻāĻŦāĻ‚ āϕ⧁āĻŦāĻžāϰāύ⧇āϟāϏ

āĻāχ āύāĻŋāĻŦāĻ¨ā§āϧāϟāĻŋāϕ⧇ āϏāĻšāϜ āϰāĻžāĻ–āϤ⧇, āφāĻŽāϰāĻž āĻāĻ–āĻžāύ⧇ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āωāĻšā§āϚ-āĻ¸ā§āϤāϰ⧇āϰ āϏāĻšāĻžāϝāĻŧāϤāĻžāϰ āĻĻāĻŋāĻ•āϗ⧁āϞāĻŋ āĻ•āĻ­āĻžāϰ āĻ•āϰāĻŦ⧎ KubernetesāĻ•āĻžāϰāĻŖ āĻāϟāĻž āĻŦā§‹āĻāĻž āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖāĨ¤ Quarkus āϕ⧇ Kubernetes-āĻāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āϜāĻžāĻ­āĻž āĻ¸ā§āĻŸā§āϝāĻžāĻ• āĻšāĻŋāϏāĻžāĻŦ⧇ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāύ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇, āĻāϟāĻŋ āϜāĻžāĻ­āĻž āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āĻāĻŦāĻ‚ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϗ⧁āϞāĻŋāϰ āĻŽā§‡āĻŽāϰāĻŋ āĻ–āϰāϚ āĻāĻŦāĻ‚ āĻ¸ā§āϟāĻžāĻ°ā§āϟāφāĻĒ⧇āϰ āϏāĻŽāϝāĻŧ āĻ•āĻŽāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āĻĄāĻŋāϜāĻžāχāύ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇, āĻāĻŦāĻ‚ āĻĢāϞāĻ¸ā§āĻŦāϰ⧂āĻĒ, āĻšā§‹āĻ¸ā§āĻŸā§‡ āϤāĻžāĻĻ⧇āϰ āϘāύāĻ¤ā§āĻŦ āĻŦāĻžāĻĄāĻŧāĻžāϤ⧇ āĻāĻŦāĻ‚ āϏāĻžāĻŽāĻ—ā§āϰāĻŋāĻ• āĻ–āϰāϚ āĻ•āĻŽāĻžāϤ⧇āĨ¤

āϕ⧋āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϏāĻ“ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧ āĻĒā§āϰāϜāĻ¨ā§āĻŽ āϏāĻŽāĻ°ā§āĻĨāύ āĻ•āϰ⧇ Kubernetes āϏāĻŽā§āĻĒāĻĻ āĻāĻŦāĻ‚ āĻ…āĻĢāĻžāϰ āĻ—āĻžāχāĻĄ Kubernetes āĻāĻŦāĻ‚ Red Hat OpenShift āĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽā§‡ āĻ¸ā§āĻĨāĻžāĻĒāύāĻžāϰ āϜāĻ¨ā§āϝāĨ¤ āωāĻĒāϰāĻ¨ā§āϤ⧁, Quarkus āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ Dockerfile.jvm (JVM āĻĒā§āϝāĻžāϕ⧇āϜāĻŋāĻ‚) āĻāĻŦāĻ‚ Dockerfile.native (āύ⧇āϟāĻŋāĻ­ āĻŦāĻžāχāύāĻžāϰāĻŋ āĻĒā§āϝāĻžāϕ⧇āϜāĻŋāĻ‚) āĻĢāĻžāχāϞ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āϝāĻž āĻ•āύāĻŸā§‡āχāύāĻžāϰ āϤ⧈āϰāĻŋāϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāϝāĻŧā§‹āϜāύāĨ¤

āĻ…āĻŦāĻļ⧇āώ⧇, āϞāĻ•ā§āĻˇā§āϝ āĻ¸ā§āĻĨāĻžāĻĒāύāĻžāϰ āĻĒāϰāĻŋāĻŦ⧇āĻļ āĻšāĻŋāϏāĻžāĻŦ⧇ Kubernetes-āĻ āĻĢā§‹āĻ•āĻžāϏ āĻ•āϰ⧇, Quarkus āϜāĻžāĻ­āĻž āĻĢā§āϰ⧇āĻŽāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āύāĻž āϝ⧇āĻ–āĻžāύ⧇ āĻāĻ•āχ āϧāϰāύ⧇āϰ āĻ•āĻžāĻ°ā§āϝāĻ•āĻžāϰāĻŋāϤāĻž āϕ⧁āĻŦāĻžāϰāύ⧇āϟāϏ āĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽā§‡āϰ āĻ¸ā§āϤāϰ⧇āχ āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ āϏāĻžāϰāĻŖāĻŋ 1 āϕ⧁āĻŦāĻžāϰāύ⧇āϟāϏ āĻāĻŦāĻ‚ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰāĻĻ⧇āϰ āĻĻā§āĻŦāĻžāϰāĻž āĻŦā§āϝāĻŦāĻšā§ƒāϤ āϏāĻžāϧāĻžāϰāĻŖ āϜāĻžāĻ­āĻž āĻĢā§āϰ⧇āĻŽāĻ“āϝāĻŧāĻžāĻ°ā§āĻ•āϗ⧁āϞāĻŋāϰ āĻŽāĻ§ā§āϝ⧇ āĻ•āĻžāĻ°ā§āϝāĻ•āϰ⧀ āϚāĻŋāĻ āĻŋāĻĒāĻ¤ā§āϰ⧇āϰ āĻāĻ•āϟāĻŋ āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰ āϏāϰāĻŦāϰāĻžāĻš āĻ•āϰ⧇āĨ¤

āϏāĻžāϰāĻŖā§€ 1. āϜāĻžāĻ­āĻž āĻĢā§āϰ⧇āĻŽāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻāĻŦāĻ‚ āϕ⧁āĻŦāĻžāϰāύ⧇āϟāϏ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āĻ•āĻžāĻ°ā§āϝāĻ•āϰ⧀ āϚāĻŋāĻ āĻŋāĻĒāĻ¤ā§āϰ⧇āϰ āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰāĨ¤

āĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻŽā§‚āϞāĻ•
āϐāϤāĻŋāĻšā§āϝāĻŦāĻžāĻšā§€ āĻŦāϏāĻ¨ā§āϤ āĻŦ⧁āϟ
Kubernetes

āĻĒāϰāĻŋāώ⧇āĻŦāĻž āφāĻŦāĻŋāĻˇā§āĻ•āĻžāϰ
āχāωāϰ⧇āĻ•āĻž
āĻĄāĻŋāĻāύāĻāϏ

āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ
āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻ•ā§āϞāĻžāωāĻĄ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ
āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰ/āϏāĻŋāĻ•ā§āϰ⧇āϟ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰ⧁āύ

āĻ­āĻžāϰāϏāĻžāĻŽā§āϝ āϞ⧋āĻĄ āĻ•āϰ⧁āύ
āĻĢāĻŋāϤāĻž (āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āϏāĻžāχāĻĄ)
āϏāĻžāĻ°ā§āĻ­āĻŋāϏ, āϰ⧇āĻĒā§āϞāĻŋāϕ⧇āĻļāύ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ (āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϏāĻžāχāĻĄ)

āωāĻĻāĻžāĻšāϰāĻŖ āĻĨ⧇āϕ⧇ āϕ⧋āĻĄ āĻ•āĻŽā§āĻĒāĻžāχāϞ āĻāĻŦāĻ‚ āϰāĻžāύ āĻ•āϰāĻž

āĻāχ āύāĻŋāĻŦāĻ¨ā§āϧ⧇ āφāĻŽāϰāĻž āωāĻ˛ā§āϞ⧇āĻ– āĻ•āϰāĻŋ āωāĻĻāĻžāĻšāϰāĻŖ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ, āϝ⧇āĻ–āĻžāύ⧇ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻāĻŦāĻ‚ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ API āĻāĻŦāĻ‚ āĻāĻŽāύāĻ•āĻŋ āĻāĻ•āχ āϜāĻžāĻ­āĻž āĻ•ā§āϞāĻžāϏ āĻāĻ•āϏāĻžāĻĨ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ āĻāχ āωāĻĻāĻžāĻšāϰāϪ⧇āϰ āϕ⧋āĻĄāϟāĻŋ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āϞāĻžāχāύ āĻĨ⧇āϕ⧇ āĻ•āĻŽā§āĻĒāĻžāχāϞ āĻāĻŦāĻ‚ āϚāĻžāϞāĻžāύ⧋ āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇, āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤ āϜāĻžāύāĻžāϰ āϜāĻ¨ā§āϝ README.md āĻĢāĻžāχāϞāϟāĻŋ āĻĻ⧇āϖ⧁āύāĨ¤

āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻĢā§āϰ⧇āĻŽāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• API

āχāύāĻœā§‡āĻ•āĻļāύ āύāĻŋāĻ°ā§āĻ­āϰāϤāĻž

āϕ⧋āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϏ āĻāĻ•āϟāĻŋ āĻĒāϰāĻŋāϏ⧀āĻŽāĻž āϏāĻŽāĻ°ā§āĻĨāύ āĻ•āϰ⧇ āĻĒā§āϰāϏāĻ™ā§āĻ— āĻāĻŦāĻ‚ āύāĻŋāĻ°ā§āĻ­āϰāϤāĻž āχāύāĻœā§‡āĻ•āĻļāύ (CDI) APIs āĻāĻŦāĻ‚ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻĄāĻŋāĻĒ⧇āύāĻĄā§‡āĻ¨ā§āϏāĻŋ āχāύāĻœā§‡āĻ•āĻļāύ (āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻĄāĻŋāφāχ) āĻāĻĒāĻŋāφāχāĨ¤ āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āύāĻŋāϝāĻŧ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇āύ, āϜāĻžāĻ­āĻž āχāχ āĻāĻŦāĻ‚ āϜāĻžāĻ•āĻžāĻ°ā§āϤāĻž āχāχ, āϤāĻžāĻšāϞ⧇ āφāĻĒāύāĻŋ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇āχ CDI āĻāϰ āϏāĻžāĻĨ⧇ āϖ⧁āĻŦ āĻĒāϰāĻŋāϚāĻŋāϤāĨ¤ āĻ…āĻ¨ā§āϝāĻĻāĻŋāϕ⧇, āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰāϰāĻž āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻĄāĻŋāφāχ-āĻāϰ āϏāĻžāĻĨ⧇ āϏāĻžāĻŽāĻžā§āϜāĻ¸ā§āϝ āĻ…āĻ°ā§āϜāύ āĻ•āϰāϤ⧇ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ DI API-āĻāϰ āϜāĻ¨ā§āϝ āϕ⧋āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϏ āĻāĻ•ā§āϏāĻŸā§‡āύāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āϏāĻŽāĻ°ā§āĻĨāĻŋāϤ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ DI API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āωāĻĻāĻžāĻšāϰāĻŖāϗ⧁āϞāĻŋ āϏāĻžāϰāĻŖāĻŋ 2 āĻ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧ⧇āϛ⧇āĨ¤

В āφāĻŽāĻžāĻĻ⧇āϰ āωāĻĻāĻžāĻšāϰāĻŖ āĻĨ⧇āϕ⧇ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ āϏāĻŋāĻĄāĻŋāφāχ āĻāĻŦāĻ‚ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻĄāĻŋāĻĒ⧇āύāĻĄā§‡āĻ¨ā§āϏāĻŋ āχāύāĻœā§‡āĻ•āĻļāύ āωāĻ­āϝāĻŧāχ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĨ¤ āĻāχ āĻŦāĻŋāώāϝāĻŧ⧇ āφāϰāĻ“ āϤāĻĨā§āϝ āĻāĻŦāĻ‚ āωāĻĻāĻžāĻšāϰāϪ⧇āϰ āϜāĻ¨ā§āϝ, āϕ⧋āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϏ āĻ—āĻžāχāĻĄ āĻĻ⧇āϖ⧁āύ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻĄāĻŋāφāχ āĻ—āĻžāχāĻĄ.

āϏāĻžāϰāĻŖāĻŋ 2. āϏāĻŽāĻ°ā§āĻĨāĻŋāϤ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ DI API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āωāĻĻāĻžāĻšāϰāĻŖāĨ¤

āϏāĻŽāĻ°ā§āĻĨāĻŋāϤ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ DI āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ
āωāĻĻāĻžāĻšāϰāĻŖ

āĻ•āύāĻ¸ā§āĻŸā§āϰāĻžāĻ•ā§āϟāϰ āχāύāĻœā§‡āĻ•āĻļāύ

public PersonSpringController(
   PersonSpringRepository personRepository,  // injected      
   PersonSpringMPService personService) {    // injected
      this.personRepository = personRepository;
      this.personService = personService;
}

āĻĢāĻŋāĻ˛ā§āĻĄ āχāύāĻœā§‡āĻ•āĻļāύ
āĻ…āĻŸā§‹āĻ“āϝāĻŧā§āϝāĻžāϰāĻĄ
āĻŽā§‚āĻ˛ā§āϝ

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

@Value("${fallbackSalutation}")
String fallbackSalutation;

āĻļāĻŋāĻŽ
@āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ

@Configuration
public class AppConfiguration {
   @Bean(name = "capitalizeFunction")
   public StringFunction capitalizer() {
      return String::toUpperCase;
   }
}

āωāĻĒāĻžāĻĻāĻžāύ

@Component("noopFunction")
public class NoOpSingleStringFunction implements StringFunction {
   @Override
   public String apply(String s) {
      return s;
   }
}

āϏ⧇āĻŦāĻž

@Service
public class MessageProducer {
   @Value("${greeting.message}")
   String message;

   public String getPrefix() {
      return message;
   }
}

āĻ“āϝāĻŧ⧇āĻŦ āĻĢā§āϰ⧇āĻŽāĻ“āϝāĻŧāĻžāĻ°ā§āĻ•

āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰāĻž āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āϰāĻŦ⧇āύ āϝ⧇ āϕ⧋āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϏ āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ• āĻ“āϝāĻŧ⧇āĻŦ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāĻŋāĻ‚ āĻŽāĻĄā§‡āϞ āĻšāĻŋāϏāĻžāĻŦ⧇ JAX-RS, āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āϰ⧇āĻ¸ā§āϟ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ, JSON-P, āĻāĻŦāĻ‚ JSON-B āϏāĻŽāĻ°ā§āĻĨāύ āĻ•āϰ⧇āĨ¤ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰāϰāĻž āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻ“āϝāĻŧ⧇āĻŦ API, āĻŦāĻŋāĻļ⧇āώ āĻ•āϰ⧇ REST āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ⧇āϰ āϜāĻ¨ā§āϝ āϕ⧋āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϏ⧇āϰ āϏāĻžāĻŽā§āĻĒā§āϰāϤāĻŋāĻ• āϏāĻŽāĻ°ā§āĻĨāύ⧇ āϏāĻ¨ā§āϤ⧁āĻˇā§āϟ āĻšāĻŦ⧇āĨ¤ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻĄāĻŋāφāχ-āĻāϰ āĻŽāϤ⧋, āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻ“āϝāĻŧ⧇āĻŦ API āϏāĻŽāĻ°ā§āĻĨāύ⧇āϰ āĻŽā§‚āϞ āϞāĻ•ā§āĻˇā§āϝ āĻšāϞ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰāĻĻ⧇āϰ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ API-āĻāϰ āϏāĻžāĻĨ⧇ āĻāĻ•āĻ¤ā§āϰ⧇ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻ“āϝāĻŧ⧇āĻŦ API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āϏāĻ•ā§āώāĻŽ āĻ•āϰāĻžāĨ¤ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āϏāĻŽāĻ°ā§āĻĨāĻŋāϤ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻ“āϝāĻŧ⧇āĻŦ āĻāĻĒāĻŋāφāχ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻšāϝāĻŧ āϤāĻžāϰ āωāĻĻāĻžāĻšāϰāĻŖ āϏāĻžāϰāĻŖāĻŋ 3-āϤ⧇ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧ⧇āϛ⧇ āĻāĻŦāĻ‚ āĻāχ āĻŦāĻŋāώāϝāĻŧ⧇ āφāϰāĻ“ āϤāĻĨā§āϝ āĻ“ āωāĻĻāĻžāĻšāϰāĻŖ āϕ⧋āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϏ āϟāĻŋāωāĻŸā§‹āϰāĻŋāϝāĻŧāĻžāϞ-āĻ āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāĻŦ⧇ āĻŦāϏāĻ¨ā§āϤ āĻ“āϝāĻŧ⧇āĻŦ āĻ—āĻžāχāĻĄ.

āϏāĻžāϰāĻŖāĻŋ 3. āϏāĻŽāĻ°ā§āĻĨāĻŋāϤ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻ“āϝāĻŧ⧇āĻŦ API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āωāĻĻāĻžāĻšāϰāĻŖāĨ¤

āϏāĻŽāĻ°ā§āĻĨāĻŋāϤ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻ“āϝāĻŧ⧇āĻŦ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ
āωāĻĻāĻžāĻšāϰāĻŖ

@āϰ⧇āĻ¸ā§āϟ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ
@RequestMapping

@RestController
@RequestMapping("/person")
public class PersonSpringController {
   ...
   ...
   ...
}

@āϗ⧇āϟāĻŽā§āϝāĻžāĻĒāĻŋāĻ‚
@āĻĒā§‹āĻ¸ā§āϟāĻŽā§āϝāĻžāĻĒāĻŋāĻ‚
@āĻĒ⧁āϟāĻŽā§āϝāĻžāĻĒāĻŋāĻ‚
@āĻĄāĻŋāϞāĻŋāϟāĻŽā§āϝāĻžāĻĒāĻŋāĻ‚
@āĻĒā§āϝāĻžāϚāĻŽā§āϝāĻžāĻĒāĻŋāĻ‚
@RequestParam
@RequestHeader
@MatrixVariable
@āĻĒāĻžāĻĨāϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ
@āϕ⧁āĻ•āĻŋāĻ­ā§āϝāĻžāϞ⧁
@RequestBody
@ āϰ⧇āϏāĻĒāĻ¨ā§āϏ āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ
@ āĻŦā§āϝāϤāĻŋāĻ•ā§āϰāĻŽ āĻšā§āϝāĻžāĻ¨ā§āĻĄāϞāĻžāϰ
@RestControllerAdvice (āφāĻ‚āĻļāĻŋāĻ•)

@GetMapping(path = "/greet/{id}",
   produces = "text/plain")
   public String greetPerson(
   @PathVariable(name = "id") long id) {
   ...
   ...
   ...
}

āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻĄā§‡āϟāĻž JPA

āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰāĻžāĻ“ āĻĒā§āϰāĻļāĻ‚āϏāĻž āĻ•āϰāĻŦ⧇āύ āϝ⧇ āϕ⧋āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϏ āĻšāĻžāχāĻŦāĻžāϰāύ⧇āϟ ORM āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ JPA āϏāĻŽāĻ°ā§āĻĨāύ āĻ•āϰ⧇āĨ¤ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰāĻĻ⧇āϰ āϜāĻ¨ā§āϝāĻ“ āϏ⧁āϏāĻ‚āĻŦāĻžāĻĻ āϰāϝāĻŧ⧇āϛ⧇: āϕ⧋āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϏ āϏāĻžāϧāĻžāϰāĻŖ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻĄā§‡āϟāĻž JPA āĻŸā§€āĻ•āĻž āĻāĻŦāĻ‚ āĻĒā§āϰāĻ•āĻžāϰāϗ⧁āϞāĻŋāϕ⧇ āϏāĻŽāĻ°ā§āĻĨāύ āĻ•āϰ⧇⧎ āϏāĻŽāĻ°ā§āĻĨāĻŋāϤ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻĄā§‡āϟāĻž JPA API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āωāĻĻāĻžāĻšāϰāĻŖ āϏāĻžāϰāĻŖāĻŋ 4 āĻ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧ⧇āϛ⧇āĨ¤
В āφāĻŽāĻžāĻĻ⧇āϰ āωāĻĻāĻžāĻšāϰāĻŖ āĻĨ⧇āϕ⧇ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻĄā§‡āϟāĻž JPA API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧ āĻāĻŦāĻ‚ Quarkus āϟāĻŋāωāĻŸā§‹āϰāĻŋāϝāĻŧāĻžāϞ āύāĻžāĻŽāĻ• āφāϰāĻ“ āϤāĻĨā§āϝ āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāϝāĻŧ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻĄā§‡āϟāĻž JPA āĻ—āĻžāχāĻĄ.

āϏāĻžāϰāĻŖāĻŋ 4. āϏāĻŽāĻ°ā§āĻĨāĻŋāϤ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻĄā§‡āϟāĻž JPA API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āωāĻĻāĻžāĻšāϰāĻŖāĨ¤

āϏāĻŽāĻ°ā§āĻĨāĻŋāϤ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻĄā§‡āϟāĻž JPA āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ
āωāĻĻāĻžāĻšāϰāĻŖ

CrudRepository

public interface PersonRepository
         extends JpaRepository,
                 PersonFragment {
   ...
}

āϏāĻ‚āĻ—ā§āϰāĻšāĻ¸ā§āĻĨāϞ⧇āϰ āĻĒā§āϰāϝāĻŧā§‹āĻ—
JpaRepository
āĻĒ⧇āϜāĻŋāĻ‚āĻāĻ¨ā§āĻĄ āϏāĻ°ā§āϟāĻŋāĻ‚ āϰāĻŋāĻĒā§‹āϜāĻŋāϟāϰāĻŋ

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

āϏāĻ‚āĻ—ā§āϰāĻšāĻ¸ā§āĻĨāϞ āĻ–āĻŖā§āĻĄ

public interface PersonRepository
         extends JpaRepository,
                 PersonFragment {
   ...
}

āĻĒā§āϰāĻžāĻĒā§āϤ āĻ•ā§āϝ⧋āϝāĻŧāĻžāϰ⧀ āĻĒāĻĻā§āϧāϤāĻŋ

public interface PersonRepository extends CrudRepository {

    List findByName(String name);
    
    Person findByNameBySsn(String ssn);
    
    Optional 
       findByNameBySsnIgnoreCase(String ssn);

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀-āϏāĻ‚āĻœā§āĻžāĻžāϝāĻŧāĻŋāϤ āĻĒā§āϰāĻļā§āύ

public interface MovieRepository
         extends CrudRepository {

    Movie findFirstByOrderByDurationDesc();

    @Query("select m from Movie m where m.rating = ?1")
    Iterator findByRating(String rating);

    @Query("from Movie where title = ?1")
    Movie findByTitle(String title);
}

āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ API

āĻĻā§‹āώ āϏāĻšāύāĻļā§€āϞāϤāĻž

āĻ•ā§āϝāĻžāϏāϕ⧇āĻĄāĻŋāĻ‚ āĻŦā§āϝāĻ°ā§āĻĨāϤāĻž āϰ⧋āϧ āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻŽāĻžāχāĻ•ā§āϰ⧋āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āφāĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āϚāĻžāϰ āϤ⧈āϰāĻŋāϰ āϜāĻ¨ā§āϝ āĻĢāĻ˛ā§āϟ āϟāϞāĻžāϰ⧇āĻ¨ā§āϏ āĻ•āύāĻ¸ā§āĻŸā§āϰāĻžāĻ•ā§āϟ āϖ⧁āĻŦāχ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖāĨ¤ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰāϰāĻž āĻŦāĻšā§ āĻŦāĻ›āϰ āϧāϰ⧇ āĻ¤ā§āϰ⧁āϟāĻŋ āϏāĻšāύāĻļā§€āϞāϤāĻžāϰ āϜāĻ¨ā§āϝ āϏāĻžāĻ°ā§āĻ•āĻŋāϟ-āĻŦā§āϰ⧇āĻ•āĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϛ⧇āύāĨ¤ āĻšāĻŋāĻ¸ā§āĻŸā§āϰāĻŋāĻ•ā§āϏ. āϝāĻžāχāĻšā§‹āĻ•, āĻšāĻžāχāĻ¸ā§āĻŸā§āϰāĻŋāĻ•ā§āϏ āĻĻā§€āĻ°ā§āϘāĻĻāĻŋāύ āϧāϰ⧇ āφāĻĒāĻĄā§‡āϟ āĻ•āϰāĻž āĻšāϝāĻŧāύāĻŋ, āϤāĻŦ⧇ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ⧇āϰ āĻĢāĻ˛ā§āϟ āϟāϞāĻžāϰ⧇āĻ¨ā§āϏ āĻāĻ–āύ āϏāĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āĻŦāĻŋāĻ•āĻžāĻļ āĻ•āϰāϛ⧇ āĻāĻŦāĻ‚ āĻāϰ āĻĒāĻŋāĻ›āύ⧇ āĻŦ⧇āĻļ āĻ•āϝāĻŧ⧇āĻ• āĻŦāĻ›āϰ⧇āϰ āĻ‰ā§ŽāĻĒāĻžāĻĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āϰāϝāĻŧ⧇āϛ⧇āĨ¤ āĻ…āϤāĻāĻŦ, āϕ⧋āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϏ⧇ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϗ⧁āϞāĻŋāϰ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝāϤāĻž āωāĻ¨ā§āύāϤ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ, āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻĢāĻ˛ā§āϟ āϟāϞāĻžāϰ⧇āĻ¨ā§āϏ API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āĻĒāϰāĻžāĻŽāĻ°ā§āĻļ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāĻšā§āϛ⧇, āϝāĻžāϰ āωāĻĻāĻžāĻšāϰāĻŖ āϏāĻžāϰāĻŖā§€ 5 āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇āĨ¤ āĻāχ āĻŦāĻŋāώāϝāĻŧ⧇ āφāϰāĻ“ āϤāĻĨā§āϝ⧇āϰ āϜāĻ¨ā§āϝ, āϕ⧋āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϏ āĻŽā§āϝāĻžāύ⧁āϝāĻŧāĻžāϞ āĻĻ⧇āϖ⧁āύ āĻĢāĻ˛ā§āϟ āϟāϞāĻžāϰ⧇āĻ¨ā§āϏ āĻ—āĻžāχāĻĄ.

āϏāĻžāϰāĻŖāĻŋ 5. āϏāĻŽāĻ°ā§āĻĨāĻŋāϤ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻĢāĻ˛ā§āϟ āϟāϞāĻžāϰ⧇āĻ¨ā§āϏ API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āωāĻĻāĻžāĻšāϰāĻŖāĨ¤

āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻĢāĻ˛ā§āϟ āϟāϞāĻžāϰ⧇āĻ¨ā§āϏ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ
āĻŦāĻŋāĻŦāϰāĻŖ
āωāĻĻāĻžāĻšāϰāĻŖ

@āĻ…ā§āϝāĻžāϏāĻŋāύāĻ•ā§āϰ⧋āύāĻžāϏ

āĻāĻ•āϟāĻŋ āĻĒ⧃āĻĨāĻ• āĻĨā§āϰ⧇āĻĄā§‡ āϝ⧁āĻ•ā§āϤāĻŋ āύāĻŋāĻ°ā§āĻŦāĻžāĻš āĻ•āϰāĻž āĻšāĻšā§āϛ⧇

@Asynchronous
@Retry
public Future<String> getSalutation() {
   ...
   return future;
}

@āĻŦāĻžāĻ˛ā§āĻ•āĻšā§‡āĻĄ

āĻāĻ•āϝ⧋āϗ⧇ āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āϏāĻ‚āĻ–ā§āϝāĻž āϏ⧀āĻŽāĻŋāϤ āĻ•āϰ⧁āύ

@Bulkhead(5)
public void fiveConcurrent() {
   makeRemoteCall(); //...
}

@āϏāĻžāĻ°ā§āĻ•āĻŋāϟ āĻŦā§āϰ⧇āĻ•āĻžāϰ

āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻŦā§āϝāĻ°ā§āĻĨāϤāĻž āĻšā§āϝāĻžāĻ¨ā§āĻĄāϞāĻŋāĻ‚ āĻāĻŦāĻ‚ āĻŦā§āϝāĻ°ā§āĻĨāϤāĻž āĻĨ⧇āϕ⧇ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ

@CircuitBreaker(delay=500   // milliseconds
   failureRatio = .75,
   requestVolumeThreshold = 20,
   successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

@āĻĒāĻŋāϛ⧁ āĻšāϟ

āĻŦā§āϝāĻ°ā§āĻĨāϤāĻžāϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āϝ⧁āĻ•ā§āϤāĻŋ āĻ•āϞ āĻ•āϰāĻž

@Timeout(500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

public String fallback() {
   return "hello";
}

āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāĻž

āĻ…āύ⧁āϰ⧋āϧ āĻŦā§āϝāĻ°ā§āĻĨ āĻšāϞ⧇ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧁āύ

@Retry(maxRetries=3)
public String getSalutation() {
   makeRemoteCall(); //...
}

āϏāĻŽāϝāĻŧ āĻļ⧇āώ

āĻŦā§āϝāĻ°ā§āĻĨāϤāĻž āύāĻŋāϝāĻŧāĻ¨ā§āĻ¤ā§āϰāϪ⧇āϰ āϏāĻŽāϝāĻŧāϏ⧀āĻŽāĻž

@Timeout(value = 500 )   // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

āĻšā§‡āĻ•āĻŋāĻ‚ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ (āĻĒāϰāĻŋāώ⧇āĻŦāĻž āĻ¸ā§āĻŦāĻžāĻ¸ā§āĻĨā§āϝ)

Kubernetes āĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽāϗ⧁āϞāĻŋ āĻŦāĻŋāĻļ⧇āώ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϗ⧁āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰāϗ⧁āϞāĻŋāϰ āĻ¸ā§āĻŦāĻžāĻ¸ā§āĻĨā§āϝ āĻĒāĻ°ā§āϝāĻŦ⧇āĻ•ā§āώāĻŖ āĻ•āϰ⧇āĨ¤ āĻ…āĻ¨ā§āϤāĻ°ā§āύāĻŋāĻšāĻŋāϤ āĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽāϟāĻŋāϕ⧇ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϗ⧁āϞāĻŋ āύāĻŋāϰ⧀āĻ•ā§āώāĻŖ āĻ•āϰāĻžāϰ āĻ…āύ⧁āĻŽāϤāĻŋ āĻĻ⧇āĻ“āϝāĻŧāĻžāϰ āϜāĻ¨ā§āϝ, āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāϰ⧀āϰāĻž āϏāĻžāϧāĻžāϰāĻŖāϤ āĻāĻ•āϟāĻŋ āĻ•āĻžāĻ¸ā§āϟāĻŽ āĻšā§‡āϞāĻĨ āχāĻ¨ā§āĻĄāĻŋāϕ⧇āϟāϰ āĻāĻŦāĻ‚ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻŦ⧁āϟ āĻ…ā§āϝāĻžāĻ•āϚ⧁āϝāĻŧ⧇āϟāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĨ¤ āϕ⧋āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϏ⧇, āĻāϟāĻŋ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻšā§‡āϞāĻĨ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇, āϝāĻž āĻĄāĻŋāĻĢāĻ˛ā§āϟāĻ­āĻžāĻŦ⧇ āĻāĻ•āϟāĻŋ āĻœā§€āĻŦāĻ¨ā§āϤāϤāĻž āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻāĻ•āχ āϏāĻžāĻĨ⧇ āϏāĻœā§€āĻŦāϤāĻž āĻāĻŦāĻ‚ āĻĒā§āϰāĻ¸ā§āϤ⧁āϤāĻŋ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āϕ⧀āĻ­āĻžāĻŦ⧇ āϏāĻŽāĻ°ā§āĻĨāĻŋāϤ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻšā§‡āϞāĻĨ āĻāĻĒāĻŋāφāχ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇āύ āϤāĻžāϰ āωāĻĻāĻžāĻšāϰāĻŖ āϏāĻžāϰāĻŖāĻŋ 6-āĻ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧ⧇āϛ⧇ āĻāĻŦāĻ‚ āϕ⧋āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϏ āĻŽā§āϝāĻžāύ⧁āϝāĻŧāĻžāϞ⧇ āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āϤāĻĨā§āϝ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧ⧇āϛ⧇ āĻ¸ā§āĻŦāĻžāĻ¸ā§āĻĨā§āϝ āĻ—āĻžāχāĻĄ.

āϏāĻžāϰāĻŖāĻŋ 6: āϏāĻŽāĻ°ā§āĻĨāĻŋāϤ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻšā§‡āϞāĻĨ API-āĻāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āωāĻĻāĻžāĻšāϰāĻŖāĨ¤

āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻ¸ā§āĻŦāĻžāĻ¸ā§āĻĨā§āϝ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ
āĻŦāĻŋāĻŦāϰāĻŖ
āωāĻĻāĻžāĻšāϰāĻŖ

@āϞāĻžāχāĻ­āύ⧇āϏ

āĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽ āϰāĻŋāĻŦ⧁āϟ āĻŦā§āϝāĻ°ā§āĻĨ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰāĻžāχāϜāĻĄ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ
āĻļ⧇āώāĻĒā§āϰāĻžāĻ¨ā§āϤ:
āĻšā§‹āĻ¸ā§āϟ: 8080/āĻ¸ā§āĻŦāĻžāĻ¸ā§āĻĨā§āϝ/āϞāĻžāχāĻ­

@Liveness
public class MyHC implements HealthCheck {
  public HealthCheckResponse call() {

   ...
   return HealthCheckResponse
     .named("myHCProbe")
     .status(ready ? true:false)
     .withData("mydata", data)
     .build();  
}

@āĻĒā§āϰāĻ¸ā§āϤ⧁āϤāĻŋ

āĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽāϟāĻŋ āĻĒā§āϰāĻ¸ā§āϤ⧁āϤ āύāĻž āĻšāϞ⧇ āĻ•āύāĻŸā§‡āχāύāĻžāϰāĻžāχāϜāĻĄ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύāϗ⧁āϞāĻŋāϤ⧇ āĻŸā§āĻ°ā§āϝāĻžāĻĢāĻŋāĻ• āĻĒāĻžāĻ āĻžāĻŦ⧇ āύāĻž
āĻļ⧇āώāĻĒā§āϰāĻžāĻ¨ā§āϤ:
āĻšā§‹āĻ¸ā§āϟ:8080/āĻ¸ā§āĻŦāĻžāĻ¸ā§āĻĨā§āϝ/āĻĒā§āϰāĻ¸ā§āϤ⧁āϤ

@Readiness
public class MyHC implements HealthCheck {
  public HealthCheckResponse call() {

   ...
   return HealthCheckResponse
     .named("myHCProbe")
     .status(live ? true:false)
     .withData("mydata", data)
     .build();  
}

āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ

āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύāϗ⧁āϞāĻŋ āĻšāϝāĻŧ āĻ…āĻĒāĻžāϰ⧇āĻļāύāĻžāϞ āωāĻĻā§āĻĻ⧇āĻļā§āϝ⧇ (āĻĒāĻžāϰāĻĢāϰāĻŽā§āϝāĻžāĻ¨ā§āϏ āĻāϏāĻāϞāĻāϗ⧁āϞāĻŋ āύāĻŋāϰ⧀āĻ•ā§āώāĻŖ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ) āĻŦāĻž āĻ…-āĻ…āĻĒāĻžāϰ⧇āĻļāύāĻžāϞ āωāĻĻā§āĻĻ⧇āĻļā§āϝ⧇ (āĻŦā§āϝāĻŦāϏāĻžāϝāĻŧāĻŋāĻ• āĻāϏāĻāϞāĻ) āϜāĻ¨ā§āϝ āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇āĨ¤ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰāϰāĻž āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻŦ⧁āϟ āĻ…ā§āϝāĻžāĻ•āϚ⧁āϝāĻŧ⧇āϟāϰ āĻāĻŦāĻ‚ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻŽāĻŋāϟāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇āĨ¤ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇, āϕ⧋āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϏ āĻŦ⧇āϏāϞāĻžāχāύ āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ (āĻœā§‡āĻ­āĻŋāĻāĻŽ āĻāĻŦāĻ‚ āĻ…āĻĒāĻžāϰ⧇āϟāĻŋāĻ‚ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ), āϭ⧇āĻ¨ā§āĻĄāϰ āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ (āϕ⧋āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϏ) āĻāĻŦāĻ‚ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰāϤ⧇ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĨ¤ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ⧇āϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āϝ⧇ āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāύ JSON āĻāĻŦāĻ‚ OpenMetrics (Prometheus) āφāωāϟāĻĒ⧁āϟ āĻĢāĻ°ā§āĻŽā§āϝāĻžāϟāϗ⧁āϞāĻŋāϕ⧇ āϏāĻŽāĻ°ā§āĻĨāύ āĻ•āϰ⧇⧎ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ āĻāĻĒāĻŋāφāχ āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āωāĻĻāĻžāĻšāϰāĻŖ āϏāĻžāϰāĻŖāĻŋ 7 āĻ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧ⧇āϛ⧇āĨ¤

В āφāĻŽāĻžāĻĻ⧇āϰ āωāĻĻāĻžāĻšāϰāĻŖ āĻĨ⧇āϕ⧇ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰāϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧ. āφāϰāĻ“ āϤāĻĨā§āϝ⧇āϰ āϜāĻ¨ā§āϝ, āϕ⧋āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϏ āĻŽā§āϝāĻžāύ⧁āϝāĻŧāĻžāϞ āĻĻ⧇āϖ⧁āύ āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ āĻ—āĻžāχāĻĄ.

āϏāĻžāϰāĻŖā§€ 7. āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āωāĻĻāĻžāĻšāϰāĻŖāĨ¤

āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ
āĻŦāĻŋāĻŦāϰāĻŖ
āωāĻĻāĻžāĻšāϰāĻŖ

@āĻ—āĻŖāύāĻž āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇

āĻāĻ•āϟāĻŋ āĻ•āĻžāωāĻ¨ā§āϟāĻžāϰ āĻ•āĻžāωāĻ¨ā§āϟāĻžāϰ āύāĻŋāĻ°ā§āĻĻ⧇āĻļ āĻ•āϰ⧇ āϝāĻž āĻāĻ•āϟāĻŋ āĻŸā§€āĻ•āĻžāĻ•ā§ƒāϤ āĻŦāĻ¸ā§āϤ⧁āϕ⧇ āĻ•āϤāĻŦāĻžāϰ āĻ•āϞ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇ āϤāĻž āĻ—āĻŖāύāĻž āĻ•āϰ⧇

@Counted(name = "fallbackCounter", 
  displayName = "Fallback Counter", 
  description = "Fallback Counter")
public String salutationFallback() {
   return fallbackSalutation;
}

@ConcurrentGauge

āĻāĻ•āϟāĻŋ āϗ⧇āϜ āύāĻŋāĻ°ā§āĻĻ⧇āĻļ āĻ•āϰ⧇ āϝāĻž āĻāĻ•āϟāĻŋ āĻŸā§€āĻ•āĻžāϝ⧁āĻ•ā§āϤ āĻŦāĻ¸ā§āϤ⧁āϤ⧇ āϏāĻŽāϏāĻžāĻŽāϝāĻŧāĻŋāĻ• āĻ•āϞ⧇āϰ āϏāĻ‚āĻ–ā§āϝāĻž āĻ—āĻŖāύāĻž āĻ•āϰ⧇

@ConcurrentGuage(
  name = "fallbackConcurrentGauge", 
  displayName="Fallback Concurrent", 
  description="Fallback Concurrent")
public String salutationFallback() {
   return fallbackSalutation;
}

@ āϗ⧇āϜ

āĻāĻ•āϟāĻŋ āϗ⧇āϜ āϏ⧇āĻ¨ā§āϏāϰ āύāĻŋāĻ°ā§āĻĻ⧇āĻļ āĻ•āϰ⧇ āϝāĻž āĻāĻ•āϟāĻŋ āĻŸā§€āĻ•āĻžāϝ⧁āĻ•ā§āϤ āĻŦāĻ¸ā§āϤ⧁āϰ āĻŽāĻžāύ āĻĒāϰāĻŋāĻŽāĻžāĻĒ āĻ•āϰ⧇

@Metered(name = "FallbackGauge",
   displayName="Fallback Gauge",
   description="Fallback frequency")
public String salutationFallback() {
   return fallbackSalutation;
}

@āĻŽāĻŋāϟāĻžāϰ⧇āĻĄ

āĻāĻ•āϟāĻŋ āĻŽāĻŋāϟāĻžāϰ āϏ⧇āĻ¨ā§āϏāϰ āύāĻŋāĻ°ā§āĻĻ⧇āĻļ āĻ•āϰ⧇ āϝāĻž āĻāĻ•āϟāĻŋ āĻŸā§€āĻ•āĻžāϝ⧁āĻ•ā§āϤ āĻŦāĻ¸ā§āϤ⧁āϰ āĻ•āϞ āĻĢā§āϰāĻŋāϕ⧋āϝāĻŧ⧇āĻ¨ā§āϏāĻŋ āύāĻŋāϰ⧀āĻ•ā§āώāĻŖ āĻ•āϰ⧇

@Metered(name = "MeteredFallback",
   displayName="Metered Fallback",
   description="Fallback frequency")
public String salutationFallback() {
   return fallbackSalutation;
}

āĻ›āĻ¨ā§āĻĻā§‹āĻŽāϝāĻŧ

āĻāĻ•āϟāĻŋ āĻŽā§‡āĻŸā§āϰāĻŋāĻ• āĻĒā§āϰāĻŦ⧇āĻļ āĻŦāĻž āωāĻ¤ā§āĻĒāĻžāĻĻāύ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻ…āύ⧁āϰ⧋āϧ āĻĒā§āϰāĻžāĻĒā§āϤ āĻšāϞ⧇ āĻŽā§‡āϟāĻžāĻĄā§‡āϟāĻž āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āϤāĻĨā§āϝ āϧāĻžāϰāĻŖāĻ•āĻžāϰ⧀ āĻāĻ•āϟāĻŋ āĻŸā§€āĻ•āĻžā§ˇ

@Metric
@Metered(name = "MeteredFallback",
   displayName="Metered Fallback",
   description="Fallback frequency")
public String salutationFallback() {
   return fallbackSalutation;
}

āϏ⧁āĻŦāĻŋāϧāĻžāύ⧁āϝāĻžāϝāĻŧā§€

āĻāĻ•āϟāĻŋ āϟāĻžāχāĻŽāĻžāϰ āύāĻŋāĻ°ā§āĻĻ⧇āĻļ āĻ•āϰ⧇ āϝāĻž āĻāĻ•āϟāĻŋ āĻŸā§€āĻ•āĻžāϝ⧁āĻ•ā§āϤ āĻŦāĻ¸ā§āϤ⧁āϰ āϏāĻŽāϝāĻŧāĻ•āĻžāϞ āĻŸā§āĻ°ā§āϝāĻžāĻ• āĻ•āϰ⧇

@Timed(name = "TimedFallback",
   displayName="Timed Fallback",
   description="Fallback delay")
public String salutationFallback() {
   return fallbackSalutation;
}

āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ āĻāĻ¨ā§āĻĄāĻĒāϝāĻŧ⧇āĻ¨ā§āϟ

āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ āĻšā§‹āĻ¸ā§āϟ:8080/āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ/āφāĻŦ⧇āĻĻāύ
āĻŦ⧇āϏāĻŋāĻ• āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ āĻšā§‹āĻ¸ā§āϟ:8080/āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ/āĻŦ⧇āϏ
āĻŦāĻŋāĻ•ā§āϰ⧇āϤāĻž āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ āĻšā§‹āĻ¸ā§āϟ:8080/āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ/āĻŦāĻŋāĻ•ā§āϰ⧇āϤāĻž
āϏāĻŽāĻ¸ā§āϤ āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ āĻšā§‹āĻ¸ā§āϟ:8080/āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ

āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āϰ⧇āĻ¸ā§āϟ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ

āĻŽāĻžāχāĻ•ā§āϰ⧋āϏāĻžāĻ°ā§āĻ­āĻŋāϏāϗ⧁āϞāĻŋ āĻĒā§āϰāĻžāϝāĻŧāχ RESTful āĻāĻ¨ā§āĻĄāĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇ āϝ⧇āϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āϏāĻ‚āĻļā§āϞāĻŋāĻˇā§āϟ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ APIāϗ⧁āϞāĻŋāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻšāϝāĻŧ⧎ RESTful āĻāĻ¨ā§āĻĄāĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇, āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰāϰāĻž āϏāĻžāϧāĻžāϰāĻŖāϤ RestTemplate āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĨ¤ āϕ⧋āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϏ āĻāχ āϏāĻŽāĻ¸ā§āϝāĻž āϏāĻŽāĻžāϧāĻžāύ⧇āϰ āϜāĻ¨ā§āϝ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āϰ⧇āĻ¸ā§āϟ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āĻāĻĒāĻŋāφāχ āĻ…āĻĢāĻžāϰ āĻ•āϰ⧇, āϝāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āωāĻĻāĻžāĻšāϰāĻŖ āϏāĻžāϰāĻŖāĻŋ 8 āĻ āĻĻ⧇āĻ“āϝāĻŧāĻž āφāϛ⧇āĨ¤

В āφāĻŽāĻžāĻĻ⧇āϰ āωāĻĻāĻžāĻšāϰāĻŖ āĻĨ⧇āϕ⧇ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ RESTful āĻāĻ¨ā§āĻĄāĻĒāϝāĻŧ⧇āĻ¨ā§āĻŸā§‡āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āϰ⧇āĻ¸ā§āϟ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ āĻāχ āĻŦāĻŋāώāϝāĻŧ⧇ āφāϰāĻ“ āϤāĻĨā§āϝ āĻāĻŦāĻ‚ āωāĻĻāĻžāĻšāϰāĻŖ āϕ⧋āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϏ āĻŽā§āϝāĻžāύ⧁āϝāĻŧāĻžāϞāϟāĻŋāϤ⧇ āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāĻŦ⧇ āĻŦāĻŋāĻļā§āϰāĻžāĻŽ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āĻ—āĻžāχāĻĄ.

āϏāĻžāϰāĻŖā§€ 8. āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āϰ⧇āĻ¸ā§āϟ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āωāĻĻāĻžāĻšāϰāĻŖāĨ¤

āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻŦāĻŋāĻļā§āϰāĻžāĻŽ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ
āĻŦāĻŋāĻŦāϰāĻŖ
āωāĻĻāĻžāĻšāϰāĻŖ

@āϰ⧇āϜāĻŋāĻ¸ā§āϟāĻžāϰāϰ⧇āĻ¸ā§āϟāĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ

REST āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻāĻ•āϟāĻŋ āϟāĻžāχāĻĒ āĻ•āϰāĻž āϜāĻžāĻ­āĻž āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ āύāĻŋāĻŦāĻ¨ā§āϧāύ āĻ•āϰ⧇

@RegisterRestClient
@Path("/")
public interface MyRestClient {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getSalutation();
}

@āϰ⧇āĻ¸ā§āϟ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ

āĻāĻ•āϟāĻŋ āϟāĻžāχāĻĒ āĻ•āϰāĻž REST āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ⧇āϰ āĻāĻ•āϟāĻŋ āωāĻĻāĻžāĻšāϰāĻŖ āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāύ āϚāĻŋāĻšā§āύāĻŋāϤ āĻ•āϰ⧇

@Autowired // or @Inject
@RestClient
MyRestClient restClient;

āφāĻŦāĻžāĻšāύ

āĻāĻ•āϟāĻŋ REST āĻļ⧇āώ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āĻ•āϞ

System.out.println(
   restClient.getSalutation());

mp-rest/url

REST āĻļ⧇āώ āĻŦāĻŋāĻ¨ā§āĻĻ⧁ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰ⧇

application.properties:
org.example.MyRestClient/mp-rest/url=
   http://localhost:8081/myendpoint

āĻĢāϞāĻžāĻĢāϞ

āĻāχ āĻŦā§āϞāϗ⧇, āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰāĻĻ⧇āϰ āϞāĻ•ā§āĻˇā§āϝ āĻ•āϰ⧇, āφāĻŽāϰāĻž āϜāĻžāĻ­āĻž āĻŽāĻžāχāĻ•ā§āϰ⧋āϏāĻžāĻ°ā§āĻ­āĻŋāϏ⧇āϏ āĻĄā§‡āϭ⧇āϞāĻĒ āĻ•āϰāϤ⧇ Quarkus-āĻāϰ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ API-āĻāϰ āϏāĻžāĻĨ⧇ āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ API-āϗ⧁āϞāĻŋ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ āĻāĻŦāĻ‚ āϤāĻžāϰāĻĒāϰ⧇ āϏ⧇āϗ⧁āϞāĻŋāϕ⧇ āύ⧇āϟāĻŋāĻ­ āĻŦāĻžāχāύāĻžāϰāĻŋ āϕ⧋āĻĄā§‡ āĻ•āĻŽā§āĻĒāĻžāχāϞ āĻ•āϰāĻŦ āϝāĻž āĻļāϤ āĻļāϤ āĻŽā§‡āĻ—āĻžāĻŦāĻžāχāϟ āĻ°â€Œā§āϝāĻžāĻŽ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āϞāĻžā§āϚ āĻ•āϰ⧇āĨ¤ āĻŽāĻŋāϞāĻŋāϏ⧇āϕ⧇āĻ¨ā§āĻĄā§‡āϰ āĻŦā§āϝāĻžāĻĒāĻžāϰāĨ¤

āφāĻĒāύāĻŋ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇āχ āĻŦ⧁āĻāϤ⧇ āĻĒ⧇āϰ⧇āϛ⧇āύ, āĻ¸ā§āĻĒā§āϰāĻŋāĻ‚ āĻāĻŦāĻ‚ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĒā§āϰ⧋āĻĢāĻžāχāϞ API-āĻāϰ āϜāĻ¨ā§āϝ āϏāĻŽāĻ°ā§āĻĨāύ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āφāϰāĻ“ āϤāĻĨā§āϝ, āϏ⧇āχāϏāĻžāĻĨ⧇ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻ…āύ⧇āĻ• āĻĻāϰāĻ•āĻžāϰ⧀ āϤāĻĨā§āϝ āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāĻŦ⧇ āϕ⧋āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϏ āĻŽā§āϝāĻžāύ⧁āϝāĻŧāĻžāϞ.

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

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