Како Quarkus Π³ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π° MicroProfile ΠΈ Spring

Π—Π΄Ρ€Π°Π²ΠΎ Π½Π° ситС, Π΅Π²Π΅ Π³ΠΎ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΎΡ‚ пост ΠΎΠ΄ ΡΠ΅Ρ€ΠΈΡ˜Π°Ρ‚Π° ΠšΠ²Π°Ρ€ΠΊΡƒΡ!

Како Quarkus Π³ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π° MicroProfile ΠΈ Spring

Кога сС Ρ€Π°Π·Π²ΠΈΠ²Π°Π°Ρ‚ Java микросСрвиси, чСсто сС Π²Π΅Ρ€ΡƒΠ²Π° Π΄Π΅ΠΊΠ° Π—Π°Ρ‚Π΅ΠΌΠ½ΡƒΠ²Π°ΡšΠ΅ ΠΌΠΈΠΊΡ€ΠΎΠΏΡ€ΠΎΡ„ΠΈΠ» ΠΈ ΠŸΡ€ΠΎΠ»Π΅Ρ‚Π½Π° Ρ‡ΠΈΠ·ΠΌΠ° сС посСбни ΠΈ нСзависни API. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Π΄Π½ΠΎ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ ΠΈΠΌΠ°Π°Ρ‚ Ρ‚Π΅Π½Π΄Π΅Π½Ρ†ΠΈΡ˜Π° Π΄Π° Π³ΠΈ користат API-ΠΈΡ‚Π΅ Π½Π° ΠΊΠΎΠΈ вСќС сС Π½Π°Π²ΠΈΠΊΠ½Π°Ρ‚ΠΈ, бидСјќи ΡƒΡ‡Π΅ΡšΠ΅Ρ‚ΠΎ Π½Π° Π½ΠΎΠ²ΠΈ Ρ€Π°ΠΌΠΊΠΈ ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ Π·Π° Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Ρ‚Ρ€Π°Π΅ΡšΠ΅ ΠΎΠ΄Π·Π΅ΠΌΠ° ΠΌΠ½ΠΎΠ³Ρƒ Π²Ρ€Π΅ΠΌΠ΅. ДСнСс ќС сС ΠΎΠ±ΠΈΠ΄Π΅ΠΌΠ΅ Π΄Π° Π³ΠΎ поСдноставимС Ρ€Π°Π·Π²ΠΎΡ˜ΠΎΡ‚ Π½Π° Π½Π΅ΠΊΠΎΠΈ ΠΏΠΎΠΏΡƒΠ»Π°Ρ€Π½ΠΈ MicroProfile API Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈ Π½Π° ΠΏΡ€ΠΎΠ»Π΅Ρ‚ ΠΈ ќС Π²ΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ΅ ΠΊΠ°ΠΊΠΎ истоврСмСно Π΄Π° Π³ΠΎ користитС Spring API ΠΈ Π½ΠΎΠ²ΠΈΡ‚Π΅ корисни Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠšΠ²Π°Ρ€ΠΊΡƒΡ.

ΠœΠ°Π»ΠΊΡƒ ΠΏΠΎΠ΄Π΅Ρ‚Π°Π»Π½ΠΎ, ΠΏΡ€Π²ΠΎ ќС Π³ΠΎ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ опсСгот ΠΈ Π΄Π΅Ρ‚Π°Π»ΠΈΡ‚Π΅ Π·Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ Quarkus ΠΏΠΎΠ΄Π΄Ρ€ΠΆΡƒΠ²Π° Spring API Π·Π° Π΄Π° ΠΈΠΌ ΠΏΠΎΠΊΠ°ΠΆΠ΅ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π½Π° Spring ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΎ користат MicroProfile API Π²ΠΎ Π½ΠΈΠ²Π½Π°Ρ‚Π° сСкојднСвна Ρ€Π°Π±ΠΎΡ‚Π°. ΠŸΠΎΡ‚ΠΎΠ° ќС Π³ΠΈ ΠΏΠΎΠΊΡ€ΠΈΠ΅ΠΌΠ΅ API-Ρ‚Π΅ Π½Π° MicroProfile, ΠΊΠΎΠΈ сС корисни Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π½Π° Spring ΠΊΠΎΠ³Π° ΠΊΡ€Π΅ΠΈΡ€Π°Π°Ρ‚ микроуслуги.

