เบงเบดเบ—เบตเบเบฒเบ™ Quarkus เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™ MicroProfile เปเบฅเบฐ Spring

เบชเบฐเบšเบฒเบเบ”เบตเบ—เบธเบเบ„เบปเบ™, เบ™เบตเป‰เปเบกเปˆเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ—เบตเบชเบฒเบกเปƒเบ™เบŠเบธเบ” Quarkus!

เบงเบดเบ—เบตเบเบฒเบ™ Quarkus เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™ MicroProfile เปเบฅเบฐ Spring

เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ Java microservices, เบกเบฑเบ™เบกเบฑเบเบˆเบฐเป€เบŠเบทเปˆเบญเบงเปˆเบฒ เป‚เบ›เบฃเป„เบŸเบฅ Micro Eclipse MicroProfile ะธ เป€เบเบตเบšเปƒเบชเปˆเบžเบฒเบเบฎเบฝเบ™ spring เปเบกเปˆเบ™ APIs เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเปเบฅเบฐเป€เบญเบเบฐเบฅเบฒเบ”. เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบ™เบฑเบเบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบกเบกเบตเปเบ™เบงเป‚เบ™เป‰เบกเบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰ API เบ—เบตเปˆเบžเบงเบเป€เบ‚เบปเบฒเป€เบ„เบตเบเปƒเบŠเป‰เปเบฅเป‰เบง, เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบเบฒเบ™เบฎเบฝเบ™เบฎเบนเป‰เบเบญเบšเปƒเบซเบกเปˆเปเบฅเบฐเบญเบปเบ‡เบ›เบฐเบเบญเบš runtime เปƒเบŠเป‰เป€เบงเบฅเบฒเบซเบผเบฒเบ. เบกเบทเป‰เบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบžเบฐเบเบฒเบเบฒเบกเบ‡เปˆเบฒเบเบ”เบฒเบเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบ‚เบญเบ‡เบ—เบตเปˆเบ™เบดเบเบปเบกเบšเบฒเบ‡ MicroProfile API เบชเปเบฒเบฅเบฑเบšเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบžเบฒเบเบฎเบฝเบ™ spring เปเบฅเบฐเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบซเบฑเบ™เบงเบดเบ—เบตเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Spring API เปเบฅเบฐเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เปƒเบซเบกเปˆเปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™ เป‚เบ„เบ.

เปƒเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบฅเบฑเบเบ™เป‰เบญเบ, เบ—เปเบฒเบญเบดเบ”เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบšเบดเปˆเบ‡เบ‚เบญเบšเป€เบ‚เบ”เปเบฅเบฐเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ‚เบญเบ‡เบงเบดเบ—เบตเบ—เบตเปˆ Quarkus เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ Spring APIs เป€เบžเบทเปˆเบญเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ Spring เบงเบดเบ—เบตเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ MicroProfile API เปƒเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ›เบฐเบˆเปเบฒเบงเบฑเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบเบงเบกเป€เบญเบปเบฒ MicroProfile APIs, เป€เบŠเบดเปˆเบ‡เป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบชเปเบฒเบฅเบฑเบšเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ Spring เป€เบกเบทเปˆเบญเบชเป‰เบฒเบ‡ microservices.

