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

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

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

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

Ако Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎ-ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ, ΠΏΡŠΡ€Π²ΠΎ Ρ‰Π΅ сС Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΠΌ с ΠΎΠ±Ρ…Π²Π°Ρ‚Π° ΠΈ Π΄Π΅Ρ‚Π°ΠΉΠ»ΠΈΡ‚Π΅ Π½Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊ 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

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

Π’ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΎΡ‚ нашия ΠΏΡ€ΠΈΠΌΠ΅Ρ€ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ ΠΈ CDI, ΠΈ ΠΈΠ½ΠΆΠ΅ΠΊΡ‚ΠΈΡ€Π°Π½Π΅ Π½Π° зависимости Π½Π° Spring. Π”ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½Π° информация ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ ΠΏΠΎ Ρ‚Π΅ΠΌΠ°Ρ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π² Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎΡ‚ΠΎ Π½Π° Quarkus, Π½Π°Ρ€Π΅Ρ‡Π΅Π½ΠΎ Spring DI Guide.

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

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

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

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

Π˜Π½ΠΆΠ΅ΠΊΡ‚ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΠΎΠ»Π΅
@Autowired
Бтойност

@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
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, Π½Π°Ρ€Π΅Ρ‡Π΅Π½ΠΎ 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);
}

РСзюмС Π½Π° Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈΡ‚Π΅

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. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, Hystrix ΠΎΡ‚Π΄Π°Π²Π½Π° Π½Π΅ Π΅ обновяван, Π° MicroProfile Fault Tolerance Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ сС Ρ€Π°Π·Π²ΠΈΠ²Π° ΠΈ Π²Π΅Ρ‡Π΅ ΠΈΠΌΠ° няколко Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΈΠ²Π½Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π° Π·Π°Π΄ Π³ΡŠΡ€Π±Π° си. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ, Π·Π° повишаванС Π½Π° надСТдността Π½Π° услугитС Π² Quarkus Π΅ ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ API интСрфСйситС Π½Π° MicroProfile Fault Tolerance, ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΊΠΎΠΈΡ‚ΠΎ са посочСни Π² Ρ‚Π°Π±Π»ΠΈΡ†Π° 5. Π”ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ свСдСния Π·Π° Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π² Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎΡ‚ΠΎ Quarkus. Fault Tolerance Guide.

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

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

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

Timeout

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

@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. Health Guide.

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

ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π½Π° прилоТСния localhost:8080/metrics/application
Основни ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ localhost:8080/metrics/base
ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π½Π° доставчици 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 ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

Π’Π°Π±Π»ΠΈΡ†Π° 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, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³Π° ΠΏΠΎΠ»Π΅Π·Π½Π° информация ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π² Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²Π°Ρ‚Π° Π½Π° Quarkus.

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

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