ื•ื•ื™ Quarkus ืงืึทืžื‘ื™ื™ื ื– ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ืื•ืŸ ืกืคึผืจื™ื ื’

ื”ืขืœื ืึทืœืขืžืขืŸ, ื“ืึธ ืก ื“ืขืจ ื“ืจื™ื˜ ืคึผืึธืกื˜ืŸ ืื™ืŸ ื“ื™ ืงื•ื•ืึทืจืงื•ืก ืกืขืจื™ืข!

ื•ื•ื™ Quarkus ืงืึทืžื‘ื™ื™ื ื– ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ืื•ืŸ ืกืคึผืจื™ื ื’

ื•ื•ืขืŸ ื“ืขื•ื•ืขืœืึธืคึผื™ื ื’ Java ืžื™ืงืจืึธืกืขืจื•ื•ื™ืกืขืก, ืขืก ืื™ื– ืึธืคื˜ ื’ืขื’ืœื•ื™ื‘ื˜ ืึทื– ืขืงืœื™ืคึผืกืข ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ะธ ืคืจื™ืœื™ื ื’ ืฉื˜ื™ื•ื•ืœ ื–ืขื ืขืŸ ื‘ืึทื–ื•ื ื“ืขืจ ืื•ืŸ ืคืจื™ื™ึท ืึทืคึผื™ืก. ื“ื•ืจืš ืคืขืœื™ืงื™ื™ึทื˜, ืคึผืจืึธื•ื’ืจืึทืžืขืจื– ื˜ืขื ื“ ืฆื• ื ื•ืฆืŸ ื“ื™ ืึทืคึผื™ืก ื–ื™ื™ ื–ืขื ืขืŸ ืฉื•ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ืฆื•, ื•ื•ื™ื™ึทืœ ืœืขืจื ืขืŸ ื ื™ื™ึท ืคืจืึทืžืขื•ื•ืึธืจืงืก ืื•ืŸ ืจื•ื ื˜ื™ืžืข ืงืึทืžืคึผืึธื•ื ืึทื ืฅ ื ืขืžื˜ ืึท ืคึผืœืึทืฅ ืคื•ืŸ ืฆื™ื™ื˜. ื”ื™ื™ึทื ื˜ ืžื™ืจ ื•ื•ืขืœืŸ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ืคืึทืจืคึผืึธืฉืขื˜ืขืจืŸ ื“ื™ ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืคื•ืŸ ืขื˜ืœืขื›ืข ืคืึธืœืงืก ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ืึทืคึผื™ ืคึฟืึทืจ ืกืคึผืจื™ื ื’ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ืื•ืŸ ื•ื•ื™ื™ึทื–ืŸ ืื™ืจ ื•ื•ื™ ืฆื• ืกื™ื™ืžืึทืœื˜ื™ื™ื ื™ืึทืกืœื™ ื ื•ืฆืŸ ื“ื™ ืกืคึผืจื™ื ื’ ืึทืคึผื™ ืื•ืŸ ื ื™ื™ึทืข ื ื•ืฆื™ืง ืคึฟืขื™ึดืงื™ื™ื˜ืŸ ืงื•ื•ืึทืจืงื•ืก.

ืื™ืŸ ืึท ื‘ื™ืกืœ ืžืขืจ ื“ืขื˜ืึทืœ, ืžื™ืจ ื•ื•ืขืœืŸ ืขืจืฉื˜ืขืจ ืงื•ืงืŸ ืื™ืŸ ื“ื™ ืคืึทืจื ืขื ืื•ืŸ ื“ืขื˜ืึทื™ืœืก ืคื•ืŸ ื•ื•ื™ Quarkus ืฉื˜ื™ืฆื˜ ืกืคึผืจื™ื ื’ ืึทืคึผื™ืก ืฆื• ื•ื•ื™ื™ึทื–ืŸ ืกืคึผืจื™ื ื’ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ื•ื•ื™ ืฆื• ื ื•ืฆืŸ ื“ื™ ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ืึทืคึผื™ ืื™ืŸ ื–ื™ื™ืขืจ ื˜ืึธื’-ืฆื•-ื˜ืึธื’ ืึทืจื‘ืขื˜. ื“ืขืจื ืึธืš ืžื™ืจ ื“ืขืงืŸ ื“ื™ ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ืึทืคึผื™ืก, ื•ื•ืึธืก ื–ืขื ืขืŸ ื ื•ืฆื™ืง ืคึฟืึทืจ ืกืคึผืจื™ื ื’ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ื•ื•ืขืŸ ืงืจื™ื™ื™ื˜ื™ื ื’ ืžื™ืงืจืึธ ื‘ืึทื“ื™ื ื•ื ื’ืก.