Π—ΠΎΡˆΡ‚ΠΎ ΠšΠ²Π°Ρ€ΠΊΡƒΡ? ΠŸΡ€Π²ΠΎ, ΠΎΠ²Π° Π΅ ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΠ΅ Π²ΠΎ ΠΆΠΈΠ²ΠΎ, односно автоматско ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π²Ρ‡ΠΈΡ‚ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΊΠ°ΠΊΠ²ΠΈ Π±ΠΈΠ»ΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π²ΠΎ MicroProfile API, Spring API ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ Java API, ΡˆΡ‚ΠΎ сС ΠΈΠ·Π²Π΅Π΄ΡƒΠ²Π° со само Π΅Π΄Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: mvn quarkus:dev. Π’Ρ‚ΠΎΡ€ΠΎ, дискутирано Π²ΠΎ Π²ΠΎ Π½Π°ΡˆΠΈΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ услугата Person (која сС ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π° ΠΎΠ΄ Spring, MicroProfile ΠΈ JPA API Π²ΠΎ Π±ΠΈΠ½Π°Ρ€Π½ΠΈ со помош Π½Π° Π΄ΠΎΠΌΠ°ΡˆΠ½Π°Ρ‚Π° слика GraalVM) Π·Π°ΠΏΠΎΡ‡Π½ΡƒΠ²Π° Π·Π° само 0.055 сСкунди ΠΈ Π·Π°Ρ„Π°ΡœΠ° ΠΎΠΊΠΎΠ»Ρƒ 90 MB RAM (RSS) Π½Π° RESTful ΠΊΡ€Π°Ρ˜Π½Π°Ρ‚Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π°. Π—Π³ΠΎΡ€Π° Π½Π° Ρ‚ΠΎΠ°, самата Π½Π΅Π³ΠΎΠ²Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ†ΠΈΡ˜Π° сС ΠΈΠ·Π²Π΅Π΄ΡƒΠ²Π° со само Π΅Π΄Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: mvn ΠΏΠ°ΠΊΠ΅Ρ‚ -Pnative.

НСма Π΄Π° Π½Π°Π²Π»Π΅Π³ΡƒΠ²Π°ΠΌΠ΅ Π²ΠΎ Π΄Π΅Ρ‚Π°Π»ΠΈ Π·Π° MicroProfile, освСн Π΄Π° ΠΈΠΌ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ΠΌΠ΅ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π½Π° Spring Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π°Ρ‚ ΠΊΠ°ΠΊΠΎ ΠΌΠΎΠΆΠ°Ρ‚ Π΄Π° користат Spring API со MicroProfile API Π²ΠΎ Quarkus.

ΠšΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈ ΠΈ ΠšΡƒΠ±Π΅Ρ€Π½Π΅Ρ‚ΠΈ

Π—Π° Π΄Π° Π±ΠΈΠ΄Π΅ овој напис СдноставСн, ΠΎΠ²Π΄Π΅ ќС Π³ΠΈ ΠΏΠΎΠΊΡ€ΠΈΠ΅ΠΌΠ΅ само аспСктитС Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΡˆΠΊΠ°Ρ‚Π° Π½Π° високо Π½ΠΈΠ²ΠΎ. ΠšΡƒΠ±Π΅Ρ€Π½Π΅Ρ‚ΠΈ, Π·Π°Ρ‚ΠΎΠ° ΡˆΡ‚ΠΎ Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° сС Ρ€Π°Π·Π±Π΅Ρ€Π΅. Quarkus Π΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€Π°Π½ ΠΊΠ°ΠΊΠΎ Java стСк Π·Π° Kubernetes, Ρ‚ΠΎΡ˜ Π΅ Π΄ΠΈΠ·Π°Ρ˜Π½ΠΈΡ€Π°Π½ Π΄Π° ја ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€Π° ΠΏΠΎΡ‚Ρ€ΠΎΡˆΡƒΠ²Π°Ρ‡ΠΊΠ°Ρ‚Π° Π½Π° ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π° ΠΈ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π·Π° ΡΡ‚Π°Ρ€Ρ‚ΡƒΠ²Π°ΡšΠ΅ Π½Π° Java Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈΡ‚Π΅ ΠΈ услугитС ΠΈ, ΠΊΠ°ΠΊΠΎ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ°, Π΄Π° ја Π·Π³ΠΎΠ»Π΅ΠΌΠΈ Π½ΠΈΠ²Π½Π°Ρ‚Π° густина Π½Π° Π΄ΠΎΠΌΠ°ΡœΠΈΠ½ΠΎΡ‚ ΠΈ Π΄Π° Π³ΠΈ Π½Π°ΠΌΠ°Π»ΠΈ Π²ΠΊΡƒΠΏΠ½ΠΈΡ‚Π΅ Ρ‚Ρ€ΠΎΡˆΠΎΡ†ΠΈ.

