ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΠΈ Π΅ΡΠΎ Π½ΠΈ Ρ ΡΡΠ΅ΡΠΈΡ ΠΏΠΎΡΡ ΠΎΡ ΡΠ΅ΡΠΈΡΡΠ° Π·Π° Quarkus!

ΠΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° Java ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠΈ ΡΠ΅ΡΡΠΎ ΡΠ΅ ΡΠΌΡΡΠ°, ΡΠ΅ ΠΈ Π΅ Π½Π°Π±ΠΎΡ ΠΎΡ ΠΎΡΠ΄Π΅Π»Π½ΠΈ ΠΈ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΈ API. ΠΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ API, Ρ ΠΊΠΎΠΈΡΠΎ Π²Π΅ΡΠ΅ ΡΠ° ΡΠ²ΠΈΠΊΠ½Π°Π»ΠΈ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΈΠ·ΡΡΠ°Π²Π°Π½Π΅ΡΠΎ Π½Π° Π½ΠΎΠ²ΠΈ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΎΠ²Π΅ ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΡΠ½Π΅ΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅. ΠΠ½Π΅Ρ ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° ΠΎΠΏΡΠΎΡΡΠΈΠΌ ΡΡΠ²ΠΎΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π½ΡΠΊΠΎΠΈ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΈ ΠΈ ΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠ°ΠΊ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Spring API ΠΈ Π½ΠΎΠ²ΠΈΡΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ. .
ΠΠΊΠΎ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ, ΠΏΡΡΠ²ΠΎ ΡΠ΅ ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΠΌ Ρ ΠΎΠ±Ρ
Π²Π°ΡΠ° ΠΈ Π΄Π΅ΡΠ°ΠΉΠ»ΠΈΡΠ΅ Π½Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ Quarkus ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Spring API, Π·Π° Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Π½Π° Spring ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ ΠΊΠ°ΠΊ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΏΡΠΈΠ»Π°Π³Π°Ρ MicroProfile API Π² Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½Π°ΡΠ° ΡΠΈ ΡΠ°Π±ΠΎΡΠ°. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ MicroProfile API, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΈ Π½Π° Spring ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ ΠΏΡΠΈ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠΈ.
ΠΠ°ΡΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Quarkus? ΠΡΡΠ²ΠΎ, ΡΠΎΠ²Π° Π΅ live coding, Ρ.Π΅. Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΏΡΠ΅Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² MicroProfile API, Spring API ΠΈ Π΄ΡΡΠ³ΠΈ Java API, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° Ρ Π΅Π΄Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: mvn quarkus:dev. ΠΠ° Π²ΡΠΎΡΠΎ ΠΌΡΡΡΠΎ, ΠΎΠ±Π΅ΠΊΡΡΡ Π² ΡΠ΅ΡΠ²ΠΈΠ· Person (ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ° ΠΎΡ Spring API, MicroProfile ΠΈ JPA Π² Π±ΠΈΠ½Π°ΡΠ΅Π½ ΡΠ°ΠΉΠ» Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Π½Π°ΡΠΈΠ²Π΅Π½ ΠΎΠ±ΡΠ°Π· ΠΎΡ GraalVM) ΡΡΠ°ΡΡΠΈΡΠ° Π·Π° ΡΠ°ΠΌΠΎ 0.055 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ ΠΈ Π·Π°Π΅ΠΌΠ° ΠΎΠΊΠΎΠ»ΠΎ 90 MB Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½Π°ΡΠ° ΠΏΠ°ΠΌΠ΅Ρ (RSS) Π½Π° ΠΊΡΠ°ΠΉΠ½Π° ΡΠΎΡΠΊΠ° Π½Π° RESTful ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° ΡΠ°ΠΌΠ°ΡΠ° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° Ρ Π΅Π΄Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: mvn package -Pnative.
ΠΡΠΌΠ° Π΄Π° ΡΠ΅ Π·Π°Π΄ΡΠ»Π±ΠΎΡΠ°Π²Π°ΠΌΠ΅ Π² Π΄Π΅ΡΠ°ΠΉΠ»ΠΈΡΠ΅ Π½Π° MicroProfile, Π° ΠΏΡΠΎΡΡΠΎ ΡΠ΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π½Π΅ΠΌ Π½Π° Spring ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ°Ρ ΠΊΠ°ΠΊ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Spring API Π·Π°Π΅Π΄Π½ΠΎ Ρ MicroProfile API Π² Quarkus.
ΠΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ ΠΈ Kubernetes
ΠΠ° Π΄Π° Π½Π΅ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°ΠΌΠ΅ ΡΡΠ°ΡΠΈΡΡΠ°, ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΠ°ΠΌΠΎ Π²ΠΈΡΠΎΠΊΠΎ Π½ΠΈΠ²ΠΎ Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° , ΡΡΠΉ ΠΊΠ°ΡΠΎ Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΡΠ°Π·Π±Π΅ΡΠ΅. Quarkus ΡΠ΅ ΠΏΠΎΠ·ΠΈΡΠΈΠΎΠ½ΠΈΡΠ° ΠΊΠ°ΡΠΎ Java ΡΡΠ΅ΠΊ Π·Π° Kubernetes, ΡΠΎΠΉ ΡΠ΅Π»ΠΈ Π΄Π° ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠ° ΡΠ°Π·Ρ ΠΎΠ΄Π° Π½Π° ΠΏΠ°ΠΌΠ΅Ρ ΠΈ Π²ΡΠ΅ΠΌΠ΅ Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Java ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΡΡΠ»ΡΠ³ΠΈ, ΠΈ ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ Π΄Π° ΡΠ²Π΅Π»ΠΈΡΠΈ ΠΏΠ»ΡΡΠ½ΠΎΡΡΡΠ° Π½Π° ΡΡΡ Π½ΠΎΡΠΎ ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π°Π½Π΅ Π½Π° Ρ ΠΎΡΡΠ° ΠΈ Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈ ΠΎΠ±ΡΠΈΡΠ΅ ΡΠ°Π·Ρ ΠΎΠ΄ΠΈ.
Quarkus ΡΡΡΠΎ Π½Π° ΡΠ΅ΡΡΡΡΠΈ Π·Π° Kubernetes ΠΈ ΠΏΡΠ΅Π΄Π»Π°Π³Π° Π·Π°Π±Π΅Π»Π΅ΠΆΠΊΠΈ Π·Π° ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π°Π½Π΅ Π½Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠΈ Kubernetes ΠΈ Red Hat OpenShift. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, Quarkus Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Dockerfile.jvm (ΠΎΠΏΠ°ΠΊΠΎΠ²Π°Π½Π΅ Π½Π° JVM) ΠΈ Dockerfile.native (ΠΎΠΏΠ°ΠΊΠΎΠ²Π°Π½Π΅ Π½Π° Π½Π°ΡΠΈΠ²Π΅Π½ Π±ΠΈΠ½Π°ΡΠ΅Π½ ΡΠ°ΠΉΠ»), Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ.
Π Π½Π°ΠΊΡΠ°Ρ, ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠ°ΠΉΠΊΠΈ ΡΠ΅ ΠΊΡΠΌ Kubernetes ΠΊΠ°ΡΠΎ ΡΠ΅Π»Π΅Π²Π°ΡΠ° ΡΡΠ΅Π΄Π° Π·Π° ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅, Quarkus Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Java ΡΠ°ΠΌΠΊΠΈ, ΠΊΠΎΠ³Π°ΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ° Π½Π° Π½ΠΈΠ²ΠΎ ΡΠ°ΠΌΠ°ΡΠ° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° Kubernetes. Π Π’Π°Π±Π»ΠΈΡΠ° 1 Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½Π° ΠΊΠ°ΡΡΠ°ΡΠ° Π½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΠΎ ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ Kubernetes ΠΈ ΡΠΈΠΏΠΈΡΠ½ΠΈΡΠ΅ Java ΡΠ°ΠΌΠΊΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ ΠΎΡ Spring ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅.
Π’Π°Π±Π»ΠΈΡΠ° 1. ΠΠ°ΡΡΠ° Π½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΠΎ ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ Java ΡΠ°ΠΌΠΊΠΈΡΠ΅ ΠΈ Kubernetes.
Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ
Π’ΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π΅Π½ Spring Boot
Kubernetes
ΠΡΠΊΡΠΈΠ²Π°Π½Π΅ Π½Π° ΡΡΠ»ΡΠ³ΠΈ
Eureka
DNS
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ
Spring Cloud Config
Config Maps / Secrets
ΠΠ°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ Π½Π° Π±Π°Π»Π°Π½Ρ
Ribbon (Π½Π° ΡΡΡΠ°Π½Π°ΡΠ° Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°)
Service, Replication Controller (Π½Π° ΡΡΡΠ°Π½Π°ΡΠ° Π½Π° ΡΡΡΠ²ΡΡΠ°)
ΠΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ΄Π° ΠΎΡ ΠΏΡΠΈΠΌΠ΅ΡΠ°
Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΠΏΠΎΠ·ΠΎΠ²Π°Π²Π°ΠΌΠ΅ Π½Π° , ΠΊΡΠ΄Π΅ΡΠΎ API ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈΡΠ΅ Π½Π° Spring ΠΈ MicroProfile ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΡΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈ Π΄ΠΎΡΠΈ ΡΠΎΠ·ΠΈ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ΅Π½ Java ΠΊΠ»Π°Ρ. ΠΠΎΠ΄ΡΡ ΠΎΡ ΡΠΎΠ·ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½ ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½ ΠΎΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΈΡ ΡΠ΅Π΄, ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π²ΡΠ² ΡΠ°ΠΉΠ»Π° README.md.
API ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈΡΠ΅ Π½Π° Spring Framework
Dependency Injection
Quarkus ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΡΠ΅Π΄ΠΈΡΠ° ΠΈ API ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈ Π·Π° ΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΡΠ°Π½Π΅ Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π½Π° Spring (Spring DI). ΠΠΊΠΎ ΡΠ°Π±ΠΎΡΠΈΡΠ΅ Ρ MicroProfile, , Π²Π΅ΡΠΎΡΡΠ½ΠΎ Π²Π΅ΡΠ΅ ΡΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°ΡΠΈ Ρ CDI. ΠΡ Π΄ΡΡΠ³Π° ΡΡΡΠ°Π½Π°, ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° Spring ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Quarkus Extension Π·Π° API Π½Π° Spring DI Π·Π° ΠΎΡΠΈΠ³ΡΡΡΠ²Π°Π½Π΅ Π½Π° ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ Ρ Spring DI. ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈΡΠ΅ API Π·Π° Spring DI ΡΠ° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½ΠΈ Π² Π’Π°Π±Π»ΠΈΡΠ° 2.
Π ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΈ CDI, ΠΈ ΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΡΠ°Π½Π΅ Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π½Π° Spring. ΠΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ ΠΏΠΎ ΡΠ΅ΠΌΠ°ΡΠ° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π² ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ Π½Π° Quarkus, Π½Π°ΡΠ΅ΡΠ΅Π½ΠΎ .
Π’Π°Π±Π»ΠΈΡΠ° 2. ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈΡΠ΅ API ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈ Π½Π° Spring DI.
ΠΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π° Spring DI
ΠΡΠΈΠΌΠ΅ΡΠΈ
ΠΠ½ΠΆΠ΅ΠΊΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ
public PersonSpringController(
PersonSpringRepository personRepository, // ΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΡΠ°Π½ΠΎ
PersonSpringMPService personService) { // ΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΡΠ°Π½ΠΎ
this.personRepository = personRepository;
this.personService = personService;
}
ΠΠ½ΠΆΠ΅ΠΊΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠΎΠ»Π΅
@Autowired
@RestClient
SalutationRestClient salutationRestClient;
@Value("${fallbackSalutation}")
String fallbackSalutation;
@Configuration
@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;
}
}
Web Framework
ΠΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅ Π½Π° MicroProfile ΡΠ΅ ΡΠ΅ Π·Π°ΡΠ°Π΄Π²Π°Ρ, ΡΠ΅ Quarkus ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° JAX-RS, MicroProfile Rest Client, JSON-P ΠΈ JSON-B ΠΊΠ°ΡΠΎ ΠΎΡΠ½ΠΎΠ²Π½Π° ΠΌΠΎΠ΄Π΅Π»Π½Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° Π·Π° ΡΠ΅Π± ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅. Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° Spring ΡΡΡΠΎ ΡΠ΅ Π±ΡΠ΄Π°Ρ Π΄ΠΎΠ²ΠΎΠ»Π½ΠΈ ΠΎΡ Π½ΠΎΠ²Π°ΡΠ° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° Spring Web API Π² Quarkus, ΠΎΡΠΎΠ±Π΅Π½ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈΡΠ΅, ΠΎΡΠ³ΠΎΠ²Π°ΡΡΡΠΈ Π·Π° REST. ΠΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° Spring DI, ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΡΠ΅Π» Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° Π½Π° Spring Web API Π΅ Π΄Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° Spring Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ API ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈΡΠ΅ Π½Π° Spring Web Π·Π°Π΅Π΄Π½ΠΎ Ρ API ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈΡΠ΅ Π½Π° MicroProfile. ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈΡΠ΅ Spring Web API ΡΠ° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½ΠΈ Π² ΡΠ°Π±Π»ΠΈΡΠ° 3, Π° Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ ΠΏΠΎ ΡΠ΅ΠΌΠ°ΡΠ° ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π½Π°ΠΌΠ΅ΡΠ΅Π½ΠΈ Π² ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ Π½Π° Quarkus, Π½Π°ΡΠ΅ΡΠ΅Π½ΠΎ .
Π’Π°Π±Π»ΠΈΡΠ° 3. ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈΡΠ΅ API ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈ Π½Π° Spring Web.
ΠΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π° Spring Web
ΠΡΠΈΠΌΠ΅ΡΠΈ
@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 Data JPA
ΠΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅ Π½Π° MicroProfile ΡΡΡΠΎ ΡΠ΅ ΡΠ΅ Π·Π°ΡΠ°Π΄Π²Π°Ρ, ΡΠ΅ Quarkus ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° JPA Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° Hibernate ORM. Π Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° Spring ΠΈΠΌΠ° Π΄ΠΎΠ±ΡΠΈ Π½ΠΎΠ²ΠΈΠ½ΠΈ: Quarkus ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΎΠ±ΡΠΎΠΈΠ·Π²Π΅ΡΡΠ½ΠΈ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ ΠΈ ΡΠΈΠΏΠΎΠ²Π΅ Π½Π° Spring Data JPA. ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈΡΠ΅ API ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈ Π½Π° Spring Data JPA ΡΠ° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½ΠΈ Π² ΡΠ°Π±Π»ΠΈΡΠ° 4.
Π ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΠ΅ API ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈ Π½Π° Spring Data JPA, Π° Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π΅ Π½Π°Π»ΠΈΡΠ½Π° Π² ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ Π½Π° Quarkus, Π½Π°ΡΠ΅ΡΠ΅Π½ΠΎ .
Π’Π°Π±Π»ΠΈΡΠ° 4. ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈΡΠ΅ API ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈ Π½Π° Spring Data JPA.
ΠΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π° Spring Data JPA
ΠΡΠΈΠΌΠ΅ΡΠΈ
CrudRepository
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Repository
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);
}
API ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈ Π½Π° MicroProfile
ΠΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡ (Fault tolerance)
ΠΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈΡΠ΅ Π·Π° ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡ ΡΠ° ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π²Π°ΠΆΠ½ΠΈ Π·Π° ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠ°ΡΠΊΠ°Π΄Π½ΠΈ ΠΎΡΠΊΠ°Π·ΠΈ ΠΈ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΈ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·Π½ΠΈ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠΈ. Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° Spring Π²Π΅ΡΠ΅ ΠΎΡ ΠΌΠ½ΠΎΠ³ΠΎ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ circuit-breakers Π·Π° ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡ. . ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, Hystrix ΠΎΡΠ΄Π°Π²Π½Π° Π½Π΅ Π΅ ΠΎΠ±Π½ΠΎΠ²ΡΠ²Π°Π½, Π° MicroProfile Fault Tolerance Π°ΠΊΡΠΈΠ²Π½ΠΎ ΡΠ΅ ΡΠ°Π·Π²ΠΈΠ²Π° ΠΈ Π²Π΅ΡΠ΅ ΠΈΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΠ²Π½Π° ΡΠΏΠΎΡΡΠ΅Π±Π° Π·Π°Π΄ Π³ΡΡΠ±Π° ΡΠΈ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ, Π·Π° ΠΏΠΎΠ²ΠΈΡΠ°Π²Π°Π½Π΅ Π½Π° Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΎΡΡΡΠ° Π½Π° ΡΡΠ»ΡΠ³ΠΈΡΠ΅ Π² Quarkus Π΅ ΠΏΡΠ΅ΠΏΠΎΡΡΡΠΈΡΠ΅Π»Π½ΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ API ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈΡΠ΅ Π½Π° MicroProfile Fault Tolerance, ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΊΠΎΠΈΡΠΎ ΡΠ° ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈ Π² ΡΠ°Π±Π»ΠΈΡΠ° 5. ΠΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ Π·Π° ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π² ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ Quarkus. .
Π’Π°Π±Π»ΠΈΡΠ° 5. ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈΡΠ΅ API ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈ Π½Π° MicroProfile Fault Tolerance.
Π€ΡΠ½ΠΊΡΠΈΠΈ Π½Π° MicroProfile Fault Tolerance
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅
ΠΡΠΈΠΌΠ΅ΡΠΈ
@Asynchronous
ΠΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ° Π² ΠΎΡΠ΄Π΅Π»Π΅Π½ ΠΏΠΎΡΠΎΠΊ
@Asynchronous
@Retry
public Future 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, ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡΠ° (liveness check), Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π½Π°ΡΡΡΠΎΠ΅Π½ΠΎ ΠΈ Π·Π° Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡΠ° ΠΈ Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΡΠ°. ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈΡΠ΅ MicroProfile Health API ΡΠ° ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈ Π² ΡΠ°Π±Π»ΠΈΡΠ° 6, Π° Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½Π° Π² ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ Quarkus. .
Π’Π°Π±Π»ΠΈΡΠ° 6. ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈΡΠ΅ API ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈ Π½Π° MicroProfile Health.
Π€ΡΠ½ΠΊΡΠΈΠΈ Π½Π° MicroProfile Health
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅
ΠΡΠΈΠΌΠ΅ΡΠΈ
@Liveness
ΠΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ° ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΏΠ΅ΡΠ΅Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΠΎΠ²ΡΠ΅Π΄Π΅Π½ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
Endpoint:
host:8080/health/live
@Liveness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(ready ? true:false)
.withData("mydata", data)
.build();
}
@Readiness
ΠΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ° Π½ΡΠΌΠ° Π΄Π° ΠΈΠ·ΠΏΡΠ°ΡΠ° ΡΡΠ°ΡΠΈΠΊ ΠΊΡΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ Π½Π΅ ΡΠ° Π³ΠΎΡΠΎΠ²ΠΈ
Endpoint:
host:8080/health/ready
@Readiness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(live ? true:false)
.withData("mydata", data)
.build();
}
ΠΠ΅ΡΡΠΈΠΊΠΈ
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΡ ΠΌΠ΅ΡΡΠΈΠΊΠΈ ΠΈΠ»ΠΈ Π·Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΈ ΡΠ΅Π»ΠΈ (Π·Π° ΠΊΠΎΠ½ΡΡΠΎΠ» Π½Π° SLA-ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ), ΠΈΠ»ΠΈ Π·Π° Π½Π΅ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΈ (Π±ΠΈΠ·Π½Π΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π½Π° SLA). Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° Spring ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΡ ΠΌΠ΅ΡΡΠΈΠΊΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Spring Boot Actuator ΠΈ Micrometer. ΠΡ ΡΠ²ΠΎΡ ΡΡΡΠ°Π½Π°, Quarkus ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° MicroProfile Metrics Π·Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΠ½Π΅ Π½Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈ ΠΌΠ΅ΡΡΠΈΠΊΠΈ (JVM ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°), Π²Π΅Π½Π΄ΠΎΡΡΠΊΠΈ ΠΌΠ΅ΡΡΠΈΠΊΠΈ (Quarkus) ΠΈ ΠΌΠ΅ΡΡΠΈΠΊΠΈ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ°. MicroProfile Metrics ΠΈΠ·ΠΈΡΠΊΠ²Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° Π΄Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈ ΡΠΎΡΠΌΠ°ΡΠΈ JSON ΠΈ OpenMetrics (Prometheus). ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° MicroProfile Metrics API ΡΠ° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½ΠΈ Π² ΡΠ°Π±Π»ΠΈΡΠ° 7.
Π MicroProfile Metrics ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π·Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΠ½Π΅ Π½Π° ΠΌΠ΅ΡΡΠΈΠΊΠΈ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ. ΠΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΌΠ΅ΡΠΈ Π² ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ Π½Π° Quarkus .
Π’Π°Π±Π»ΠΈΡΠ° 7. ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° API ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈ Π½Π° MicroProfile Metrics.
Π€ΡΠ½ΠΊΡΠΈΠΈ Π½Π° MicroProfile Metrics
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅
ΠΡΠΈΠΌΠ΅ΡΠΈ
@Counted
ΠΠ·Π½Π°ΡΠ°Π²Π° counter-ΡΡΠ΅ΡΡΠΈΠΊ, ΠΊΠΎΠΉΡΠΎ ΠΎΡΡΠΈΡΠ°Ρ Π±ΡΠΎΡ Π½Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡΡΠ° Π½Π° Π°Π½ΠΎΡΠΈΡΠ°Π½ΠΈΡ ΠΎΠ±Π΅ΠΊΡ
@Counted(name = "fallbackCounter",
displayName = "Fallback Counter",
description = "Fallback Counter")
public String salutationFallback() {
return fallbackSalutation;
}
@ConcurrentGauge
ΠΠ·Π½Π°ΡΠ°Π²Π° gauge-Π΄Π°ΡΡΠΈΠΊ, ΠΊΠΎΠΉΡΠΎ ΠΎΡΡΠΈΡΠ°Ρ Π±ΡΠΎΡ Π½Π° ΠΏΠ°ΡΠ°Π»Π΅Π»Π½ΠΈΡΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ Π½Π° Π°Π½ΠΎΡΠΈΡΠ°Π½ΠΈΡ ΠΎΠ±Π΅ΠΊΡ
@ConcurrentGuage(
name = "fallbackConcurrentGauge",
displayName="Fallback Concurrent",
description="Fallback Concurrent")
public String salutationFallback() {
return fallbackSalutation;
}
@Gauge
ΠΠ·Π½Π°ΡΠ°Π²Π° gauge-Π΄Π°ΡΡΠΈΠΊ, ΠΊΠΎΠΉΡΠΎ ΠΌΠ΅ΡΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π½Π° Π°Π½ΠΎΡΠΈΡΠ°Π½ΠΈΡ ΠΎΠ±Π΅ΠΊΡ
@Metered(name = "FallbackGauge",
displayName="Fallback Gauge",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
@Metered
ΠΠ·Π½Π°ΡΠ°Π²Π° meter-Π΄Π°ΡΡΠΈΠΊ, ΠΊΠΎΠΉΡΠΎ ΡΠ»Π΅Π΄ΠΈ ΡΠ΅ΡΡΠΎΡΠ°ΡΠ° Π½Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡΡΠ° Π½Π° Π°Π½ΠΎΡΠΈΡΠ°Π½ΠΈΡ ΠΎΠ±Π΅ΠΊΡ
@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;
}
ΠΠ΅ΡΡΠΈΠΊΠΈ ΠΊΡΠ°ΠΉΠ½ΠΈ ΡΠΎΡΠΊΠΈ (Metrics Endpoints)
ΠΠ΅ΡΡΠΈΠΊΠΈ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ :8080/metrics/application
ΠΡΠ½ΠΎΠ²Π½ΠΈ ΠΌΠ΅ΡΡΠΈΠΊΠΈ :8080/metrics/base
ΠΠ΅ΡΡΠΈΠΊΠΈ Π½Π° Π΄ΠΎΡΡΠ°Π²ΡΠΈΡΠΈ :8080/metrics/vendor
ΠΡΠΈΡΠΊΠΈ ΠΌΠ΅ΡΡΠΈΠΊΠΈ :8080/metrics
Rest ΠΊΠ»ΠΈΠ΅Π½Ρ MicroProfile
ΠΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·ΠΈΡΠ΅ ΡΠ΅ΡΡΠΎ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Ρ RESTful ΠΊΡΠ°ΠΉΠ½ΠΈ ΡΠΎΡΠΊΠΈ, Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΠΊΠΎΠΈΡΠΎ ΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΈΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈ API. ΠΠ° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ RESTful ΠΊΡΠ°ΠΉΠ½ΠΈ ΡΠΎΡΠΊΠΈ, ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° Spring ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ RestTemplate. Quarkus ΠΏΡΠ΅Π΄Π»Π°Π³Π° API ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈ MicroProfile Rest Client, ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠΈΡΠΎ ΡΠ° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½ΠΈ Π² ΡΠ°Π±Π»ΠΈΡΠ° 8.
Π ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° RESTful ΠΊΡΠ°ΠΉΠ½ΠΈ ΡΠΎΡΠΊΠΈ ΡΠ΅ ΠΎΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° ΡΡΠ΅Π· MicroProfile Rest Client. ΠΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ ΠΏΠΎ ΡΠ΅ΠΌΠ°ΡΠ° ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π½Π°ΠΌΠ΅ΡΠ΅Π½ΠΈ Π² ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ Π½Π° Quarkus. .
Π’Π°Π±Π»ΠΈΡΠ° 8. ΠΡΠΈΠΌΠ΅ΡΠΈ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° API ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈΡΠ΅ MicroProfile Rest Client.
Π€ΡΠ½ΠΊΡΠΈΠΈ Π½Π° MicroProfile Rest Client
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅
ΠΡΠΈΠΌΠ΅ΡΠΈ
@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, Π½ΠΈΠ΅ Π½Π°ΠΊΡΠ°ΡΠΊΠΎ ΡΠ°Π·Π³Π»Π΅Π΄Π°Ρ ΠΌΠ΅ ΠΊΠ°ΠΊ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ API ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈΡΠ΅ Π½Π° Spring Π·Π°Π΅Π΄Π½ΠΎ Ρ ΡΠ΅Π·ΠΈ Π½Π° MicroProfile Π² Quarkus, Π·Π° Π΄Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΈΠΌ Java ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·ΠΈ ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π΄Π° Π³ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°ΠΌΠ΅ Π² ΡΠΎΠ΄Π΅Π½ Π΄Π²ΠΎΠΈΡΠ΅Π½ ΠΊΠΎΠ΄, ΠΊΠΎΠΉΡΠΎ ΡΠΏΠ΅ΡΡΡΠ²Π° ΡΡΠΎΡΠΈΡΠΈ ΠΌΠ΅Π³Π°Π±Π°ΠΉΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½Π° ΠΏΠ°ΠΌΠ΅Ρ ΠΈ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° Π·Π° ΡΠ΅ΠΊΡΠ½Π΄ΠΈ.
ΠΠ°ΠΊΡΠΎ Π²Π΅ΡΠ΅ ΡΠ°Π·Π±ΡΠ°Ρ
ΡΠ΅, Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΡΠ½ΠΎΡΠ½ΠΎ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° Π½Π° API ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈΡΠ΅ Π½Π° Spring ΠΈ MicroProfile, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³Π° ΠΏΠΎΠ»Π΅Π·Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π² .
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