ืคืืจื•ื•ืืก ืงื•ื•ืืจืงื•ืก? ืคื™ืจืกื˜ืœื™, ื“ืึธืก ืื™ื– ืœืขื‘ืŸ ืงืึธื“ื™ืจื•ื ื’, ื“ืึธืก ืื™ื–, ืึธื˜ืึทืžืึทื˜ื™ืง ืจื™ืœืึธื•ื“ื™ื ื’ ืคื•ืŸ ืงื™ื™ืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ ืื™ืŸ ื“ื™ ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ืึทืคึผื™, ืกืคึผืจื™ื ื’ ืึทืคึผื™ ืื•ืŸ ืื ื“ืขืจืข ื–'ืื‘ื ืึทืคึผื™ืก, ื•ื•ืึธืก ืื™ื– ื“ื•ืจื›ื’ืขืงืึธื›ื˜ ืžื™ื˜ ื‘ืœื•ื™ื– ืื™ื™ืŸ ื‘ืึทืคึฟืขืœ: mvn quarkus:dev. ืฆื•ื•ื™ื™ื˜ื ืก, ื‘ืึทื˜ืจืึทื›ื˜ ืื™ืŸ ืื™ืŸ ืื•ื ื“ื–ืขืจ ื‘ื™ื™ึทืฉืคึผื™ืœ ื“ืขืจ ืžืขื ื˜ืฉ ื“ื™ื ืกื˜ (ื•ื•ืึธืก ืงืึทืžืคึผื™ื™ืœื– ืคื•ืŸ ืกืคึผืจื™ื ื’, ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ืื•ืŸ ื“ื–ืฉืคึผืึท ืึทืคึผื™ืก ืื™ืŸ ืึท ื‘ื™ื™ื ืขืจื™ ื ื™ืฆืŸ ื“ื™ ื’ืขื‘ื•ื™ืจืŸ GraalVM ื‘ื™ืœื“) ืกื˜ืึทืจืฅ ืื™ืŸ ื‘ืœื•ื™ื– 0.055 ืกืขืงื•ื ื“ืขืก ืื•ืŸ ื ืขืžื˜ ื•ื•ืขื’ืŸ 90 ืžืขื’ืื‘ื™ื™ื˜ืŸ ืคื•ืŸ ื‘ืึทืจืึทืŸ (ืจืกืก) ืื•ื™ืฃ ื“ื™ ืจืขืกื˜ืคื•ืœ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืขื ื“ืคึผื•ื™ื ื˜. ื“ืขืจืฆื•, ื–ื™ื™ืŸ ื–ืึทืžืœื•ื ื’ ื–ื™ืš ืื™ื– ื“ื•ืจื›ื’ืขืงืึธื›ื˜ ืžื™ื˜ ื‘ืœื•ื™ื– ืื™ื™ืŸ ื‘ืึทืคึฟืขืœ: mvn package -Pnative.

ืžื™ืจ ื•ื•ืขืœืŸ ื ื™ืฉื˜ ื’ื™ื™ืŸ ืื™ืŸ ื“ืขื˜ืึทืœ ื•ื•ืขื’ืŸ ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข, ืึทื—ื•ืฅ ืฆื• ื”ืขืœืคึฟืŸ ืกืคึผืจื™ื ื’ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ืคึฟืึทืจืฉื˜ื™ื™ืŸ ื•ื•ื™ ื–ื™ื™ ืงืขื ืขืŸ ื ื•ืฆืŸ ืกืคึผืจื™ื ื’ ืึทืคึผื™ืก ืžื™ื˜ ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ืึทืคึผื™ืก ืื™ืŸ Quarkus.

ืงืึทื ื˜ื™ื™ื ืขืจื– ืื•ืŸ ืงื•ื‘ืขืจื ืขื˜ืขืก

ืฆื• ื”ืึทืœื˜ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืคึผืฉื•ื˜, ืžื™ืจ ื•ื•ืขืœืŸ ื‘ืœื•ื™ื– ื“ืขืงืŸ ื“ื™ ื”ื•ื™ืš-ืžื“ืจื’ื” ืึทืกืคึผืขืงืฅ ืคื•ืŸ ืฉื˜ื™ืฆืŸ ื“ืึธ. Kubernetes, ื•ื•ื™ื™ึทืœ ืขืก ืื™ื– ื•ื•ื™ื›ื˜ื™ืง ืฆื• ืคึฟืึทืจืฉื˜ื™ื™ืŸ. Quarkus ืื™ื– ืคึผืึทื–ื™ืฉืึทื ื“ ื•ื•ื™ ืึท Java ืึธื ืœื™ื™ื’ืŸ ืคึฟืึทืจ Kubernetes, ืขืก ืื™ื– ื“ื™ื–ื™ื™ื ื“ ืฆื• ืžื™ื ืึทืžื™ื™ื– ื–ื›ึผืจื•ืŸ ืงืึทื ืกืึทืžืฉืึทืŸ ืื•ืŸ ืกื˜ืึทืจื˜ืึทืคึผ ืฆื™ื™ื˜ ืคื•ืŸ Java ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ืื•ืŸ ื‘ืึทื“ื™ื ื•ื ื’ืก, ืื•ืŸ, ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜, ืคืึทืจื’ืจืขืกืขืจืŸ ื–ื™ื™ืขืจ ื’ืขื“ื™ื›ื˜ืงื™ื™ึทื˜ ืื•ื™ืฃ ื“ืขืจ ื‘ืึทืœืขื‘ืึธืก ืื•ืŸ ืจืขื“ื•ืฆื™ืจืŸ ื“ื™ ืงื•ื™ืœืขืœื“ื™ืง ืงืึธืก.