เป€เบ›เบฑเบ™เบซเบเบฑเบ‡ Quarkus? เบเปˆเบญเบ™เบญเบทเปˆเบ™ เปเบปเบ”, เบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบชเบปเบ”, เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบเบฒเบ™เป‚เบซเบผเบ”เบ„เบทเบ™เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ‚เบญเบ‡เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เปƒเบ”เป†เปƒเบ™ MicroProfile API, Spring API เปเบฅเบฐ Java APIs เบญเบทเปˆเบ™เป†, เป€เบŠเบดเปˆเบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบ”เป‰เบงเบเบ„เปเบฒเบชเบฑเปˆเบ‡เบ”เบฝเบง: mvn quarkus:dev. เบญเบฑเบ™เบ—เบตเบชเบญเบ‡, เบ›เบถเบเบชเบฒเบซเบฒเบฅเบทเปƒเบ™ เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบšเบธเบเบ„เบปเบ™ (เป€เบŠเบดเปˆเบ‡เบฅเบงเบšเบฅเบงเบกเบˆเบฒเบ Spring, MicroProfile, เปเบฅเบฐ JPA APIs เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ–เบฒเบ™เบชเบญเบ‡เป‚เบ”เบเปƒเบŠเป‰เบฎเบนเบšเบžเบฒเบš GraalVM เบžเบทเป‰เบ™เป€เบกเบทเบญเบ‡) เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบžเบฝเบ‡เปเบ•เปˆ 0.055 เบงเบดเบ™เบฒเบ—เบต เปเบฅเบฐเปƒเบŠเป‰เป€เบงเบฅเบฒเบ›เบฐเบกเบฒเบ™ 90 MB เบ‚เบญเบ‡ RAM (RSS) เปƒเบ™เบˆเบธเบ”เบชเบดเป‰เบ™เบชเบธเบ”เบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ RESTful. เบเบดเปˆเบ‡เป„เบ›เบเบงเปˆเบฒเบ™เบฑเป‰เบ™, เบเบฒเบ™เบฅเบงเบšเบฅเบงเบกเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เปเบกเปˆเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ”เป‰เบงเบเบ„เปเบฒเบชเบฑเปˆเบ‡เบ”เบฝเบง: mvn package -Pnative.

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบšเปเปˆเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบเปˆเบฝเบงเบเบฑเบš MicroProfile, เบ™เบญเบเบˆเบฒเบเบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบœเบนเป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒ Spring เป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเบดเบ—เบตเบ—เบตเปˆเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰ Spring APIs เบเบฑเบš MicroProfile APIs เปƒเบ™ Quarkus.

เบ•เบนเป‰เบ„เบญเบ™เป€เบ—เบ™เป€เบ™เบต เปเบฅเบฐ Kubernetes

เป€เบžเบทเปˆเบญเบฎเบฑเบเบชเบฒเบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบ‡เปˆเบฒเบเบ”เบฒเบ, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบเบงเบกเป€เบญเบปเบฒเบžเบฝเบ‡เปเบ•เปˆเบฅเบฑเบเบชเบฐเบ™เบฐเบฅเบฐเบ”เบฑเบšเบชเบนเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰. Kubernetes, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบˆเบฐเป€เบ‚เบปเป‰เบฒเปƒเบˆ. Quarkus เปเบกเปˆเบ™เบ–เบทเบเบˆเบฑเบ”เปƒเบชเปˆเป€เบ›เบฑเบ™ stack Java เบชเปเบฒเบฅเบฑเบš Kubernetes, เบกเบฑเบ™เบ–เบทเบเบญเบญเบเปเบšเบšเบกเบฒเป€เบžเบทเปˆเบญเบซเบผเบธเบ”เบœเปˆเบญเบ™เบเบฒเบ™เบšเปเบฅเบดเป‚เบžเบเบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเปเบฅเบฐเป€เบงเบฅเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ Java เปเบฅเบฐเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™, เปเบฅเบฐ, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบซเบ™เบฒเปเบซเบ™เป‰เบ™เบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเป€เบˆเบปเป‰เบฒเบžเบฒเบšเปเบฅเบฐเบซเบผเบธเบ”เบœเปˆเบญเบ™เบ„เปˆเบฒเปƒเบŠเป‰เบˆเปˆเบฒเบเป‚เบ”เบเบฅเบงเบก.

Quarkus เบเบฑเบ‡ เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบเบฒเบ™เบœเบฐเบฅเบดเบ”เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ” เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™ เปเบฅเบฐเบ‚เปเป‰เบชเบฐเป€เปœเบต Kubernetes เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบœเบนเป‰เบ™เปเบฒ เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เป€เบงเบ—เบต Kubernetes เปเบฅเบฐ Red Hat OpenShift. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, Quarkus เบˆเบฐเบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒ Dockerfile.jvm (เบเบฒเบ™เบซเบธเป‰เบกเบซเปเปˆ JVM) เปเบฅเบฐ Dockerfile.native (เบเบฒเบ™เบซเบธเป‰เบกเบซเปเปˆ binary เบžเบทเป‰เบ™เป€เบกเบทเบญเบ‡) เป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบšเบฑเบ™เบˆเบธ.

