Как Quarkus ΡΡŠΡ‡Π΅Ρ‚Π°Π²Π° MicroProfile ΠΈ Spring

Π—Π΄Ρ€Π°Π²Π΅ΠΉΡ‚Π΅ всички, Π΅Ρ‚ΠΎ Ρ‚Ρ€Π΅Ρ‚Π°Ρ‚Π° публикация ΠΎΡ‚ ΠΏΠΎΡ€Π΅Π΄ΠΈΡ†Π°Ρ‚Π° Quarkus!

Как Quarkus ΡΡŠΡ‡Π΅Ρ‚Π°Π²Π° MicroProfile ΠΈ Spring

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

Π’ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎΠ²Π΅Ρ‡Π΅ подробности, ΠΏΡŠΡ€Π²ΠΎ Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΎΠ±Ρ…Π²Π°Ρ‚Π° ΠΈ подробноститС Π·Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊ Quarkus ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° Spring API, Π·Π° Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° Spring ΠΊΠ°ΠΊ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ MicroProfile API Π² Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½Π°Ρ‚Π° си Ρ€Π°Π±ΠΎΡ‚Π°. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ MicroProfile API, ΠΊΠΎΠΈΡ‚ΠΎ са ΠΏΠΎΠ»Π΅Π·Π½ΠΈ Π·Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° Spring ΠΏΡ€ΠΈ създаванС Π½Π° микроуслуги.

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

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

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

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

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

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

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

Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π΅Π½
Π’Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π΅Π½ ΠΏΡ€ΠΎΠ»Π΅Ρ‚Π΅Π½ Π±ΠΎΡ‚ΡƒΡˆ
Kubernetes

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

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ
Spring Cloud Config
ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈ/Ρ‚Π°ΠΉΠ½ΠΈ

БалансиранС Π½Π° Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅Ρ‚ΠΎ
Π›Π΅Π½Ρ‚Π° (ΠΎΡ‚ страната Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°)
Услуга, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€ Π·Π° рСпликация (ΠΎΡ‚ страната Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π°)

ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π΅ ΠΈ изпълнСниС Π½Π° ΠΊΠΎΠ΄Π° ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°

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

API Π½Π° Spring Framework

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

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

Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΎΡ‚ нашия ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Използва ΠΊΠ°ΠΊΡ‚ΠΎ CDI, Ρ‚Π°ΠΊΠ° ΠΈ Spring Dependency Injection. Π—Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅ информация ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ ΠΏΠΎ Ρ‚Π°Π·ΠΈ Ρ‚Π΅ΠΌΠ° Π²ΠΈΠΆΡ‚Π΅ Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎΡ‚ΠΎ Π½Π° Quarkus, Π½Π°Ρ€Π΅Ρ‡Π΅Π½ΠΎ ΠŸΡ€ΠΎΠ»Π΅Ρ‚Π½ΠΎ Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎ Π·Π° DI.

Π’Π°Π±Π»ΠΈΡ†Π° 2. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π½ΠΈΡ‚Π΅ API Π½Π° Spring DI.

ΠŸΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π½ΠΈ 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 ΠΊΠ°Ρ‚ΠΎ основСн ΠΌΠΎΠ΄Π΅Π» Π·Π° ΡƒΠ΅Π± ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° Spring Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ Π΄ΠΎΠ²ΠΎΠ»Π½ΠΈ ΠΎΡ‚ ΡΠΊΠΎΡ€ΠΎΡˆΠ½Π°Ρ‚Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° 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. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π½ΠΈΡ‚Π΅ Spring Data JPA API са Π΄Π°Π΄Π΅Π½ΠΈ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π° 4.
Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΎΡ‚ нашия ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π˜Π·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ сС API Π½Π° Spring Data JPA ΠΈ ΠΏΠΎΠ²Π΅Ρ‡Π΅ информация Π΅ Π½Π°Π»ΠΈΡ‡Π½Π° Π² нарСчСния ΡƒΡ€ΠΎΠΊ Π½Π° Quarkus Spring Data JPA Π ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎ.

Π’Π°Π±Π»ΠΈΡ†Π° 4. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π½ΠΈ Spring Data JPA API.

ΠŸΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π½ΠΈ Spring Data 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);
}

API Π½Π° MicroProfile

ВолСрантност към Π³Ρ€Π΅ΡˆΠΊΠΈ

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈΡ‚Π΅ Π·Π° толСрантност към Π³Ρ€Π΅ΡˆΠΊΠΈ са ΠΌΠ½ΠΎΠ³ΠΎ Π²Π°ΠΆΠ½ΠΈ Π·Π° прСдотвратяванС Π½Π° каскадни ΠΏΠΎΠ²Ρ€Π΅Π΄ΠΈ ΠΈ създаванС Π½Π° Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΈ микросСрвизни Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΈ. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° Spring ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ ΠΏΡ€Π΅ΠΊΡŠΡΠ²Π°Ρ‡ΠΈ Π·Π° отказоустойчивост ΠΎΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ Π³ΠΎΠ΄ΠΈΠ½ΠΈ. Π₯истрикс. Hystrix ΠΎΠ±Π°Ρ‡Π΅ Π½Π΅ Π΅ Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½ ΠΎΡ‚ дълго Π²Ρ€Π΅ΠΌΠ΅, Π½ΠΎ MicroProfile's Fault Tolerance Π²Π΅Ρ‡Π΅ сС Ρ€Π°Π·Π²ΠΈΠ²Π° Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈ ΠΈΠΌΠ° няколко Π³ΠΎΠ΄ΠΈΠ½ΠΈ производствСна ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π° Π·Π°Π΄ Π³ΡŠΡ€Π±Π° си. Π•Ρ‚ΠΎ Π·Π°Ρ‰ΠΎ, Π·Π° Π΄Π° сС ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΈ надСТдността Π½Π° услугитС Π² Quarkus, сС ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π° Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ API Π·Π° толСрантност към Π³Ρ€Π΅ΡˆΠΊΠΈ Π½Π° MicroProfile, ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΊΠΎΠΈΡ‚ΠΎ са ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π° 5. Π—Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅ информация относно Ρ‚ΠΎΠ²Π° Π²ΠΈΠΆΡ‚Π΅ Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎΡ‚ΠΎ Π½Π° Quarkus Π ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎ Π·Π° толСрантност към Π³Ρ€Π΅ΡˆΠΊΠΈ.