ืงื•ื•ืึทืจืงื•ืก ืื•ื™ืš ืฉื˜ื™ืฆื˜ ืึทื•ื˜ืึธ ื“ื•ืจ Kubernetes ืจืขืกื•ืจืกืŸ ืื•ืŸ ืึธืคืคืขืจืก ืคื™ืจืขืจืฉืึทืคื˜ ืคึฟืึทืจ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืื•ื™ืฃ Kubernetes ืื•ืŸ Red Hat OpenShift ืคึผืœืึทื˜ืคืึธืจืžืก. ืื™ืŸ ืึทื“ื™ืฉืึทืŸ, Quarkus ื“ื–ืฉืขื ืขืจื™ื™ืฅ ืื•ื™ื˜ืึธืžืึทื˜ื™ืฉ ื“ื™ Dockerfile.jvm (JVM ืคึผืึทืงืงืึทื’ื™ื ื’) ืื•ืŸ Dockerfile.native (ื’ืขื‘ื•ื™ืจืŸ ื‘ื™ื™ื ืขืจื™ ืคึผืึทืงืงืึทื’ื™ื ื’) ื˜ืขืงืขืก ื“ืืจืฃ ืฆื• ืฉืึทืคึฟืŸ ืงืึทื ื˜ื™ื™ื ืขืจื–.

ืฆื•ื ืกื•ืฃ, ื“ื•ืจืš ืคืึธื•ืงื™ืกื™ื ื’ ืื•ื™ืฃ Kubernetes ื•ื•ื™ ื“ื™ ืฆื™ืœ ื“ื™ืคึผืœื•ื™ืžืึทื ื˜ ืกื•ื•ื™ื•ื•ืข, Quarkus ื˜ื•ื˜ ื ื™ืฉื˜ ื ื•ืฆืŸ Java ืคืจืึทืžืขื•ื•ืึธืจืงืก ืื™ืŸ ืงืึทืกืขืก ื•ื•ืขืŸ ืขื ืœืขืš ืคืึทื ื’ืงืฉืึทื ืึทืœื™ื˜ื™ ืื™ื– ื™ืžืคึผืœืึทืžืขื ืึทื“ ืื•ื™ืฃ ื“ืขืจ ืžื“ืจื’ื” ืคื•ืŸ ื“ื™ Kubernetes ืคึผืœืึทื˜ืคืึธืจืžืข ื–ื™ืš. ื˜ื™ืฉ 1 ื’ื™ื˜ ืึท ืžืึทืคึผืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ืคืึทื ื’ืงืฉืึทื ืึทืœ ืงืึธืจืขืกืคึผืึธื ื“ืขื ืฅ ืฆื•ื•ื™ืฉืŸ Kubernetes ืื•ืŸ ื˜ื™ืคึผื™ืฉ ื–'ืื‘ื ืคืจืึทืžืขื•ื•ืึธืจืงืก ื’ืขื ื™ืฆื˜ ื“ื•ืจืš ืกืคึผืจื™ื ื’ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก.

ื˜ื™ืฉ 1. ืžืึทืคึผืข ืคื•ืŸ โ€‹โ€‹ืคืึทื ื’ืงืฉืึทื ืึทืœ ืงืึธืจืขืกืคึผืึธื ื“ืขื ืฅ ืฆื•ื•ื™ืฉืŸ ื–'ืื‘ื ืคืจืึทืžืขื•ื•ืึธืจืงืก ืื•ืŸ ืงื•ื‘ืขืจื ืขื˜ืขืก.

ืคืึทื ื’ืงืฉืึทื ืึทืœ
ื˜ืจืึทื“ื™ืฆื™ืึธื ืขืœ ืคืจื™ืœื™ื ื’ ืฉื˜ื™ื•ื•ืœ
Kubernetes

ืกืขืจื•ื•ื™ืก ื•ืคื“ืขืงื•ื ื’
ื™ื•ืจื™ืงืึท
ื“ื ืก

ืงืึธื ืคื™ื’ื•ืจืึทื˜ื™ืึธืŸ
ืคืจื™ืœื™ื ื’ ืงืœืึธื•ื“ ืงืึธื ืคื™ื’
ืงืึธื ืคื™ื’ ืžืึทืคึผืก / ืกืขืงืจืขืฅ

ืžืึทืกืข ื‘ืึทืœืึทื ืกื™ื ื’
ื‘ืขื ื“ (ืงืœื™ืขื ื˜ ื–ื™ื™ึทื˜)
ืกืขืจื•ื•ื™ืก, ืจืขืคึผืœืึทืงื™ื™ืฉืึทืŸ ืงืึธื ื˜ืจืึธืœืœืขืจ (ืกืขืจื•ื•ืขืจ ื–ื™ื™ึทื˜)

ืงืึทืžืคึผื™ื™ืœื™ื ื’ ืื•ืŸ ืœื•ื™ืคืŸ ื“ื™ ืงืึธื“ ืคึฟื•ืŸ ื“ืขื ื‘ื™ื™ึทืฉืคึผื™ืœ

ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืžื™ืจ ืึธืคึผืฉื™ืงืŸ ืฆื• ื‘ื™ื™ึทืฉืคึผื™ืœ ืคึผืจื•ื™ืขืงื˜, ื•ื•ื• ื“ื™ ืกืคึผืจื™ื ื’ ืื•ืŸ ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ืึทืคึผื™ืก ืื•ืŸ ืืคื™ืœื• ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ื–'ืื‘ื ืงืœืึทืก ื–ืขื ืขืŸ ื’ืขื ื™ืฆื˜ ืฆื•ื–ืึทืžืขืŸ. ื“ืขืจ ืงืึธื“ ืื™ืŸ ื“ืขื ื‘ื™ื™ึทืฉืคึผื™ืœ ืงืขื ืขืŸ ื–ื™ื™ืŸ ืงืึทืžืคึผื™ื™ืœื“ ืื•ืŸ ืœื•ื™ืคืŸ ืคึฟื•ืŸ ื“ื™ ื‘ืึทืคึฟืขืœืŸ ืฉื•ืจื”, ื–ืขืŸ ื“ื™ README.md ื˜ืขืงืข ืคึฟืึทืจ ืคืจื˜ื™ื.