เบชเบธเบ”เบ—เป‰เบฒเบ, เป‚เบ”เบเบเบฒเบ™เบชเบธเบกเปƒเบชเปˆ Kubernetes เป€เบ›เบฑเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบ›เบปเป‰เบฒเบซเบกเบฒเบ, Quarkus เบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰เบเบญเบš Java เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบซเบ™เป‰เบฒเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เปƒเบ™เบฅเบฐเบ”เบฑเบšเบ‚เบญเบ‡เปเบžเบฅเบฐเบ•เบฐเบŸเบญเบก Kubernetes เป€เบญเบ‡. เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ 1 เบชเบฐเบซเบ™เบญเบ‡เปเบœเบ™เบ—เบตเปˆเบ‚เบญเบ‡เบเบฒเบ™เบ•เบญเบšเป‚เบ•เป‰เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบฅเบฐเบซเบงเปˆเบฒเบ‡ Kubernetes เปเบฅเบฐเบเบญเบš Java เบ—เบปเปˆเบงเป„เบ›เบ—เบตเปˆเปƒเบŠเป‰เป‚เบ”เบเบœเบนเป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒ Spring.

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ 1. เปเบœเบ™เบ—เบตเปˆเบเบฒเบ™เบ•เบดเบ”เบ•เปเปˆเบžเบปเบงเบžเบฑเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡ Java frameworks เปเบฅเบฐ Kubernetes.

เปœเป‰เบฒ เบ—เบตเปˆ
เป€เบเบตเบšเบฅเบฐเบ”เบนเปƒเบšเป„เบกเป‰เบ›เบปเปˆเบ‡เปเบšเบšเบ”เบฑเป‰เบ‡เป€เบ”เบตเบก
Kubernetes

เบเบฒเบ™โ€‹เบ„เบปเป‰เบ™โ€‹เบžเบปเบšโ€‹เบเบฒเบ™โ€‹เบšเปโ€‹เบฅเบดโ€‹เบเบฒเบ™โ€‹
Eureka
DNS

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ
Spring Cloud Config
เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเปเบœเบ™เบ—เบตเปˆ/เบ„เบงเบฒเบกเบฅเบฑเบš

เบเบฒเบ™เบ”เบธเปˆเบ™เบ”เปˆเบฝเบ‡เบเบฒเบ™เป‚เบซเบผเบ”
เป‚เบš (เบ”เป‰เบฒเบ™เบฅเบนเบเบ„เป‰เบฒ)
เบšเปเบฅเบดเบเบฒเบ™, เบ•เบปเบงเบ„เบงเบšเบ„เบธเบกเบเบฒเบ™เบˆเบณเบฅเบญเบ‡ (เบ”เป‰เบฒเบ™เป€เบŠเบตเบšเป€เบงเบต)

เบเบฒเบ™เบฅเบงเบšเบฅเบงเบกเปเบฅเบฐเปเบฅเปˆเบ™เบฅเบฐเบซเบฑเบ”เบˆเบฒเบเบ•เบปเบงเบขเปˆเบฒเบ‡

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบญเป‰เบฒเบ‡เป€เบ–เบดเบ‡ เป‚เบ„เบ‡เบเบฒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡, เบšเปˆเบญเบ™เบ—เบตเปˆ Spring เปเบฅเบฐ MicroProfile APIs เปเบฅเบฐเปเบกเป‰เบเบฐเบ—เบฑเป‰เบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™ Java เบ”เบฝเบงเบเบฑเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบฎเปˆเบงเบกเบเบฑเบ™. เบฅเบฐเบซเบฑเบ”เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบ–เบทเบเบฅเบงเบšเบฅเบงเบกเปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบˆเบฒเบเป€เบชเบฑเป‰เบ™เบ„เปเบฒเบชเบฑเปˆเบ‡, เป€เบšเบดเปˆเบ‡เป„เบŸเบฅเปŒ README.md เบชเปเบฒเบฅเบฑเบšเบฅเบฒเบเบฅเบฐเบญเบฝเบ”.

Spring Framework APIs

เบเบฒเบ™เบชเบตเบ”เบขเบฒเป€เบžเบดเปˆเบ‡เบžเบฒเบญเบฒเป„เบช

Quarkus เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบฅเบฐเบ”เบฑเบšเบ‚เบญเบ‡ Contexts and Dependency Injection (CDI) APIs เปเบฅเบฐ Spring Dependency Injection (Spring DI) APIs. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš MicroProfile, Java EE เปเบฅเบฐ Jakarta EE, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบกเบตเปเบฅเป‰เบงเบซเบผเบฒเบเบ„เบธเป‰เบ™เป€เบ„เบตเบเบเบฑเบš CDI. เปƒเบ™เบ—เบฒเบ‡เบเบปเบ‡เบเบฑเบ™เบ‚เป‰เบฒเบก, เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ Spring เบชเบฒเบกเบฒเบ”เปƒเบŠเป‰ Quarkus Extension เบชเปเบฒเบฅเบฑเบš Spring DI API เป€เบžเบทเปˆเบญเบšเบฑเบ™เบฅเบธเบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบเบฑเบš Spring DI. เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰ Spring DI APIs เบ—เบตเปˆเบฎเบญเบ‡เบฎเบฑเบšเปเบกเปˆเบ™เปƒเบซเป‰เบขเบนเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ 2.