ΠšΠ²Π°Ρ€ΠΊΡƒΡΠΎΡ‚ исто Ρ‚Π°ΠΊΠ° ΠΏΠΎΠ΄Π΄Ρ€ΠΆΡƒΠ²Π° автоматско Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΡšΠ΅ РСсурси ΠΈ ΠΏΠΎΠ½ΡƒΠ΄ΠΈ Π½Π° Kubernetes лидСрство Π·Π° Ρ€Π°ΡΠΏΠΎΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΈΡ‚Π΅ Kubernetes ΠΈ Red Hat OpenShift. ΠŸΠΎΠΊΡ€Π°Ρ˜ Ρ‚ΠΎΠ°, Quarkus автоматски Π³ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅ Dockerfile.jvm (JVM ΠΏΠ°ΠΊΡƒΠ²Π°ΡšΠ΅) ΠΈ Dockerfile.native (ΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Π±ΠΈΠ½Π°Ρ€Π½ΠΎ ΠΏΠ°ΠΊΡƒΠ²Π°ΡšΠ΅) ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈ Π·Π° ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ΅ ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈ.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, со Ρ„ΠΎΠΊΡƒΡΠΈΡ€Π°ΡšΠ΅ Π½Π° Kubernetes ΠΊΠ°ΠΊΠΎ Ρ†Π΅Π»Π½Π° ΠΎΠΊΠΎΠ»ΠΈΠ½Π° Π·Π° Ρ€Π°ΡΠΏΠΎΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅, Quarkus Π½Π΅ користи Java frames Π²ΠΎ случаи ΠΊΠΎΠ³Π° слична функционалност Π΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π½Π° Π½Π° Π½ΠΈΠ²ΠΎ Π½Π° самата ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° Kubernetes. Π’Π°Π±Π΅Π»Π° 1 Π΄Π°Π²Π° ΠΌΠ°ΠΏΠ° Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π½Π°Ρ‚Π° ΠΊΠΎΡ€Π΅ΡΠΏΠΎΠ½Π΄Π΅Π½Ρ†ΠΈΡ˜Π° ΠΏΠΎΠΌΠ΅Ρ“Ρƒ Kubernetes ΠΈ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΈΡ‚Π΅ Java Ρ€Π°ΠΌΠΊΠΈ ΡˆΡ‚ΠΎ Π³ΠΈ користат ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Spring.

Π’Π°Π±Π΅Π»Π° 1. ΠšΠ°Ρ€Ρ‚Π° Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π½Π° ΠΊΠΎΡ€Π΅ΡΠΏΠΎΠ½Π΄Π΅Π½Ρ†ΠΈΡ˜Π° ΠΏΠΎΠΌΠ΅Ρ“Ρƒ Java Ρ€Π°ΠΌΠΊΠΈ ΠΈ Kubernetes.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π½Π°
Π’Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π°Π»Π½Π° ΠΏΡ€ΠΎΠ»Π΅Ρ‚Π½Π° Ρ‡ΠΈΠ·ΠΌΠΈΡ‡ΠΊΠ°
ΠšΡƒΠ±Π΅Ρ€Π½Π΅Ρ‚ΠΈ

ΠžΡ‚ΠΊΡ€ΠΈΠ²Π°ΡšΠ΅ Π½Π° услугата
Π•ΡƒΡ€Π΅ΠΊΠ°
DNS

ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°
ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° Π½Π° ΠΏΡ€ΠΎΠ»Π΅Ρ‚Π΅Π½ ΠΎΠ±Π»Π°ΠΊ
ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ˜Ρ‚Π΅ ΠΌΠ°ΠΏΠΈ/Ρ‚Π°Ρ˜Π½ΠΈ

Π‘Π°Π»Π°Π½ΡΠΈΡ€Π°ΡšΠ΅ Π½Π° Ρ‚ΠΎΠ²Π°Ρ€ΠΎΡ‚
Π›Π΅Π½Ρ‚Π° (страна Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΡ‚)
БСрвис, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€ Π·Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° (страна Π½Π° сСрвСрот)

Π‘ΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ ΠΈ ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΊΠΎΠ΄ΠΎΡ‚ ΠΎΠ΄ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΡ‚