ืคืจื™ืœื™ื ื’ ืคืจืึทืžืขื•ื•ืึธืจืง ืึทืคึผื™ืก

ื“ืขืคึผืขื ื“ืขื ืกื™ ื™ื ื“ื–ืฉืขืงืฉืึทืŸ

ืงื•ื•ืึทืจืงื•ืก ืฉื˜ื™ืฆื˜ ืึท ืงื™ื™ื˜ ืคื•ืŸ ืงืึธื ื˜ืขืงืกื˜ ืื•ืŸ ืึธืคืขื ื’ื™ืงื™ื™ึทื˜ ื™ื ื“ื–ืฉืขืงืฉืึทืŸ (CDI) ืึทืคึผื™ืก ืื•ืŸ ืกืคึผืจื™ื ื’ ื“ืขืคึผืขื ื“ืขื ืกื™ ื™ื ื“ื–ืฉืขืงืฉืึทืŸ (ืคืจื™ืœื™ื ื’ ื“ื™) ืึทืคึผื™ืก. ืื•ื™ื‘ ืื™ืจ ืึทืจื‘ืขื˜ ืžื™ื˜ ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข, Java EE ืื•ืŸ Jakarta EE, ื“ืขืžืึธืœื˜ ืื™ืจ ื–ืขื ื˜ ืฉื•ื™ืŸ ื–ื™ื™ืขืจ ื‘ืึทืงืึทื ื˜ ืžื™ื˜ CDI. ืื•ื™ืฃ ื“ื™ ืื ื“ืขืจืข ื”ืึทื ื˜, ืกืคึผืจื™ื ื’ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ืงืขื ืขืŸ ื ื•ืฆืŸ ื“ื™ Quarkus Extension for Spring DI API ืฆื• ื“ืขืจื’ืจื™ื™ื›ืŸ ืงืึทืžืคึผืึทื˜ืึทื‘ื™ืœืึทื˜ื™ ืžื™ื˜ ืกืคึผืจื™ื ื’ ื“ื™. ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ื ื™ืฆืŸ ื“ื™ ื’ืขืฉื˜ื™ืฆื˜ Spring DI APIs ื–ืขื ืขืŸ ื’ืขื’ืขื‘ืŸ ืื™ืŸ ื˜ืึทื‘ืœืข 2.

ะ’ ืคึผืจื•ื™ืขืงื˜ ืคื•ืŸ ืื•ื ื“ื–ืขืจ ื‘ื™ื™ึทืฉืคึผื™ืœ ื ื™ืฆื˜ ื‘ื™ื™ื“ืข CDI ืื•ืŸ Spring Dependency Injection. ืคึฟืึทืจ ืžืขืจ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืื•ืŸ ื‘ื™ื™ืฉืคื™ืœืŸ ืื•ื™ืฃ ื“ืขื ื˜ืขืžืข, ื–ืขืŸ ื“ื™ Quarkus ื’ื™ื™ื“ ื’ืขืจื•ืคืŸ ืคืจื™ืœื™ื ื’ ื“ื™ ื’ื™ื™ื“.

ื˜ื™ืฉ 2. ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ื ื™ืฆืŸ ื“ื™ ื’ืขืฉื˜ื™ืฆื˜ ืกืคึผืจื™ื ื’ ื“ื™ ืึทืคึผื™ืก.

ืฉื˜ื™ืฆื˜ ืกืคึผืจื™ื ื’ ื“ื™ ืคึฟืขื™ึดืงื™ื™ื˜ืŸ
ืขืงืกืึทืžืคึผืœืขืก

ืงืึธื ืกื˜ืจื•ืงื˜ืึธืจ ื™ื ื“ื–ืฉืขืงืฉืึทืŸ

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;
   }
}

ื•ื•ืขื‘ ืคืจื™ื™ืžื•ื•ืขืจืง

ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ื ื™ืฆืขืจืก ื•ื•ืขืœืŸ ืœื™ื‘ืข ืึทื– Quarkus ืฉื˜ื™ืฆื˜ JAX-RS, MicroProfile Rest Client, JSON-P ืื•ืŸ JSON-B ื•ื•ื™ ื“ื™ ืขืจืฉื˜ื™ืง ื•ื•ืขื‘ ืคึผืจืึธื’ืจืึทืžืžื™ื ื’ ืžืึธื“ืขืœ. ืคืจื™ืœื™ื ื’ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ื•ื•ืขืœืŸ ื–ื™ื™ืŸ ืฆื•ืคืจื™ื“ืŸ ืžื™ื˜ ื“ื™ ืœืขืฆื˜ืข ืฉื˜ื™ืฆืŸ ืคื•ืŸ Quarkus ืคึฟืึทืจ ื“ื™ ืกืคึผืจื™ื ื’ ื•ื•ืขื‘ ืึทืคึผื™, ืกืคึผืขืฆื™ืขืœ REST ื™ื ื˜ืขืจืคื™ื™ืกื™ื–. ืขื ืœืขืš ืฆื• Spring DI, ื“ืขืจ ื”ื•ื™ืคึผื˜ ืฆื™ืœ ืคื•ืŸ ืกืคึผืจื™ื ื’ ื•ื•ืขื‘ ืึทืคึผื™ ืฉื˜ื™ืฆืŸ ืื™ื– ืฆื• ื’ืขื‘ืŸ ืกืคึผืจื™ื ื’ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ืฆื• ื ื•ืฆืŸ ืกืคึผืจื™ื ื’ ื•ื•ืขื‘ ืึทืคึผื™ืก ืื™ืŸ ืงืึทื ื“ื–ืฉืึทื ื’ืงืฉืึทืŸ ืžื™ื˜ ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ืึทืคึผื™ืก. ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ื•ื•ื™ ืฆื• ื ื•ืฆืŸ ื“ื™ ื’ืขืฉื˜ื™ืฆื˜ ืกืคึผืจื™ื ื’ ื•ื•ืขื‘ ืึทืคึผื™ืก ื–ืขื ืขืŸ ืฆื•ื’ืขืฉื˜ืขืœื˜ ืื™ืŸ ื˜ื™ืฉ 3, ืื•ืŸ ืžืขืจ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืื•ืŸ ื‘ื™ื™ืฉืคื™ืœืŸ ืื•ื™ืฃ ื“ืขื ื˜ืขืžืข ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขืคึฟื•ื ืขืŸ ืื™ืŸ ื“ื™ Quarkus ื˜ื•ื˜ืึธืจื™ืึทืœ ื’ืขืจื•ืคืŸ ืคืจื™ืœื™ื ื’ ื•ื•ืขื‘ ื’ื™ื™ื“.