ะ’ เป‚เบ„เบ‡เบเบฒเบ™เบˆเบฒเบเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ เปƒเบŠเป‰เบ—เบฑเบ‡ CDI เปเบฅเบฐ Spring Dependency Injection. เบชเปเบฒเบฅเบฑเบšเบ‚เปเป‰เบกเบนเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเปเบฅเบฐเบ•เบปเบงเบขเปˆเบฒเบ‡เบเปˆเบฝเบงเบเบฑเบšเบซเบปเบงเบ‚เปเป‰เบ™เบตเป‰, เป€เบšเบดเปˆเบ‡เบ„เบนเปˆเบกเบท Quarkus เป€เบญเบตเป‰เบ™เบงเปˆเบฒ เบ„เบนเปˆเบกเบทเบžเบฒเบเบฎเบฝเบ™ spring DI.

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ 2. เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰ Spring DI APIs เบ—เบตเปˆเบฎเบญเบ‡เบฎเบฑเบš.

เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ” Spring DI เบ—เบตเปˆเบฎเบญเบ‡เบฎเบฑเบš
เบ•เบปเบงเบขเปˆเบฒเบ‡

Constructor Injection

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

เบเบญเบšเป€เบงเบฑเบš

เบœเบนเป‰เปƒเบŠเป‰ MicroProfile เบˆเบฐเบฎเบฑเบเบงเปˆเบฒ Quarkus เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ JAX-RS, MicroProfile Rest Client, JSON-P, เปเบฅเบฐ JSON-B เป€เบ›เบฑเบ™เบฎเบนเบšเปเบšเบšเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบผเปเบเบผเบกเป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ•เบปเป‰เบ™เบ•เป. เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบžเบฒเบเบฎเบฝเบ™ spring เบˆเบฐเบžเปเปƒเบˆเบเบฑเบšเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒเบ‚เบญเบ‡ Quarkus เบชเปเบฒเบฅเบฑเบš Spring Web API, เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš REST. เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบเบฑเบš Spring DI, เป€เบ›เบปเป‰เบฒเบซเบกเบฒเบเบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ Spring Web API เปเบกเปˆเบ™เป€เบžเบทเปˆเบญเปƒเบซเป‰เบœเบนเป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒ Spring เปƒเบŠเป‰ Spring Web APIs เบชเบปเบกเบ—เบปเบšเบเบฑเบš MicroProfile APIs. เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Spring Web APIs เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เปเบกเปˆเบ™เบชเบฐเบซเบ™เบญเบ‡เปƒเบซเป‰เบขเบนเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ 3, เปเบฅเบฐเบ‚เปเป‰เบกเบนเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเปเบฅเบฐเบ•เบปเบงเบขเปˆเบฒเบ‡เบเปˆเบฝเบงเบเบฑเบšเบซเบปเบงเบ‚เปเป‰เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰เปƒเบ™ Quarkus tutorial เบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒ เบ„เบนเปˆเบกเบทเบžเบฒเบเบฎเบฝเบ™ spring เป€เบงเบฑเบš.

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ 3. เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰ Spring Web APIs เบ—เบตเปˆเบฎเบญเบ‡เบฎเบฑเบš.

เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เป€เบงเบฑเบš Spring เบ—เบตเปˆเบฎเบญเบ‡เบฎเบฑเบš
เบ•เบปเบงเบขเปˆเบฒเบ‡

@RestController
@RequestMapping

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

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (เบšเบฒเบ‡เบชเปˆเบงเบ™)

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

Spring DataJPA

เบœเบนเป‰เปƒเบŠเป‰ MicroProfile เบเบฑเบ‡เบˆเบฐเบŠเบทเปˆเบ™เบŠเบปเบกเบ—เบตเปˆ Quarkus เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ JPA เป‚เบ”เบเปƒเบŠเป‰ Hibernate ORM. เบเบฑเบ‡เบกเบตเบ‚เปˆเบฒเบงเบ”เบตเบชเปเบฒเบฅเบฑเบšเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ Spring: Quarkus เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ Spring Data JPA เบ—เบปเปˆเบงเป„เบ›เปเบฅเบฐเบ›เบฐเป€เบžเบ”. เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰ Spring Data JPA APIs เบ—เบตเปˆเบฎเบญเบ‡เบฎเบฑเบšเปเบกเปˆเบ™เปƒเบซเป‰เบขเบนเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ 4.
ะ’ เป‚เบ„เบ‡เบเบฒเบ™เบˆเบฒเบเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ Spring Data JPA APIs เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปเบฅเบฐเบ‚เปเป‰เบกเบนเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเปเบกเปˆเบ™เบกเบตเบขเบนเปˆเปƒเบ™เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒ Quarkus เบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒ เบ„เบนเปˆเบกเบทเบžเบฒเบเบฎเบฝเบ™ spring Data JPA.

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ 4. เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰ Spring Data JPA APIs เบ—เบตเปˆเบฎเบญเบ‡เบฎเบฑเบš.

เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ” JPA เบ‚เปเป‰เบกเบนเบ™เบžเบฒเบเบฎเบฝเบ™ spring เบ—เบตเปˆเบฎเบญเบ‡เบฎเบฑเบš
เบ•เบปเบงเบขเปˆเบฒเบ‡

CrudRepository

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

Repository
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Repository Fragments

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

MicroProfile APIs

เบ„เบงเบฒเบกเบ—เบปเบ™เบ—เบฒเบ™เบ•เปเปˆเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”

เบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เบ„เบงเบฒเบกเบ—เบปเบ™เบ—เบฒเบ™เบ•เปเปˆเบ„เบงเบฒเบกเบœเบดเบ”เปเบกเปˆเบ™เบกเบตเบ„เบงเบฒเบกเบชเปเบฒเบ„เบฑเบ™เบซเบผเบฒเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เป‰เบญเบ‡เบเบฑเบ™เบ„เบงเบฒเบกเบฅเบปเป‰เบกเป€เบซเบผเบงเบ‚เบญเบ‡ cascading เปเบฅเบฐเบเบฒเบ™เบชเป‰เบฒเบ‡เบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐ microservice เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰. เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบžเบฒเบเบฎเบฝเบ™ spring เป„เบ”เป‰เปƒเบŠเป‰เบ•เบปเบงเบ•เบฑเบ”เบงเบปเบ‡เบˆเบญเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ—เบปเบ™เบ—เบฒเบ™เบ•เปเปˆเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เป€เบ›เบฑเบ™เป€เบงเบฅเบฒเบซเบผเบฒเบเบ›เบต. เป„เบฎเป€เบ—เบ™. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, Hystrix เบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡เป€เบ›เบฑเบ™เป€เบงเบฅเบฒเบ”เบปเบ™เบ™เบฒเบ™, เปเบ•เปˆเบ„เบงเบฒเบกเบ—เบปเบ™เบ—เบฒเบ™เบ•เปเปˆเบ„เบงเบฒเบกเบœเบดเบ”เบ‚เบญเบ‡ MicroProfile เบเปเบฒเบฅเบฑเบ‡เบžเบฑเบ”เบ—เบฐเบ™เบฒเบขเปˆเบฒเบ‡เบซเป‰เบฒเบงเบซเบฑเบ™เปเบฅเบฐเบกเบตเบเบฒเบ™เบœเบฐเบฅเบดเบ”เบซเบผเบฒเบเบ›เบตเบ—เบตเปˆเปƒเบŠเป‰เบซเบฅเบฑเบ‡เบกเบฑเบ™. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เป€เบžเบทเปˆเบญเบ›เบฑเบšเบ›เบธเบ‡เบ„เบงเบฒเบกเบซเบ™เป‰เบฒเป€เบŠเบทเปˆเบญเบ–เบทเบ‚เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เปƒเบ™ Quarkus, เปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เปƒเบŠเป‰ MicroProfile Fault Tolerance APIs, เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ 5. เบชเปเบฒเบฅเบฑเบšเบ‚เปเป‰เบกเบนเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰, เป€เบšเบดเปˆเบ‡เบ„เบนเปˆเบกเบท Quarkus เบ„เบนเปˆเบกเบทเบ„เบงเบฒเบกเบ—เบปเบ™เบ—เบฒเบ™เบ•เปเปˆเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”.

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ 5. เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰ MicroProfile Fault Tolerance APIs เบ—เบตเปˆเบฎเบญเบ‡เบฎเบฑเบš.

เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ„เบงเบฒเบกเบ—เบปเบ™เบ—เบฒเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบ‚เบญเบ‡ MicroProfile
เบฅเบฒเบโ€‹เบฅเบฐโ€‹เบญเบฝเบ”
เบ•เบปเบงเบขเปˆเบฒเบ‡

