Как Quarkus обСдинява MicroProfile и Spring

Π—Π΄Ρ€Π°Π²Π΅ΠΉΡ‚Π΅ Π½Π° всички, ΠΈ с вас Π΅ трСтият пост ΠΎΡ‚ ΠΏΠΎΡ€Π΅Π΄ΠΈΡ†Π°Ρ‚Π° Π·Π° Quarkus!

Как Quarkus обСдинява MicroProfile и Spring

ΠŸΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Java микросСрвиси чСсто сС счита, Ρ‡Π΅ Eclipse MicroProfile ΠΈ Spring Boot – Ρ‚ΠΎΠ²Π° са ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ ΠΈ нСзависими ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρƒ си API. По ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ програмиститС ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Ρ‚Π΅Π·ΠΈ API, с ΠΊΠΎΠΈΡ‚ΠΎ Π²Π΅Ρ‡Π΅ са свикнали, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·ΡƒΡ‡Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π½ΠΎΠ²ΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ²Π΅ ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ Π½Π° runtime ΠΎΡ‚Π½Π΅ΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅. ДнСс Ρ‰Π΅ сС ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° улСсним усвояванСто Π½Π° някои популярни MicroProfile API Π·Π° Spring Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈ ΠΈ Ρ‰Π΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠ°ΠΊ Π΅Π΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Spring API ΠΈ Π½ΠΎΠ²ΠΈΡ‚Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΈ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ Quarkus.

Ако Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΏΠΎ-ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ, ΠΏΡŠΡ€Π²ΠΎ Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΎΠ±Ρ…Π²Π°Ρ‚Π° Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π΄Π΅Ρ‚Π°ΠΉΠ»ΠΈ Π·Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊ Quarkus ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° API интСрфСйси Π½Π° Spring, Π·Π° Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Π½Π° Spring Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ ΠΊΠ°ΠΊ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° ΠΏΡ€ΠΈΠ»Π°Π³Π°Ρ‚ MicroProfile API Π² Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½Π°Ρ‚Π° си Ρ€Π°Π±ΠΎΡ‚Π°. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Ρ‰Π΅ Ρ€Π°Π·ΠΊΠ°ΠΆΠ΅ΠΌ Π·Π° MicroProfile API, ΠΊΠΎΠΈΡ‚ΠΎ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½ΠΈ Π½Π° Spring Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ ΠΏΡ€ΠΈ ΡΡŠΠ·Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° микросСрвиси.

Π—Π°Ρ‰ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Quarkus? ΠŸΡŠΡ€Π²ΠΎ, Ρ‚ΠΎΠ²Π° Π΅ live coding, Ρ‚.Π΅. Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ ΠΏΡ€Π΅Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° всякакви ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² MicroProfile API, Spring API ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ Java API, ΠΊΠΎΠ΅Ρ‚ΠΎ сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° с Π΅Π΄Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: mvn quarkus:dev. Π’Ρ‚ΠΎΡ€ΠΎ, разглСданият Π² нашия ΠΏΡ€ΠΈΠΌΠ΅Ρ€ сСрвиз Person (Ρ‚ΠΎΠΉ сС ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π° ΠΎΡ‚ API интСрфСйситС Π½Π° Spring, MicroProfile ΠΈ JPA Π² изпълним Ρ„Π°ΠΉΠ» с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Π½Π°Ρ‚ΠΈΠ²Π΅Π½ ΠΎΠ±Ρ€Π°Π· GraalVM) стартира само Π·Π° 0.055 сСкунди ΠΈ Π·Π°Π΅ΠΌΠ° ΠΎΠΊΠΎΠ»ΠΎ 90 MB Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Π°Ρ‚Π° ΠΏΠ°ΠΌΠ΅Ρ‚ (RSS) Π½Π° ΠΊΡ€Π°ΠΉΠ½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° RESTful ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ. ОсвСн Ρ‚ΠΎΠ²Π° самата компилация сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° с Π΅Π΄Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°: mvn package -Pnative.