ื˜ื™ืฉ 3. ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ื ื™ืฆืŸ ื“ื™ ืฉื˜ื™ืฆื˜ ืกืคึผืจื™ื ื’ ื•ื•ืขื‘ ืึทืคึผื™ืก.

ืฉื˜ื™ืฆื˜ ืกืคึผืจื™ื ื’ ื•ื•ืขื‘ ืคึฟืขื™ึดืงื™ื™ื˜ืŸ
ืขืงืกืึทืžืคึผืœืขืก

@RestController
@RequestMapping

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

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ ืขื ื˜ืคืขืจืกื˜ืื˜ื•ืก
@ExceptionHandler
@RestControllerAdvice (ืคึผืึทืจื˜ื™ื™ื™ืฉ)

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

ืคืจื™ืœื™ื ื’ ื“ืึทื˜ืึท ื“ื–ืฉืคึผืึท

ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ื ื™ืฆืขืจืก ื•ื•ืขืœืŸ ืื•ื™ืš ืึธืคึผืฉืึทืฆืŸ ืึทื– Quarkus ืฉื˜ื™ืฆื˜ JPA ื ื™ืฆืŸ ื“ื™ Hibernate ORM. ืขืก ืื™ื– ืื•ื™ืš ื’ื•ื˜ ื ื™ื™ึทืขืก ืคึฟืึทืจ ืกืคึผืจื™ื ื’ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก: Quarkus ืฉื˜ื™ืฆื˜ ืคึผืจืึธืกื˜ ืกืคึผืจื™ื ื’ ื“ืึทื˜ืึท ื“ื–ืฉืคึผืึท ืึทื ืึทื˜ื™ื™ืฉืึทื ื– ืื•ืŸ ื˜ื™ื™ืคึผืก. ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ื ื™ืฆืŸ ื“ื™ ื’ืขืฉื˜ื™ืฆื˜ Spring Data JPA APIs ื–ืขื ืขืŸ ื’ืขื’ืขื‘ืŸ ืื™ืŸ ื˜ืึทื‘ืœืข 4.
ะ’ ืคึผืจื•ื™ืขืงื˜ ืคื•ืŸ ืื•ื ื“ื–ืขืจ ื‘ื™ื™ึทืฉืคึผื™ืœ Spring Data JPA APIs ื–ืขื ืขืŸ ื’ืขื ื™ืฆื˜ ืื•ืŸ ืžืขืจ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืื™ื– ื‘ื ื™ืžืฆื ืื™ืŸ ื“ื™ Quarkus ื˜ื•ื˜ืึธืจื™ืึทืœ ื’ืขืจื•ืคึฟืŸ ืคืจื™ืœื™ื ื’ ื“ืึทื˜ืึท ื“ื–ืฉืคึผืึท ื’ื™ื™ื“.

ื˜ื™ืฉ 4. ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ื ื™ืฆืŸ ื’ืขืฉื˜ื™ืฆื˜ ืกืคึผืจื™ื ื’ ื“ืึทื˜ืึท ื“ื–ืฉืคึผืึท ืึทืคึผื™ืก.

ืฉื˜ื™ืฆื˜ ืกืคึผืจื™ื ื’ ื“ืึทื˜ืึท ื“ื–ืฉืคึผืึท ืคึฟืขื™ึดืงื™ื™ื˜ืŸ
ืขืงืกืึทืžืคึผืœืขืก

CrudRepository

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

ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™
JpaRepository
PagingAndSortingRepository

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

ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ืึทืคึผื™ืก

ืฉื•ืœื“ ื˜ืึธืœืขืจืึทื ืฅ