@Asynchronous

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบซเบ”เบœเบปเบ™เปƒเบ™เบซเบปเบงเบ‚เปเป‰เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ

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

@Bulkhead

เบˆเปเบฒเบเบฑเบ”เบˆเปเบฒเบ™เบงเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบžเป‰เบญเบกเป†เบเบฑเบ™

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

@CircuitBreaker

เบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เบ„เบงเบฒเบกเบฅเบปเป‰เบกเป€เบซเบฅเบงเบ—เบตเปˆเบชเบฐเบซเบฅเบฒเบ”เปเบฅเบฐเบเบฒเบ™เบŸเบทเป‰เบ™เบ•เบปเบงเบˆเบฒเบเบ„เบงเบฒเบกเบฅเบปเป‰เบกเป€เบซเบฅเบง

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

@Fallback

เป‚เบ—เบซเบฒเป€เบซเบ”เบœเบปเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบ„เบงเบฒเบกเบฅเบปเป‰เบกเป€เบซเบผเบง

@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(); //...
}

เบšเปเบฅเบดเบเบฒเบ™เบเบงเบ”เป€เบŠเบฑเบ (Service Health)

เปเบžเบฅเบฐเบ•เบฐเบŸเบญเบก Kubernetes เบ•เบดเบ”เบ•เบฒเบกเบชเบธเบ‚เบฐเบžเบฒเบšเบ‚เบญเบ‡เบ•เบนเป‰เบ„เบญเบ™เป€เบ—เบ™เป€เบ™เบตเป‚เบ”เบเปƒเบŠเป‰เบšเปเบฅเบดเบเบฒเบ™เบžเบดเป€เบชเบ”. เป€เบžเบทเปˆเบญเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เปเบžเบฅเบฐเบ•เบฐเบŸเบญเบกเบ—เบตเปˆเบ•เบดเบ”เบžเบฑเบ™เปƒเบ™เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™, เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ Spring เป‚เบ”เบเบ›เบปเบเบเบฐเบ•เบดเปƒเบŠเป‰ HealthIndicator เปเบฅเบฐ Spring Boot Actuator เปเบšเบšเบเบณเบ™เบปเบ”เป€เบญเบ‡. เปƒเบ™ Quarkus, เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เป‚เบ”เบเปƒเบŠเป‰ MicroProfile Health, เป€เบŠเบดเปˆเบ‡เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบˆเบฐเป€เบฎเบฑเบ”เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบŠเบตเบงเบดเบ”, เปเบ•เปˆเบชเบฒเบกเบฒเบ”เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบžเบทเปˆเบญเบเบงเบ”เป€เบšเบดเปˆเบ‡เบ„เบงเบฒเบกเบžเป‰เบญเบกเปเบฅเบฐเบ„เบงเบฒเบกเบžเป‰เบญเบกเบžเป‰เบญเบกเป†เบเบฑเบ™. เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เปƒเบŠเป‰ MicroProfile Health APIs เบ—เบตเปˆเบฎเบญเบ‡เบฎเบฑเบšเปเบกเปˆเบ™เปƒเบซเป‰เบขเบนเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ 6, เปเบฅเบฐเบ‚เปเป‰เบกเบนเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเปเบกเปˆเบ™เปƒเบซเป‰เบขเบนเปˆเปƒเบ™เบ„เบนเปˆเบกเบท Quarkus เบ„เบนเปˆเบกเบทเบชเบธเบ‚เบฐเบžเบฒเบš.

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ 6: โ€‹โ€‹เบ•เบปเบงเบขเปˆเบฒเบ‡เบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบ‚เบญเบ‡ MicroProfile Health APIs เบ—เบตเปˆเบฎเบญเบ‡เบฎเบฑเบš.

เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบชเบธเบ‚เบฐเบžเบฒเบšเบ‚เบญเบ‡ MicroProfile
เบฅเบฒเบโ€‹เบฅเบฐโ€‹เบญเบฝเบ”
เบ•เบปเบงเบขเปˆเบฒเบ‡

@เบŠเบตเบงเบดเบ”

เปเบžเบฅเบ”เบŸเบญเบกเบ›เบดเบ”เป€เบ›เบตเบ”เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเบšเบฑเบ™เบˆเบธเบšเบฑเบ™เบˆเบธเบ—เบตเปˆเบฅเบปเป‰เบกเป€เบซเบฅเบงเบ„เบทเบ™เปƒเปเปˆ
เบˆเบธเบ”เบชเบดเป‰เบ™เบชเบธเบ”:
เป€เบˆเบปเป‰เบฒเบžเบฒเบš: 8080/health/live