Няма Π΄Π° сС Π·Π°Π΄ΡŠΠ»Π±ΠΎΡ‡Π°Π²Π°ΠΌΠ΅ Π² подробности Π·Π° MicroProfile, Π° просто Ρ‰Π΅ сС ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π½Π΅ΠΌ Π½Π° Spring Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π°Ρ‚ ΠΊΠ°ΠΊ Π² Quarkus ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ API интСрфСйситС Π½Π° Spring Π·Π°Π΅Π΄Π½ΠΎ с API интСрфСйситС Π½Π° MicroProfile.

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ ΠΈ Kubernetes

Π—Π° Π΄Π° Π½Π΅ Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°ΠΌΠ΅ Ρ‚Π°Π·ΠΈ статия, Ρ‚ΡƒΠΊ Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ само високо Π½ΠΈΠ²ΠΎ Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Kubernetes, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Ρ‚ΠΎΠ²Π° Π΅ Π²Π°ΠΆΠ½ΠΎ Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅. Quarkus Π΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€Π°Π½ ΠΊΠ°Ρ‚ΠΎ Java стСк Π·Π° Kubernetes, Ρ‚ΠΎΠΉ Π΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Π΄Π° ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€Π° Ρ€Π°Π·Ρ…ΠΎΠ΄Π° Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚ ΠΈ Π²Ρ€Π΅ΠΌΠ΅ Π·Π° стартиранС Π½Π° Java прилоТСния ΠΈ услуги ΠΈ, слСдоватСлно, Π΄Π° ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈ ΠΏΠ»ΡŠΡ‚Π½ΠΎΡΡ‚Ρ‚Π° Π½Π° Ρ€Π°Π·ΠΏΠΎΠ»Π°Π³Π°Π½Π΅ Π½Π° хост ΠΈ Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈ ΠΎΠ±Ρ‰ΠΈΡ‚Π΅ Ρ€Π°Π·Ρ…ΠΎΠ΄ΠΈ.

Quarkus ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½Π°Ρ‚Π° гСнСриция Π½Π° рСсурси Π·Π° Kubernetes ΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π° Π½Π° Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎΡ‚ΠΎ ΠΏΠΎ Ρ€Π°Π·Π³Ρ€ΡŠΡ‰Π°Π½Π΅ Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΈ Kubernetes ΠΈ Red Hat OpenShift. ОсвСн Ρ‚ΠΎΠ²Π° Quarkus Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Dockerfile.jvm (JVM packaging) ΠΈ Dockerfile.native (native binary packaging), ΠΊΠΎΠΈΡ‚ΠΎ са Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ.

И накрая, ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€Π°ΠΉΠΊΠΈ сС към Kubernetes ΠΊΠ°Ρ‚ΠΎ Ρ†Π΅Π»Π΅Π²Π° срСда Π·Π° Ρ€Π°Π·Π³Ρ€ΡŠΡ‰Π°Π½Π΅, Quarkus Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Java Ρ€Π°ΠΌΠΊΠΈ Π² случаитС, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½Π° функционалност Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π° Π½Π° Π½ΠΈΠ²ΠΎ самата ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° Kubernetes. Π’ Ρ‚Π°Π±Π»ΠΈΡ†Π° 1 Π΅ прСдоставСна ΠΊΠ°Ρ€Ρ‚Π° Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π½ΠΎΡ‚ΠΎ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Kubernetes ΠΈ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΈΡ‚Π΅ Java Ρ€Π°ΠΌΠΊΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ ΠΎΡ‚ Spring Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅.

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

Ѐункционалности
Π’Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π΅Π½ Spring Boot
Kubernetes

ΠžΡ‚ΠΊΡ€ΠΈΠ²Π°Π½Π΅ Π½Π° услуги
Eureka
DNS

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ
Spring Cloud Config
Config Maps / Secrets