Π’ΠΎ ΠΎΠ²Π°Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° сС осврнувамС Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ сС користат Π·Π°Π΅Π΄Π½ΠΎ Spring ΠΈ MicroProfile API, ΠΏΠ° Π΄ΡƒΡ€ΠΈ ΠΈ истата Java класа. ΠšΠΎΠ΄ΠΎΡ‚ Π²ΠΎ овој ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π° ΠΈ стартува ΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄Π½Π°Ρ‚Π° линија, Π²ΠΈΠ΄Π΅Ρ‚Π΅ ја Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° README.md Π·Π° Π΄Π΅Ρ‚Π°Π»ΠΈ.

Spring Framework API

Π˜Π½Ρ˜Π΅ΠΊΡ‚ΠΈΡ€Π°ΡšΠ΅ Π½Π° зависност

Quarkus ΠΏΠΎΠ΄Π΄Ρ€ΠΆΡƒΠ²Π° опсСг Π½Π° API-ΠΈ Π½Π° контСксти ΠΈ ΠΈΠ½Ρ˜Π΅ΠΊΡ†ΠΈΡ˜Π° Π½Π° зависност (CDI). ΠΈ Spring Dependency Injection (Spring DI) API. Ако Ρ€Π°Π±ΠΎΡ‚ΠΈΡ‚Π΅ со MicroProfile, Јава Π•Π• ΠΈ Џакарта Π•Π•, Ρ‚ΠΎΠ³Π°Ρˆ вСќС стС ΠΌΠ½ΠΎΠ³Ρƒ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅Π½ΠΈ со CDI. Од Π΄Ρ€ΡƒΠ³Π° страна, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π½Π° Spring ΠΌΠΎΠΆΠ°Ρ‚ Π΄Π° Π³ΠΎ користат Quarkus Extension for Spring DI API Π·Π° Π΄Π° постигнат компатибилност со Spring DI. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΠΆΠ°Π½ΠΈΡ‚Π΅ Spring DI API сС Π΄Π°Π΄Π΅Π½ΠΈ Π²ΠΎ Π’Π°Π±Π΅Π»Π° 2.

Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΎΠ΄ Π½Π°ΡˆΠΈΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠšΠΎΡ€ΠΈΡΡ‚ΠΈ ΠΈ CDI ΠΈ ΠΈΠ½Ρ˜Π΅ΠΊΡ†ΠΈΡ˜Π° Π·Π° зависност ΠΎΠ΄ ΠΏΡ€ΠΎΠ»Π΅Ρ‚. Π—Π° повСќС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π½Π° ΠΎΠ²Π°Π° Ρ‚Π΅ΠΌΠ°, Π²ΠΈΠ΄Π΅Ρ‚Π΅ Π³ΠΎ Π²ΠΎΠ΄ΠΈΡ‡ΠΎΡ‚ Quarkus Π½Π°Ρ€Π΅Ρ‡Π΅Π½ Π’ΠΎΠ΄ΠΈΡ‡ Π·Π° ΠΏΡ€ΠΎΠ»Π΅Ρ‚ Π”Π˜.

Π’Π°Π±Π΅Π»Π° 2. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΠΆΠ°Π½ΠΈΡ‚Π΅ Spring DI API.

ΠŸΠΎΠ΄Π΄Ρ€ΠΆΠ°Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Spring 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;
   }
}

Π’Π΅Π± Ρ€Π°ΠΌΠΊΠ°