ืฉื•ืœื“ ื˜ืึธืœืขืจืึทื ืฅ ืงืึทื ืกื˜ืจืึทืงืฉืึทื ื– ื–ืขื ืขืŸ ื–ื™ื™ืขืจ ื•ื•ื™ื›ื˜ื™ืง ืคึฟืึทืจ ืคึผืจืขื•ื•ืขื ื˜ื™ื ื’ ืงืึทืกืงื™ื™ื“ื™ื ื’ ืคื™ื™ืœื™ืขืจื– ืื•ืŸ ืงืจื™ื™ื™ื˜ื™ื ื’ ืคืึทืจืœืึธื–ืœืขืš ืžื™ืงืจืึธืกืขืจื•ื•ื™ืก ืึทืจืงืึทื˜ืขืงื˜ืฉืขืจื–. ืคืจื™ืœื™ื ื’ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ื”ืึธื‘ืŸ ืฉื•ื™ืŸ ื ื™ืฆืŸ ืงืจื™ื™ึทื–-ื‘ืจื™ื™ืงืขืจื– ืคึฟืึทืจ ืฉื•ืœื“ ื˜ืึธืœืขืจืึทื ืฅ ืคึฟืึทืจ ืคื™ืœืข ื™ืึธืจืŸ. ื”ื™ืกื˜ืจื™ืงืก. ืึธื‘ืขืจ, Hystrix ืื™ื– ื ื™ืฉื˜ ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงื˜ ืคึฟืึทืจ ืึท ืœืึทื ื’ ืฆื™ื™ึทื˜, ืึธื‘ืขืจ ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ืก ืฉื•ืœื“ ื˜ืึธืœืขืจืึทื ืฅ ืื™ื– ืื™ืฆื˜ ืึทืงื˜ื™ื•ื•ืœื™ ื“ืขื•ื•ืขืœืึธืคึผื™ื ื’ ืื•ืŸ ื”ืื˜ ืขื˜ืœืขื›ืข ื™ืึธืจืŸ ืคื•ืŸ ืคึผืจืึธื“ื•ืงืฆื™ืข ื ื•ืฆืŸ ื”ื™ื ื˜ืขืจ ืขืก. ื“ืขืจื™ื‘ืขืจ, ืฆื• ืคึฟืึทืจื‘ืขืกืขืจืŸ ื“ื™ ืจื™ืœื™ื™ืึทื‘ื™ืœืึทื˜ื™ ืคื•ืŸ ืกืขืจื•ื•ื™ืกืขืก ืื™ืŸ Quarkus, ืขืก ืื™ื– ืจืขืงืึทืžืขื ื“ื™ื“ ืฆื• ื ื•ืฆืŸ ื“ื™ MicroProfile Fault Tolerance APIs, ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ื•ื•ืึธืก ื–ืขื ืขืŸ ื’ืขื ื™ืฆื˜ ืื™ืŸ ื˜ื™ืฉ 5. ืคึฟืึทืจ ืžืขืจ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ื•ื•ืขื’ืŸ ื“ืขื, ื–ืขืŸ ื“ื™ Quarkus ืžืึทื ื•ืึทืœ ืฉื•ืœื“ ื˜ืึธืœืขืจืึทื ืฅ ื’ื™ื™ื“.

ื˜ื™ืฉ 5. ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ื ื™ืฆืŸ ื’ืขืฉื˜ื™ืฆื˜ ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ืฉื•ืœื“ ื˜ืึธืœืขืจืึทื ืฅ ืึทืคึผื™ืก.

ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ืฉื•ืœื“ ื˜ืึธืœืขืจืึทื ืฅ ืคึฟืขื™ึดืงื™ื™ื˜ืŸ
ื‘ืึทืฉืจื™ื™ึทื‘ื•ื ื’
ืขืงืกืึทืžืคึผืœืขืก

@ืึทืกื™ื ื˜ืฉืจืึธื ืึธื•ืก

ืขืงืกืึทืงื™ื•ื˜ื™ื ื’ ืœืึธื’ื™ืง ืื™ืŸ ืึท ื‘ืึทื–ื•ื ื“ืขืจ ืคืึธื“ืขื

@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 ืคึผืœืึทื˜ืคืึธืจืžืก ืžืึธื ื™ื˜ืึธืจ ื“ื™ ื’ืขื–ื•ื ื˜ ืคื•ืŸ ืงืึทื ื˜ื™ื™ื ืขืจื– ื ื™ืฆืŸ ืกืคึผืขืฆื™ืขืœ ื‘ืึทื“ื™ื ื•ื ื’ืก. ืฆื• ืœืึธื–ืŸ ื“ื™ ืึทื ื“ืขืจืœื™ื™ื™ื ื’ ืคึผืœืึทื˜ืคืึธืจืžืข ืฆื• ืžืึธื ื™ื˜ืึธืจ ืกืขืจื•ื•ื™ืกืขืก, ืกืคึผืจื™ื ื’ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ื˜ื™ืคึผื™ืงืœื™ ื ื•ืฆืŸ ืึท ืžื ื”ื’ HealthIndicator ืื•ืŸ Spring Boot Actuator. ืื™ืŸ Quarkus, ื“ืึธืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขื˜ืืŸ ืžื™ื˜ ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ื’ืขื–ื•ื ื˜, ื•ื•ืึธืก ื“ื•ืจืš ืคืขืœื™ืงื™ื™ึทื˜ ืคึผืขืจืคืึธืจืžื– ืึท ืœื™ื™ื•ื•ื ืึทืก ื˜ืฉืขืง, ืึธื‘ืขืจ ืงืขื ืขืŸ ื–ื™ื™ืŸ ืงืึทื ืคื™ื’ื™ืขืจื“ ืฆื• ืกื™ื™ืžืึทืœื˜ื™ื™ื ื™ืึทืกืœื™ ืงืึธื ื˜ืจืึธืœื™ืจืŸ ืœืขื‘ืŸ ืื•ืŸ ื’ืจื™ื™ื˜ืงื™ื™ึทื˜. ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ื•ื•ื™ ืฆื• ื ื•ืฆืŸ ื“ื™ ืฉื˜ื™ืฆื˜ ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ื’ืขื–ื•ื ื˜ ืึทืคึผื™ืก ื–ืขื ืขืŸ ืฆื•ื’ืขืฉื˜ืขืœื˜ ืื™ืŸ ื˜ื™ืฉ 6, ืื•ืŸ ื ืึธืš ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืื™ื– ืฆื•ื’ืขืฉื˜ืขืœื˜ ืื™ืŸ ื“ื™ Quarkus ืžืึทื ื•ืึทืœ ื’ืขื–ื•ื ื˜ ื’ื™ื™ื“.