Балансировка Π½Π° Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅Ρ‚ΠΎ
Ribbon (Π½Π° клиСнтска страна)
Π‘Π»ΡƒΠΆΠ±Π°, Replication Controller (Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π½Π° страна)

ΠšΠΎΠΌΠΏΠΈΠ»Π°Ρ†ΠΈΡ ΠΈ стартиранС Π½Π° ΠΊΠΎΠ΄Π° ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°

Π’ Ρ‚Π°Π·ΠΈ статия сС ΠΏΠΎΠ·ΠΎΠ²Π°Π²Π°ΠΌΠ΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅Π½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π² ΠΊΠΎΠΉΡ‚ΠΎ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π·Π°Π΅Π΄Π½ΠΎ API интСрфСйси Π½Π° Spring ΠΈ MicroProfile ΠΈ Π΄ΠΎΡ€ΠΈ самият Java клас. ΠšΠΎΠ΄ΡŠΡ‚ ΠΎΡ‚ Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½ ΠΈ стартиран ΠΎΡ‚ командния Ρ€Π΅Π΄, Π·Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅ подробности Π²ΠΈΠΆΡ‚Π΅ Ρ„Π°ΠΉΠ»Π° README.md.

API интСрфСйси Π½Π° Spring Framework

Dependency Injection

Quarkus ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° Ρ€Π΅Π΄ΠΈΡ†Π° API интСрфСйси Π·Π° контСксти ΠΈ ΠΈΠ½ΠΆΠ΅ΠΊΡ‚ΠΈΡ€Π°Π½Π΅ Π½Π° зависимости (CDI) ΠΈ API интСрфСйси Π·Π° ΠΈΠ½ΠΆΠ΅ΠΊΡ‚ΠΈΡ€Π°Π½Π΅ Π½Π° зависимости Π½Π° Spring (Spring DI). Ако Ρ€Π°Π±ΠΎΡ‚ΠΈΡ‚Π΅ с MicroProfile, Java EE ΠΈ Jakarta EE, Π²Π΅Ρ‡Π΅ стС Π΄ΠΎΠ±Ρ€Π΅ Π·Π°ΠΏΠΎΠ·Π½Π°Ρ‚ΠΈ с CDI. ΠžΡ‚ Π΄Ρ€ΡƒΠ³Π° страна, Spring Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Quarkus Extension Π·Π° Spring DI API, Π·Π° Π΄Π° осигурят ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ с Spring DI. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π½ΠΈΡ‚Π΅ Spring DI API са прСдставСни Π² Ρ‚Π°Π±Π»ΠΈΡ†Π° 2.

Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΡŠΡ‚ ΠΎΡ‚ нашия ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ°ΠΊΡ‚ΠΎ CDI, Ρ‚Π°ΠΊΠ° ΠΈ Spring Dependency Injection. Π”ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½Π° информация ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ ΠΏΠΎ Ρ‚Π°Π·ΠΈ Ρ‚Π΅ΠΌΠ° ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈ Π² Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎΡ‚ΠΎ Π½Π° Quarkus, ΠΎΠ·Π°Π³Π»Π°Π²Π΅Π½ΠΎ Spring DI Guide.

Π’Π°Π±Π»ΠΈΡ†Π° 2. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π½ΠΈΡ‚Π΅ API интСрфСйси Π½Π° Spring DI.

ΠŸΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° Spring DI
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ

Π˜Π½ΠΆΠ΅ΠΊΡ‚ΠΈΡ€Π°Π½Π΅ Π½Π° конструктор

public PersonSpringController(
   PersonSpringRepository personRepository,  // ΠΈΠ½ΠΆΠ΅ΠΊΡ‚ΠΈΡ€Π°Π½      
   PersonSpringMPService personService) {    // ΠΈΠ½ΠΆΠ΅ΠΊΡ‚ΠΈΡ€Π°Π½
      this.personRepository = personRepository;
      this.personService = personService;
}