На корисницитС Π½Π° MicroProfile ќС ΠΈΠΌ сС Π΄ΠΎΠΏΠ°Π΄Π½Π΅ Ρ‚ΠΎΠ° ΡˆΡ‚ΠΎ Quarkus ΠΏΠΎΠ΄Π΄Ρ€ΠΆΡƒΠ²Π° JAX-RS, MicroProfile Rest Client, JSON-P ΠΈ JSON-B ΠΊΠ°ΠΊΠΎ ΠΏΡ€ΠΈΠΌΠ°Ρ€Π΅Π½ Π²Π΅Π±-програмски ΠΌΠΎΠ΄Π΅Π». ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π½Π° ΠΏΡ€ΠΎΠ»Π΅Ρ‚Ρ‚Π° ќС Π±ΠΈΠ΄Π°Ρ‚ Π·Π°Π΄ΠΎΠ²ΠΎΠ»Π½ΠΈ ΠΎΠ΄ Π½Π΅ΠΎΠ΄Π°ΠΌΠ½Π΅ΡˆΠ½Π°Ρ‚Π° ΠΏΠΎΠ΄Π΄Ρ€ΡˆΠΊΠ° Π½Π° Quarkus Π·Π° Spring Web API, особСно REST ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅Ρ˜ΡΠΈΡ‚Π΅. Π‘Π»ΠΈΡ‡Π½ΠΎ Π½Π° Spring DI, Π³Π»Π°Π²Π½Π°Ρ‚Π° Ρ†Π΅Π» Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΡˆΠΊΠ°Ρ‚Π° Π·Π° Spring Web API Π΅ Π΄Π° ΠΈΠΌ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π½Π° Spring Π΄Π° користат Spring Web API Π²ΠΎ врска со MicroProfile API. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ Π΄Π° сС користат ΠΏΠΎΠ΄Π΄Ρ€ΠΆΠ°Π½ΠΈΡ‚Π΅ Spring Web API сС Π΄Π°Π΄Π΅Π½ΠΈ Π²ΠΎ Π’Π°Π±Π΅Π»Π° 3, Π° повСќС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π½Π° ΠΎΠ²Π°Π° Ρ‚Π΅ΠΌΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°Ρ˜Π΄Π°Ρ‚ Π²ΠΎ Ρ‚ΡƒΡ‚ΠΎΡ€ΠΈΡ˜Π°Π»ΠΎΡ‚ Quarkus Π½Π°Ρ€Π΅Ρ‡Π΅Π½ Π’Π΅Π± Π²ΠΎΠ΄ΠΈΡ‡ Π·Π° ΠΏΡ€ΠΎΠ»Π΅Ρ‚.

Π’Π°Π±Π΅Π»Π° 3. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΠΆΠ°Π½ΠΈΡ‚Π΅ Spring Web API.

ΠŸΠΎΠ΄Π΄Ρ€ΠΆΠ°Π½ΠΈ ΠΏΡ€ΠΎΠ»Π΅Ρ‚Π½ΠΈ Π²Π΅Π±-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ

@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) {
   ...
   ...
   ...
}

ΠŸΡ€ΠΎΠ»Π΅Ρ‚Π½ΠΈ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ JPA

ΠšΠΎΡ€ΠΈΡΠ½ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° MicroProfile исто Ρ‚Π°ΠΊΠ° ќС Ρ†Π΅Π½Π°Ρ‚ Π΄Π΅ΠΊΠ° Quarkus ΠΏΠΎΠ΄Π΄Ρ€ΠΆΡƒΠ²Π° JPA ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π³ΠΎ Hibernate ORM. Има ΠΈ Π΄ΠΎΠ±Ρ€ΠΈ вСсти Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π½Π° Spring: Quarkus ΠΏΠΎΠ΄Π΄Ρ€ΠΆΡƒΠ²Π° Π²ΠΎΠΎΠ±ΠΈΡ‡Π°Π΅Π½ΠΈ ΠΏΡ€ΠΈΠ±Π΅Π»Π΅ΡˆΠΊΠΈ ΠΈ Ρ‚ΠΈΠΏΠΎΠ²ΠΈ Π½Π° ΠΏΡ€ΠΎΠ»Π΅Ρ‚Π½ΠΈ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ JPA. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΠΆΠ°Π½ΠΈΡ‚Π΅ Spring Data JPA API сС Π΄Π°Π΄Π΅Π½ΠΈ Π²ΠΎ Π’Π°Π±Π΅Π»Π° 4.
Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΎΠ΄ Π½Π°ΡˆΠΈΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π‘Π΅ користат Spring Data JPA API, Π° повСќС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ сС достапни Π²ΠΎ упатството Quarkus Π½Π°Ρ€Π΅Ρ‡Π΅Π½ΠΎ Π’ΠΎΠ΄ΠΈΡ‡ JPA Π·Π° ΠΏΡ€ΠΎΠ»Π΅Ρ‚Π½ΠΈ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ.

Π’Π°Π±Π΅Π»Π° 4. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΠΆΠ°Π½ΠΈ Spring Data JPA API.

ΠŸΠΎΠ΄Π΄Ρ€ΠΆΠ°Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π° ΠΏΡ€ΠΎΠ»Π΅Ρ‚Π½ΠΈ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ JPA
ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ

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

MicroProfile API