@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 เบ—เบธเบฅเบฐเบเบดเบ”). เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบžเบฒเบเบฎเบฝเบ™ spring เบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบงเบฑเบ”เปเบ—เบเป‚เบ”เบเปƒเบŠเป‰ Spring Boot Actuator เปเบฅเบฐ Micrometer. เปƒเบ™เบ—เบฒเบ‡เบเบฑเบšเบเบฑเบ™, Quarkus เปƒเบŠเป‰ MicroProfile Metrics เป€เบžเบทเปˆเบญเบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบงเบฑเบ”เปเบ—เบเบžเบทเป‰เบ™เบ–เบฒเบ™ (JVM เปเบฅเบฐเบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™), metrics เบœเบนเป‰เบ‚เบฒเบ (Quarkus), เปเบฅเบฐเบเบฒเบ™เบงเบฑเบ”เปเบ—เบเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ. MicroProfile Metrics เบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ JSON เปเบฅเบฐ OpenMetrics (Prometheus) เบฎเบนเบšเปเบšเบšเบœเบปเบ™เบœเบฐเบฅเบดเบ”. เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰ MicroProfile Metrics API เปเบกเปˆเบ™เปƒเบซเป‰เบขเบนเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ 7.

ะ’ เป‚เบ„เบ‡เบเบฒเบ™เบˆเบฒเบเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ MicroProfile Metrics เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบงเบฑเบ”เปเบ—เบเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ. เบชเปเบฒเบฅเบฑเบšเบ‚เปเป‰เบกเบนเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบก, เป€เบšเบดเปˆเบ‡เบ„เบนเปˆเบกเบท Quarkus เบ„เบนเปˆเบกเบทเบเบฒเบ™เบงเบฑเบ”เปเบ—เบ.

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ 7. เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ MicroProfile Metrics APIs.

เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบเบฒเบ™เบงเบฑเบ”เปเบ—เบ MicroProfile
เบฅเบฒเบโ€‹เบฅเบฐโ€‹เบญเบฝเบ”
เบ•เบปเบงเบขเปˆเบฒเบ‡

@เบ™เบฑเบš

เปเบฒเบเป€เบ–เบดเบ‡เบ•เบปเบงเบ™เบฑเบšเบ™เบฑเบšเบˆเบณเบ™เบงเบ™เบ„เบฑเป‰เบ‡เบ—เบตเปˆเบงเบฑเบ”เบ–เบธเบ›เบฐเบเบญเบšเบ„เบณเบšเบฑเบ™เบเบฒเบเป„เบ”เป‰เบ–เบทเบเป€เบญเบตเป‰เบ™

@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

เปเบฒเบเป€เบ–เบดเบ‡เป€เบŠเบฑเบ™เป€เบŠเบตเบงเบฑเบ”เปเบ—เบเบ—เบตเปˆเบ•เบดเบ”เบ•เบฒเบกเบ„เบงเบฒเบกเบ–เบตเปˆเบเบฒเบ™เป‚เบ—เบ‚เบญเบ‡เบงเบฑเบ”เบ–เบธเบ—เบตเปˆเปเบฒเบเป€เบซเบ”

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

Metric

เบ„เบณเบญเบฐเบ—เบดเบšเบฒเบเบ›เบฐเบเบญเบšเบ—เบตเปˆเบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบ‚เปเป‰เบกเบนเบ™เบเปˆเบฝเบงเบเบฑเบšเป€เบกเบ•เบฒเป€เบ”เบ•เบฒเป€เบกเบทเปˆเบญเบกเบตเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเปƒเบซเป‰เป€เบ‚เบปเป‰เบฒ เบซเบผเบทเบœเบฐเบฅเบดเบ”เป€เบกเบ•เบฃเบดเบ

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

Metrics Endpoints

เบเบฒเบ™เบงเบฑเบ”เปเบ—เบเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ localhost:8080/metrics/application
เบเบฒเบ™เบงเบฑเบ”เปเบ—เบเบžเบทเป‰เบ™เบ–เบฒเบ™ localhost:8080/metrics/base
เบเบฒเบ™เบงเบฑเบ”เปเบ—เบเบœเบนเป‰เบ‚เบฒเบ localhost:8080/metrics/เบœเบนเป‰เบ‚เบฒเบ
เบเบฒเบ™เบงเบฑเบ”เปเบ—เบเบ—เบฑเบ‡เปเบปเบ” localhost: 8080/เปเบกเบฑเบ”