Π˜Π½ΠΆΠ΅ΠΊΡ‚ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΠΎΠ»Π΅
Autowired
Value

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Bean
@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

@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 Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ приятно ΠΈΠ·Π½Π΅Π½Π°Π΄Π°Π½ΠΈ ΠΎΡ‚ Π½Π°ΡΠΊΠΎΡ€ΠΎΡˆΠ½Π°Ρ‚Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° Spring Web API Π² Quarkus, ΠΏΠΎ-спСциално интСрфСйситС, отговарящи Π·Π° REST. Подобно Π½Π° DI Π² Spring, основната Ρ†Π΅Π» Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°Ρ‚Π° Π½Π° Spring Web API Π΅ Π΄Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° Spring Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ API интСрфСйситС Π½Π° Spring Web Π·Π°Π΅Π΄Π½ΠΎ с API интСрфСйситС Π½Π° MicroProfile. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π½ΠΈΡ‚Π΅ Spring Web API ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π° 3, Π° Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½Π° информация ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ ΠΏΠΎ Ρ‚Π΅ΠΌΠ°Ρ‚Π° са Π½Π°Π»ΠΈΡ‡Π½ΠΈ Π² Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎΡ‚ΠΎ Π½Π° Quarkus, Π½Π°Ρ€Π΅Ρ‡Π΅Π½ΠΎ Spring Web Guide.

Π’Π°Π±Π»ΠΈΡ†Π° 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 с Π½Π°Π·Π²Π°Π½ΠΈΠ΅Ρ‚ΠΎ Spring Data JPA Guide.

Π’Π°Π±Π»ΠΈΡ†Π° 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);
}

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

API интСрфСйси Π½Π° MicroProfile

ΠžΡ‚ΠΊΠ°Π·ΠΎΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ (Fault tolerance)

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈΡ‚Π΅ Π·Π° отказоустойчивост са ΠΈΠ·ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Π²Π°ΠΆΠ½ΠΈ Π·Π° прСдотвратяванС Π½Π° каскадни ΠΎΡ‚ΠΊΠ°Π·ΠΈ ΠΈ ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΈ микросСрвисни Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΈ. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° Spring Π²Π΅Ρ‡Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ circuit-breaker-ΠΈ Π·Π° отказоустойчивост Hystrix. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π° 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

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° броя Π½Π° simultΠ°Π½Π½ΠΈΡ‚Π΅ заявки

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

@CircuitBreaker

Π£ΠΌΠ½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΡΠ±Π»ΡŠΡΡŠΡ†ΠΈ ΠΈ Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ слСд Π³Ρ€Π΅ΡˆΠΊΠΈ