Π’ΠΎΠ»Π΅Ρ€Π°Π½Ρ†ΠΈΡ˜Π° Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈΡ‚Π΅ Π·Π° Ρ‚ΠΎΠ»Π΅Ρ€Π°Π½Ρ†ΠΈΡ˜Π° Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ сС ΠΌΠ½ΠΎΠ³Ρƒ Π²Π°ΠΆΠ½ΠΈ Π·Π° ΡΠΏΡ€Π΅Ρ‡ΡƒΠ²Π°ΡšΠ΅ Π½Π° каскадни Π΄Π΅Ρ„Π΅ΠΊΡ‚ΠΈ ΠΈ создавањС Π½Π° Π΄ΠΎΠ²Π΅Ρ€Π»ΠΈΠ²ΠΈ микросСрвисни Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΈ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π½Π° ΠΏΡ€ΠΎΠ»Π΅Ρ‚Ρ‚Π° ΠΌΠ½ΠΎΠ³Ρƒ Π³ΠΎΠ΄ΠΈΠ½ΠΈ користат ΠΏΡ€Π΅ΠΊΠΈΠ½ΡƒΠ²Π°Ρ‡ΠΈ Π·Π° Ρ‚ΠΎΠ»Π΅Ρ€Π°Π½Ρ†ΠΈΡ˜Π° Π½Π° Π΄Π΅Ρ„Π΅ΠΊΡ‚ΠΈ. Π₯истикс. Π‘Π΅ΠΏΠ°ΠΊ, Hystrix Π½Π΅ Π΅ Π°ΠΆΡƒΡ€ΠΈΡ€Π°Π½ Π΄ΠΎΠ»Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅, Π½ΠΎ Ρ‚ΠΎΠ»Π΅Ρ€Π°Π½Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π½Π° MicroProfile сСга Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ сС Ρ€Π°Π·Π²ΠΈΠ²Π° ΠΈ Π·Π°Π΄ сСбС ΠΈΠΌΠ° Π½Π΅ΠΊΠΎΠ»ΠΊΡƒΠ³ΠΎΠ΄ΠΈΡˆΠ½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°. Π—Π°Ρ‚ΠΎΠ°, Π·Π° Π΄Π° сС ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΈ довСрливоста Π½Π° услугитС Π²ΠΎ Quarkus, сС ΠΏΡ€Π΅ΠΏΠΎΡ€Π°Ρ‡ΡƒΠ²Π° Π΄Π° сС користат MicroProfile Fault Tolerance API, Ρ‡ΠΈΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ сС користат Π²ΠΎ Π’Π°Π±Π΅Π»Π° 5. Π—Π° повСќС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π·Π° ΠΎΠ²Π°, Π²ΠΈΠ΄Π΅Ρ‚Π΅ Π³ΠΎ ΠΏΡ€ΠΈΡ€Π°Ρ‡Π½ΠΈΠΊΠΎΡ‚ Π½Π° Quarkus Π’ΠΎΠ΄ΠΈΡ‡ Π·Π° Ρ‚ΠΎΠ»Π΅Ρ€Π°Π½Ρ†ΠΈΡ˜Π° Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ.

Π’Π°Π±Π΅Π»Π° 5. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΠΆΠ°Π½ΠΈ MicroProfile Fault Tolerance 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(); //...
}

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

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° услуги (Услуга Π·Π΄Ρ€Π°Π²Ρ˜Π΅)

ΠŸΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΈΡ‚Π΅ Kubernetes Π³ΠΎ слСдат Π·Π΄Ρ€Π°Π²Ρ˜Π΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈΡ‚Π΅ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ ΡΠΏΠ΅Ρ†ΠΈΡ˜Π°Π»Π½ΠΈ услуги. Π—Π° Π΄Π° сС Π΄ΠΎΠ·Π²ΠΎΠ»ΠΈ основната ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° Π΄Π° Π³ΠΈ слСди услугитС, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π½Π° Spring ΠΎΠ±ΠΈΡ‡Π½ΠΎ користат ΠΏΡ€ΠΈΠ»Π°Π³ΠΎΠ΄Π΅Π½ HealthIndicator ΠΈ Spring Boot Actuator. Π’ΠΎ Quarkus, ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ со помош Π½Π° MicroProfile Health, кој стандардно Π²Ρ€ΡˆΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Тивост, Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π° Π·Π° истоврСмСно Π΄Π° Π³ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡƒΠ²Π° Тивоста ΠΈ подготвСноста. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ Π΄Π° сС користат ΠΏΠΎΠ΄Π΄Ρ€ΠΆΠ°Π½ΠΈΡ‚Π΅ MicroProfile Health API сС Π΄Π°Π΄Π΅Π½ΠΈ Π²ΠΎ Π’Π°Π±Π΅Π»Π° 6, Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ сС Π΄Π°Π΄Π΅Π½ΠΈ Π²ΠΎ ΠΏΡ€ΠΈΡ€Π°Ρ‡Π½ΠΈΠΊΠΎΡ‚ Π½Π° Quarkus Π’ΠΎΠ΄ΠΈΡ‡ Π·Π° здравство.