ื˜ื™ืฉ 6: ื‘ืึทื ื™ืฅ ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ื’ืขืฉื˜ื™ืฆื˜ ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ื’ืขื–ื•ื ื˜ ืึทืคึผื™ืก.

ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ื’ืขื–ื•ื ื˜ ืคึฟืขื™ึดืงื™ื™ื˜ืŸ
ื‘ืึทืฉืจื™ื™ึทื‘ื•ื ื’
ืขืงืกืึทืžืคึผืœืขืก

@ืœืขื‘ื ืก

ื“ื™ ืคึผืœืึทื˜ืคืึธืจืžืข ืจืขื‘ืึธืึธื˜ ื“ื•ืจื›ืคืึทืœ ืงืึทื ื˜ืึทืžืึทื ื™ื™ื–ื“ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–
ืกื•ืฃ ืคื•ื ื˜:
ื‘ืึทืœืขื‘ืึธืก: 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();  
}

ืžืขื˜ืจื™ืงืก

ืึทืคึผืคึผืœื™ืงืึทื˜ื™ืึธื ืก ืฆื•ืฉื˜ืขืœืŸ ืžืขื˜ืจื™ืงืก ืคึฟืึทืจ ืึทืคึผืขืจื™ื™ืฉืึทื ืึทืœ ืฆื•ื•ืขืงืŸ (ืฆื• ืžืึธื ื™ื˜ืึธืจ ืคืึธืจืฉื˜ืขืœื•ื ื’ SLAs) ืึธื“ืขืจ ื ื™ื˜-ืึทืคึผืขืจื™ื™ืฉืึทื ืึทืœ ืฆื•ื•ืขืงืŸ (ื’ืขืฉืขืคื˜ SLAs). ืกืคึผืจื™ื ื’ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ืฆื•ืฉื˜ืขืœืŸ ืžืขื˜ืจื™ืงืก ื ื™ืฆืŸ ืกืคึผืจื™ื ื’ ื‘ืึธืึธื˜ ืึทืงื˜ื•ืึทื˜ืึธืจ ืื•ืŸ ืžื™ืงืจืึธืžืขื˜ืขืจ. ืื™ืŸ ืงืขืจ, Quarkus ื ื™ืฆื˜ ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ืžืขื˜ืจื™ืงืก ืฆื• ืฆื•ืฉื˜ืขืœืŸ ื‘ืึทืกืขืœื™ื ืข ืžืขื˜ืจื™ืงืก (ื“ื–ืฉื•ื•ื ืื•ืŸ ืึธืคึผืขืจื™ื™ื˜ื™ื ื’ ืกื™ืกื˜ืขื), ืคืึทืจืงื•ื™ืคืขืจ ืžืขื˜ืจื™ืงืก (ืงื•ื•ืึทืจืงื•ืก) ืื•ืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืžืขื˜ืจื™ืงืก. ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ืžืขื˜ืจื™ืงืก ืจื™ืงื•ื•ื™ื™ืขืจื– ืึทื– ื“ื™ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืฉื˜ื™ืฆื˜ JSON ืื•ืŸ OpenMetrics (ืคึผืจืึธืžืขื˜ื”ืขื•ืก) ืจืขื–ื•ืœื˜ืึทื˜ ืคึฟืึธืจืžืึทื˜ื™ืจื•ื ื’ืขืŸ. ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ื ื™ืฆืŸ ื“ื™ MicroProfile Metrics API ื–ืขื ืขืŸ ื’ืขื’ืขื‘ืŸ ืื™ืŸ ื˜ืึทื‘ืœืข 7.

ะ’ ืคึผืจื•ื™ืขืงื˜ ืคื•ืŸ ืื•ื ื“ื–ืขืจ ื‘ื™ื™ึทืฉืคึผื™ืœ ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ืžืขื˜ืจื™ืงืก ื–ืขื ืขืŸ ื’ืขื ื™ืฆื˜ ืฆื• ืฆื•ืฉื˜ืขืœืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืžืขื˜ืจื™ืงืก. ืคึฟืึทืจ ืžืขืจ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข, ื–ืขืŸ ื“ื™ Quarkus ืžืึทื ื•ืึทืœ ืžืขื˜ืจื™ืงืก ื’ื™ื™ื“.

ื˜ื™ืฉ 7. ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ื ื™ืฆืŸ ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ืžืขื˜ืจื™ืงืก ืึทืคึผื™ืก.

ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ืžืขื˜ืจื™ืง ืคึฟืขื™ึดืงื™ื™ื˜ืŸ
ื‘ืึทืฉืจื™ื™ึทื‘ื•ื ื’
ืขืงืกืึทืžืคึผืœืขืก

@ื’ืขืจืขื›ื ื˜