เบฅเบนเบเบ„เป‰เบฒเบžเบฑเบเบœเปˆเบญเบ™ MicroProfile

Microservices เบกเบฑเบเบˆเบฐเปƒเบซเป‰เบˆเบธเบ”เบชเบดเป‰เบ™เบชเบธเบ” RESTful เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™ API เบฅเบนเบเบ„เป‰เบฒเบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบ™เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš. เป€เบžเบทเปˆเบญเปƒเบŠเป‰เบˆเบธเบ”เบชเบดเป‰เบ™เบชเบธเบ” RESTful, เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ Spring เป‚เบ”เบเบ›เบปเบเบเบฐเบ•เบดเปƒเบŠเป‰ RestTemplate. Quarkus เบชเบฐเป€เบซเบ™เบต MicroProfile Rest Client APIs เป€เบžเบทเปˆเบญเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ™เบตเป‰, เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ—เบตเปˆเปƒเบซเป‰เบขเบนเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ 8.

ะ’ เป‚เบ„เบ‡เบเบฒเบ™เบˆเบฒเบเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบˆเบธเบ”เบชเบดเป‰เบ™เบชเบธเบ” RESTful เปเบกเปˆเบ™เป€เบฎเบฑเบ”เป„เบ”เป‰เป‚เบ”เบเปƒเบŠเป‰ MicroProfile Rest Client. เบ‚เปเป‰เบกเบนเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเปเบฅเบฐเบ•เบปเบงเบขเปˆเบฒเบ‡เบเปˆเบฝเบงเบเบฑเบšเบซเบปเบงเบ‚เปเป‰เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰เปƒเบ™เบ„เบนเปˆเบกเบท Quarkus เบ„เบนเปˆเบกเบทเบเบฒเบ™เบžเบฑเบเบœเปˆเบญเบ™เบ‚เบญเบ‡เบฅเบนเบเบ„เป‰เบฒ.

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ 8. เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰ MicroProfile Rest Client APIs.

เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบฅเบนเบเบ„เป‰เบฒเบžเบฑเบเบœเปˆเบญเบ™ MicroProfile
เบฅเบฒเบโ€‹เบฅเบฐโ€‹เบญเบฝเบ”
เบ•เบปเบงเบขเปˆเบฒเบ‡

@RegisterRestClient

เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš Java เบ—เบตเปˆเบžเบดเบกเป€เบ›เบฑเบ™เบฅเบนเบเบ‚เปˆเบฒเบ REST

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

@RestClient

เปเบฒเบเบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบชเปˆเบงเบ™เบ•เบดเบ”เบ•เปเปˆเบฅเบนเบเบ„เป‰เบฒ REST เบ—เบตเปˆเบžเบดเบก

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

Invocation

เป‚เบ—เบซเบฒเบˆเบธเบ”เบชเบดเป‰เบ™เบชเบธเบ” REST

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

mp-rest/url

เบฅเบฐเบšเบธเบˆเบธเบ”เบชเบดเป‰เบ™เบชเบธเบ” REST

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

เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš

เปƒเบ™ blog เบ™เบตเป‰, เบกเบตเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ•เบปเป‰เบ™เบ•เปเปƒเบ™เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ Spring, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เป€เบšเบดเปˆเบ‡เบขเปˆเบฒเบ‡เป„เบงเบงเบฒเบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Spring APIs เบเบฑเบš MicroProfile APIs เปƒเบ™ Quarkus เป€เบžเบทเปˆเบญเบ›เบฑเบšเบ›เบธเบ‡ Java microservices เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบฅเบงเบšเบฅเบงเบกเบžเบงเบเบกเบฑเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฅเบฐเบซเบฑเบ”เบ–เบฒเบ™เบชเบญเบ‡เบ—เบตเปˆเบŠเปˆเบงเบเบ›เบฐเบขเบฑเบ” RAM เบซเบผเบฒเบเบฎเป‰เบญเบ megabytes เปเบฅเบฐเป€เบ›เบตเบ”เบ•เบปเบงเปƒเบ™ เบšเบฑเบ™เบซเบฒเบ‚เบญเบ‡ milliseconds.

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เป€เบ‚เบปเป‰เบฒเปƒเบˆเปเบฅเป‰เบง, เบ‚เปเป‰เบกเบนเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ Spring เปเบฅเบฐ MicroProfile APIs, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบญเบทเปˆเบ™เป†, เบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰เปƒเบ™. เบ„เบนเปˆโ€‹เบกเบท Quarkusโ€‹.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™