Π’Π°Π±Π΅Π»Π° 6: ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π° Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΠΆΠ°Π½ΠΈ MicroProfile Health API.

ЗдравствСни карактСристики Π½Π° MicroProfile
Опис
ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ

@Liveness

ΠŸΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π³ΠΈ рСстартира Π½Π΅ΡƒΡΠΏΠ΅ΡˆΠ½ΠΈΡ‚Π΅ ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ
ΠšΡ€Π°Ρ˜Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ°:
домаќин: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();  
}

ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠ°

АпликациитС ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π°Π°Ρ‚ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ° ΠΈΠ»ΠΈ Π·Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΈ Ρ†Π΅Π»ΠΈ (Π·Π° слСдСњС Π½Π° SLA Π½Π° пСрформанси) ΠΈΠ»ΠΈ Π·Π° Π½Π΅ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΈ Ρ†Π΅Π»ΠΈ (Π΄Π΅Π»ΠΎΠ²Π½ΠΈ SLA). ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π·Π° ΠΏΡ€ΠΎΠ»Π΅Ρ‚ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π°Π°Ρ‚ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ° со помош Π½Π° Π°ΠΊΡ‚ΡƒΠ°Ρ‚ΠΎΡ€ Π·Π° подигањС ΠΏΡ€ΠΎΠ»Π΅Ρ‚ ΠΈ ΠΌΠΈΠΊΡ€ΠΎΠΌΠ΅Ρ‚Π°Ρ€. Π—Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‚, Quarkus користи MicroProfile Metrics Π·Π° Π΄Π° ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈ основна ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ° (JVM ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π΅Π½ систСм), ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ° Π½Π° ΠΏΡ€ΠΎΠ΄Π°Π²Π°Ρ‡ΠΎΡ‚ (Quarkus) ΠΈ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ° Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ. MicroProfile Metrics Π±Π°Ρ€Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π΄Π° ΠΏΠΎΠ΄Π΄Ρ€ΠΆΡƒΠ²Π° ΠΈΠ·Π»Π΅Π·Π½ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈ JSON ΠΈ OpenMetrics (Prometheus). ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° MicroProfile Metrics API сС Π΄Π°Π΄Π΅Π½ΠΈ Π²ΠΎ Π’Π°Π±Π΅Π»Π° 7.

Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΎΠ΄ Π½Π°ΡˆΠΈΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ MicroProfile Metrics сС користи Π·Π° Π΄Π° сС ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ° Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π°. Π—Π° повСќС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Π²ΠΈΠ΄Π΅Ρ‚Π΅ Π³ΠΎ ΠΏΡ€ΠΈΡ€Π°Ρ‡Π½ΠΈΠΊΠΎΡ‚ Quarkus Π’ΠΎΠ΄ΠΈΡ‡ Π·Π° ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°.

Π’Π°Π±Π΅Π»Π° 7. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ MicroProfile Metrics 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;
}

@Gauge

ΠžΠ·Π½Π°Ρ‡ΡƒΠ²Π° сСнзор Π·Π° ΠΌΠ΅Ρ€Π°Ρ‡ ΡˆΡ‚ΠΎ ја ΠΌΠ΅Ρ€ΠΈ врСдноста Π½Π° ΠΎΠ·Π½Π°Ρ‡Π΅Π½ ΠΎΠ±Ρ˜Π΅ΠΊΡ‚

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

ΠšΡ€Π°Ρ˜Π½ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ Π½Π° ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°

ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠ° Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° localhost:8080/ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°/Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°
Основни ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ localhost:8080/ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°/основа
ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠ° Π½Π° ΠΏΡ€ΠΎΠ΄Π°Π²Π°Ρ‡ΠΎΡ‚ localhost:8080/ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°/ΠΏΡ€ΠΎΠ΄Π°Π²Π°Ρ‡
Π‘ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ localhost:8080/ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°