ื“ื™ื ืึธื•ืฅ ืึท ื˜ืึธืžื‘ืึทื ืง ื˜ืึธืžื‘ืึทื ืง ื•ื•ืึธืก ืฆื™ื™ืœืŸ ื“ื™ ื ื•ืžืขืจ ืคื•ืŸ ืžืืœ ืึท ืึทื ืึธื˜ื™ื™ื˜ื™ื“ ื›ื™ื™ืคืขืฅ ืื™ื– ื’ืขืจื•ืคืŸ

@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 ืขื ื“ืคึผืึธื™ื ืฅ ื•ื•ืึธืก ื“ืึทืจืคืŸ ืงืึธืจืึทืกืคึผืึทื ื“ื™ื ื’ ืงืœื™ืขื ื˜ ืึทืคึผื™ืก ืฆื• ืึทืจื‘ืขื˜ืŸ ืžื™ื˜. ืฆื• ื ื•ืฆืŸ RESTful ืขื ื“ืคึผืึธื™ื ืฅ, ืกืคึผืจื™ื ื’ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ื˜ื™ืคึผื™ืงืœื™ ื ื•ืฆืŸ RestTemplate. Quarkus ืึธืคืคืขืจืก ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ืจืขืกื˜ ืงืœื™ืขื ื˜ ืึทืคึผื™ืก ืฆื• ืกืึธืœื•ื•ืข ื“ืขื ืคึผืจืึธื‘ืœืขื, ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ื ื•ืฆืŸ ืคื•ืŸ ื•ื•ืึธืก ื–ืขื ืขืŸ ื’ืขื’ืขื‘ืŸ ืื™ืŸ ื˜ื™ืฉ 8.

ะ’ ืคึผืจื•ื™ืขืงื˜ ืคื•ืŸ ืื•ื ื“ื–ืขืจ ื‘ื™ื™ึทืฉืคึผื™ืœ ื“ื™ ื ื•ืฆืŸ ืคื•ืŸ RESTful ืขื ื“ืคึผืึธื™ื ืฅ ืื™ื– ื“ื•ืจื›ื’ืขืงืึธื›ื˜ ืžื™ื˜ ื“ื™ ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ืจืขืกื˜ ืงืœื™ืขื ื˜. ืžืขืจ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืื•ืŸ ื‘ื™ื™ืฉืคื™ืœืŸ ืื•ื™ืฃ ื“ืขื ื˜ืขืžืข ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขืคึฟื•ื ืขืŸ ืื™ืŸ ื“ื™ Quarkus ืžืึทื ื•ืึทืœ ืžื ื•ื—ื” ืงืœื™ืขื ื˜ ื’ื™ื™ื“.

ื˜ื™ืฉ 8. ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ื ื™ืฆืŸ ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ืจืขืกื˜ ืงืœื™ืขื ื˜ ืึทืคึผื™ืก.

ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ืจืขืกื˜ ืงืœื™ืขื ื˜ ืคึฟืขื™ึดืงื™ื™ื˜ืŸ
ื‘ืึทืฉืจื™ื™ึทื‘ื•ื ื’
ืขืงืกืึทืžืคึผืœืขืก

@RegisterRestClient

ืจืขื“ื–ืฉื™ืกื˜ืขืจื– ืึท ื˜ื™ื™ืคึผื˜ Java ืฆื•ื‘ื™ื ื“ ื•ื•ื™ ืึท REST ืงืœื™ืขื ื˜

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

@RestClient

ืžืึทืจืงืก ื“ื™ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืคื•ืŸ ืึท ื‘ื™ื™ึทืฉืคึผื™ืœ ืคื•ืŸ ืึท ื˜ื™ื™ืคึผื˜ 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 ืฆื• ืึทื ื˜ื•ื•ื™ืงืœืขืŸ Java ืžื™ืงืจืึธืกืขืจื•ื•ื™ืกืŸ ืื•ืŸ ื“ืขืจื ืึธืš ืฆื•ื ื•ื™ืคื ืขืžืขืŸ ื–ื™ื™ ืื™ืŸ ื’ืขื‘ื•ื™ืจืŸ ื‘ื™ื™ื ืขืจื™ ืงืึธื“ ื•ื•ืึธืก ืกืึทื•ื•ืขืก ื”ื•ื ื“ืขืจื˜ืขืจ ืคื•ืŸ ืžืขื’ืื‘ื™ื™ื˜ ืคื•ืŸ ื‘ืึทืจืึทืŸ ืื•ืŸ ืœืึธื ื˜ืฉื™ื– ืื™ืŸ. ืึท ืขื ื™ืŸ ืคื•ืŸ ืžื™ืœื™ืกืขืงืึทื ื“ื–.

ื•ื•ื™ ืื™ืจ ืฉื•ื™ืŸ ืคืืจืฉื˜ืื ืขืŸ, ืžืขืจ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ื•ื•ืขื’ืŸ ืฉื˜ื™ืฆืŸ ืคึฟืึทืจ ื“ื™ ืกืคึผืจื™ื ื’ ืื•ืŸ ืžื™ืงืจืึธืคึผืจืึธืคื™ืœืข ืึทืคึผื™ืก, ื•ื•ื™ ื’ืขื–ื•ื ื˜ ื•ื•ื™ ืึท ืคึผืœืึทืฅ ืคื•ืŸ ืื ื“ืขืจืข ื ื•ืฆื™ืง ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข, ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขืคึฟื•ื ืขืŸ ืื™ืŸ ืงื•ื•ืึทืจืงื•ืก ืžืึทื ื™ื•ืึทืœื–.

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’