Π’Π°Π±Π»ΠΈΡ†Π° 5. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π½ΠΈ API Π·Π° толСрантност към Π³Ρ€Π΅ΡˆΠΊΠΈ Π½Π° MicroProfile.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π° устойчивост Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π½Π° MicroProfile
описаниС
ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

@Асинхронно

ИзпълнСниС Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ° Π² ΠΎΡ‚Π΄Π΅Π»Π½Π° нишка

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

@Ρ€Π΅Π·Π΅Ρ€Π²Π΅Π½

ИзвикванС Π½Π° Π°Π»Ρ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ° Π² случай Π½Π° ΠΏΠΎΠ²Ρ€Π΅Π΄Π°

@Timeout(500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

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

ΠžΠΏΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΎΡ‚Π½ΠΎΠ²ΠΎ

ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ ΠΎΠΏΠΈΡ‚ ΠΏΡ€ΠΈ Π½Π΅ΡƒΡΠΏΠ΅ΡˆΠ½Π° заявка

@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, ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ТизнСспособността, Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ Π΄Π° провСрява Π΅Π΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ТизнСспособността ΠΈ готовността. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π½ΠΈΡ‚Π΅ API Π½Π° MicroProfile Health са прСдоставСни Π² Ρ‚Π°Π±Π»ΠΈΡ†Π° 6, Π° Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½Π° информация Π΅ прСдоставСна Π² Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎΡ‚ΠΎ Π½Π° Quarkus Π—Π΄Ρ€Π°Π²Π΅Π½ Π½Π°Ρ€ΡŠΡ‡Π½ΠΈΠΊ.

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

Π₯арактСристики Π½Π° MicroProfile Health
описаниС
ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

@Живост

ΠŸΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° рСстартира Π½Π΅ΡƒΡΠΏΠ΅ΡˆΠ½ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ прилоТСния
ΠΊΡ€Π°ΠΉΠ½Π° Ρ‚ΠΎΡ‡ΠΊΠ°:
хост: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). Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° Spring прСдоставят ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Spring Boot Actuator ΠΈ Micrometer. На свой Ρ€Π΅Π΄ Quarkus ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° MicroProfile Metrics, Π·Π° Π΄Π° прСдостави Π±Π°Π·ΠΎΠ²ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ (JVM ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π° систСма), ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° доставчика (Quarkus) ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π·Π° прилоТСния. MicroProfile Metrics изисква ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π΄Π° ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° ΠΈΠ·Ρ…ΠΎΠ΄Π½ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈ JSON ΠΈ OpenMetrics (Prometheus). ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° API Π½Π° MicroProfile Metrics са Π΄Π°Π΄Π΅Π½ΠΈ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π° 7.

Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΎΡ‚ нашия ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠœΠΈΠΊΡ€ΠΎΠΏΡ€ΠΎΡ„ΠΈΠ»Π½ΠΈΡ‚Π΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π·Π° прСдоставянС Π½Π° ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π·Π° прилоТСния. Π—Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅ информация Π²ΠΈΠΆΡ‚Π΅ Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎΡ‚ΠΎ Π½Π° Quarkus Π ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎ Π·Π° ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ.

Π’Π°Π±Π»ΠΈΡ†Π° 7. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° API Π½Π° MicroProfile Metrics.

Π₯арактСристики Π½Π° ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈΡ‚Π΅ Π½Π° 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;
}

@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

Показва Ρ‚Π°ΠΉΠΌΠ΅Ρ€, ΠΊΠΎΠΉΡ‚ΠΎ прослСдява ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΡ‚Π΅Π»Π½ΠΎΡΡ‚Ρ‚Π° Π½Π° Π°Π½ΠΎΡ‚ΠΈΡ€Π°Π½ ΠΎΠ±Π΅ΠΊΡ‚

@Timed(name = "TimedFallback",
   displayName="Timed Fallback",
   description="Fallback delay")
public String salutationFallback() {
   return fallbackSalutation;
}

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

ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Localhost:8080/ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°/ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
Основни ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Localhost:8080/ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°/Π±Π°Π·Π°
ΠŸΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° доставчика Localhost:8080/ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°/доставчик
Всички ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Localhost:8080/ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°

MicroProfile Rest Client

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

Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΎΡ‚ нашия ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° RESTful ΠΊΡ€Π°ΠΉΠ½ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° MicroProfile Rest Client. ΠŸΠΎΠ²Π΅Ρ‡Π΅ информация ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ ΠΏΠΎ Ρ‚Π°Π·ΠΈ Ρ‚Π΅ΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π² Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎΡ‚ΠΎ Π½Π° Quarkus Rest Client Guide.

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

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

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€