ΠšΠ»ΠΈΠ΅Π½Ρ‚ Π·Π° ΠΎΠ΄ΠΌΠΎΡ€ Π½Π° ΠΌΠΈΠΊΡ€ΠΎΠΏΡ€ΠΎΡ„ΠΈΠ»

ΠœΠΈΠΊΡ€ΠΎΡΠ΅Ρ€Π²ΠΈΡΠΈΡ‚Π΅ чСсто ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π°Π°Ρ‚ RESTful ΠΊΡ€Π°Ρ˜Π½ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ со ΠΊΠΎΠΈ сС ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈ соодвСтни API Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΡ‚ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π°. Π—Π° Π΄Π° користат RESTful ΠΊΡ€Π°Ρ˜Π½ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π½Π° Spring ΠΎΠ±ΠΈΡ‡Π½ΠΎ користат RestTemplate. Quarkus Π½ΡƒΠ΄ΠΈ MicroProfile Rest Client API Π·Π° Ρ€Π΅ΡˆΠ°Π²Π°ΡšΠ΅ Π½Π° овој ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Ρ‡ΠΈΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ сС Π΄Π°Π΄Π΅Π½ΠΈ Π²ΠΎ Π’Π°Π±Π΅Π»Π° 8.

Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΎΠ΄ Π½Π°ΡˆΠΈΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°Ρ‚Π° Π½Π° RESTful ΠΊΡ€Π°Ρ˜Π½ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ сС Π²Ρ€ΡˆΠΈ со ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° MicroProfile Rest Client. ПовСќС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π½Π° ΠΎΠ²Π°Π° Ρ‚Π΅ΠΌΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°Ρ˜Π΄Π΅Ρ‚Π΅ Π²ΠΎ ΠΏΡ€ΠΈΡ€Π°Ρ‡Π½ΠΈΠΊΠΎΡ‚ Quarkus Π’ΠΎΠ΄ΠΈΡ‡ Π·Π° ΠΎΠ΄ΠΌΠΎΡ€ Π·Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΈ.

Π’Π°Π±Π΅Π»Π° 8. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ MicroProfile Rest Client API.

ΠšΠ°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΡΡ‚ΠΈΠΊΠΈ Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΡ‚ Π·Π° ΠΎΠ΄ΠΌΠΎΡ€ Π½Π° ΠΌΠΈΠΊΡ€ΠΎΠΏΡ€ΠΎΡ„ΠΈΠ»
Опис
ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ

@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

Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ ΠΎΠ΄

Π’ΠΎ овој Π±Π»ΠΎΠ³, Π½Π°ΠΌΠ΅Π½Π΅Ρ‚ првСнствСно Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π½Π° Spring, Π½Π°Π±Ρ€Π·ΠΈΠ½Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π°Π²ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΈ користимС Spring API со MicroProfile API Π²ΠΎ Quarkus Π·Π° Π΄Π° Ρ€Π°Π·Π²ΠΈΠ΅ΠΌΠ΅ Java микроуслуги ΠΈ ΠΏΠΎΡ‚ΠΎΠ° Π΄Π° Π³ΠΈ ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°ΠΌΠ΅ Π²ΠΎ ΠΌΠ°Ρ˜Ρ‡ΠΈΠ½ Π±ΠΈΠ½Π°Ρ€Π΅Π½ ΠΊΠΎΠ΄ кој Π·Π°ΡˆΡ‚Π΅Π΄ΡƒΠ²Π° стотици ΠΌΠ΅Π³Π°Π±Π°Ρ˜Ρ‚ΠΈ RAM ΠΈ сС лансира Π²ΠΎ ΠΏΡ€Π°ΡˆΠ°ΡšΠ΅ Π½Π° милисСкунди.

Како ΡˆΡ‚ΠΎ вСќС Ρ€Π°Π·Π±Ρ€Π°Π²Ρ‚Π΅, повСќС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π·Π° ΠΏΠΎΠ΄Π΄Ρ€ΡˆΠΊΠ°Ρ‚Π° Π·Π° Spring ΠΈ MicroProfile API, ΠΊΠ°ΠΊΠΎ ΠΈ ΠΌΠ½ΠΎΠ³Ρƒ Π΄Ρ€ΡƒΠ³ΠΈ корисни ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°Ρ˜Π΄Π΅Ρ‚Π΅ Π²ΠΎ ΠŸΡ€ΠΈΡ€Π°Ρ‡Π½ΠΈΡ†ΠΈ Π·Π° ΠšΠ²Π°Ρ€ΠΊΡƒΡ.

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€