@CircuitBreaker(delay=500   // милисСкунди
   failureRatio = .75,
   requestVolumeThreshold = 20,
   successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

@Fallback

ИзвикванС Π½Π° Π°Π»Ρ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ° ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π°Π»

@Timeout(500) // милисСкунди
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

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

Retry

ΠŸΠΎΠ²Ρ‚ΠΎΡ€ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π°Π» Π½Π° заявка

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

Timeout

ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ» Π½Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π·Π° ΠΈΠ·Ρ‡Π°ΠΊΠ²Π°Π½Π΅ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π°Π»

@Timeout(value = 500 )   // милисСкунди
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° услугитС (Service Health)

Kubernetes ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΈΡ‚Π΅ слСдят Π·Π° ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΡ‚Π΅ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° спСциализирани услуги. Π—Π° Π΄Π° ΠΌΠΎΠΆΠ΅ ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‰Π°Ρ‚Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° Π΄Π° слСди услугитС, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° Spring ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ настраиваСми HealthIndicator ΠΈ Spring Boot Actuator. Π’ Quarkus Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Π½Π°ΠΏΡ€Π°Π²Π΅Π½ΠΎ с MicroProfile Health, ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ изпълнява ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ТизнСспособността (liveness check), Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС настрои ΠΈ Π·Π° Π΅Π΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ТизнСспособността ΠΈ готовността (readiness). ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π½ΠΈΡ‚Π΅ 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

ΠžΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π²Π° брояч, ΠΊΠΎΠΉΡ‚ΠΎ ΠΎΡ‚Ρ‡ΠΈΡ‚Π° броя Π½Π° извикванията Π½Π° анотирания ΠΎΠ±Π΅ΠΊΡ‚

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

Π’ΠΎΡ‡ΠΊΠΈ Π½Π° ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ (Metrics Endpoints)

ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π½Π° прилоТСнията localhost:8080/metrics/application
Основни ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ localhost:8080/metrics/base
Vendor ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ localhost:8080/metrics/vendor
Всички ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ localhost:8080/metrics

Rest ΠΊΠ»ΠΈΠ΅Π½Ρ‚ MicroProfile

ΠœΠΈΠΊΡ€ΠΎΡΠ΅Ρ€Π²ΠΈΡΠΈΡ‚Π΅ чСсто ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Ρ‚ RESTful Ρ‚ΠΎΡ‡ΠΊΠΈ, Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с ΠΊΠΎΠΈΡ‚ΠΎ са Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ‚Π΅ клиСнтски API. Π—Π° Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ RESTful Ρ‚ΠΎΡ‡ΠΊΠΈΡ‚Π΅, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° Spring ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ RestTemplate. Quarkus ΠΏΡ€Π΅Π΄Π»Π°Π³Π° API интСрфСйси MicroProfile Rest Client, ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΊΠΎΠΈΡ‚ΠΎ са прСдставСни Π² Ρ‚Π°Π±Π»ΠΈΡ†Π° 8.

Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΡŠΡ‚ ΠΎΡ‚ нашия ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° RESTful Ρ‚ΠΎΡ‡ΠΊΠΈ сС ΠΎΡΡŠΡ‰Π΅ΡΡ‚Π²ΡΠ²Π° Ρ‡Ρ€Π΅Π· MicroProfile Rest Client. Π”ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ свСдСния ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ ΠΏΠΎ Ρ‚ΠΎΠ·ΠΈ Π²ΡŠΠΏΡ€ΠΎΡ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈ Π² Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎΡ‚ΠΎ Π½Π° Quarkus Π ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎ Π·Π° Rest Client.

Π’Π°Π±Π»ΠΈΡ†Π° 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, Π½Π°ΠΊΡ€Π°Ρ‚ΠΊΠΎ Ρ€Π°Π·Π³Π»Π΅Π΄Π°Ρ…ΠΌΠ΅ ΠΊΠ°ΠΊ Π² Quarkus Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ API интСрфСйси Π½Π° Spring Π·Π°Π΅Π΄Π½ΠΎ с API интСрфСйси Π½Π° MicroProfile, Π·Π° Π΄Π° сС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‚ Java микросСрвиси ΠΈ слСд Ρ‚ΠΎΠ²Π° Π΄Π° сС ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Ρ‚ Π² Π½Π°Ρ‚ΠΈΠ²Π΅Π½ Π΄Π²ΠΎΠΈΡ‡Π΅Π½ ΠΊΠΎΠ΄, ΠΊΠΎΠΉΡ‚ΠΎ спСстява стотици ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚ ΠΈ сС стартира Π·Π° сСкунди.

ΠšΠ°ΠΊΡ‚ΠΎ Π²Π΅Ρ‡Π΅ Ρ€Π°Π·Π±Ρ€Π°Ρ…Ρ‚Π΅, Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½Π° информация относно ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°Ρ‚Π° Π½Π° API интСрфСйси Π½Π° Spring ΠΈ MicroProfile, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³Π° ΠΏΠΎΠ»Π΅Π·Π½Π° информация, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π² Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²Π°Ρ‚Π° Π½Π° Quarkus.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster