Hallo zusammen, und hier ist der dritte Beitrag aus der Serie über Quarkus!
Bei der Entwicklung von Java-Microservices wird oft davon ausgegangen
Etwas detaillierter betrachten wir zunächst den Umfang und die Details, wie Quarkus die Spring-APIs unterstützt, um Spring-Entwicklern zu zeigen, wie sie die MicroProfile-API in ihrer täglichen Arbeit nutzen können. Anschließend sprechen wir über die MicroProfile-API, die für Spring-Entwickler beim Erstellen von Microservices nützlich sein wird.
Warum Quarkus? Erstens handelt es sich dabei um Live-Coding, also um das automatische Nachladen jeglicher Änderungen in der MicroProfile-API, der Spring-API und anderen Java-APIs, das mit nur einem Befehl durchgeführt wird: mvn quarkus:dev. Zweitens, betrachtet in
Wir werden uns nicht mit den Details von MicroProfile befassen, sondern nur versuchen, Spring-Entwicklern zu helfen, zu verstehen, wie Quarkus die Spring-APIs zusammen mit den MicroProfile-APIs verwenden kann.
Container und Kubernetes
Um diesen Artikel nicht zu überladen, werden wir hier nur die allgemeinen Aspekte des Supports behandeln.
Quarkus auch
Und schließlich konzentriert sich Quarkus auf Kubernetes als Zielbereitstellungsumgebung und verwendet keine Java-Frameworks in Fällen, in denen ähnliche Funktionen auf der Ebene der Kubernetes-Plattform selbst implementiert werden. Tabelle 1 bietet eine funktionale Zuordnung zwischen Kubernetes und typischen Java-Frameworks, die von Spring-Entwicklern verwendet werden.
Tabelle 1. Funktionskarte von Java-Frameworks und Kubernetes.
Funktional
Traditioneller Frühlingsstiefel
Kubernetes
Serviceerkennung
Eureka
DNS
Konfiguration
Spring Cloud-Konfiguration
Konfigurationskarten/Geheimnisse
Lastverteilung
Multifunktionsleiste (Clientseite)
Dienst, Replikationscontroller (serverseitig)
Kompilieren und Ausführen des Codes aus dem Beispiel
In diesem Artikel beziehen wir uns auf
Spring Framework-APIs
Abhängigkeitsspritze
Quarkus unterstützt eine Reihe von
В
Tabelle 2. Beispiele für die Verwendung der unterstützten Spring DI-APIs.
Unterstützte Funktionen von Spring DI
Примеры
Konstruktor-Injektion
public PersonSpringController(
PersonSpringRepository personRepository, // injected
PersonSpringMPService personService) { // injected
this.personRepository = personRepository;
this.personService = personService;
}
Feldinjektion
@Autowired
@RestClient
SalutationRestClient salutationRestClient;
@Value("${fallbackSalutation}")
String fallbackSalutation;
@Aufbau
@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-Benutzer werden begeistert sein, dass Quarkus JAX-RS, MicroProfile Rest Client, JSON-P und JSON-B als zentrales Webprogrammiermodell unterstützt. Spring-Entwickler werden sich über die aktuelle Unterstützung der Spring Web API in Quarkus freuen, insbesondere der für REST verantwortlichen Schnittstellen. Ähnlich wie bei Spring DI besteht das Hauptziel der Unterstützung der Spring Web API darin, Spring-Entwicklern die Verwendung der Spring Web APIs zusammen mit den MicroProfile APIs zu ermöglichen. Beispiele für die Verwendung der unterstützten Spring-Web-APIs sind in Tabelle 3 aufgeführt. Weitere Informationen und Beispiele zu diesem Thema finden Sie im Quarkus-Leitfaden namens
Tabelle 3. Beispiele für die Verwendung der unterstützten Spring-Web-APIs.
Unterstützte Funktionen von Spring Web
Примеры
@RestController
@RequestMapping
@RestController
@RequestMapping("/person")
public class PersonSpringController {
...
...
...
}
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@AntwortStatus
@ExceptionHandler
@RestControllerAdvice (teilweise)
@GetMapping(path = "/greet/{id}",
produces = "text/plain")
public String greetPerson(
@PathVariable(name = "id") long id) {
...
...
...
}
Federdaten JPA
MicroProfile-Benutzer werden es auch zu schätzen wissen, dass Quarkus JPA mithilfe des Hibernate ORM unterstützt. Auch für Spring-Entwickler gibt es gute Nachrichten: Quarkus unterstützt gängige Spring Data JPA-Annotationen und -Typen. Beispiele für die Verwendung der unterstützten Spring Data JPA-APIs sind in Tabelle 4 aufgeführt.
В
Tabelle 4. Beispiele für die Verwendung der unterstützten Spring Data JPA-APIs.
Unterstützte Funktionen von Spring Data JPA
Примеры
CrudRepository
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Dokumente
JpaRepository
PagingAndSortingRepository
public class PersonRepository extends
Repository {
Person save(Person entity);
Optional findById(Person entity);
}
Repository-Fragmente
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Abgeleitete Abfragemethoden
public interface PersonRepository extends CrudRepository {
List findByName(String name);
Person findByNameBySsn(String ssn);
Optional
findByNameBySsnIgnoreCase(String ssn);
Boolean existsBookByYearOfBirthBetween(
Integer start, Integer end);
}
Benutzerdefinierte Abfragen
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-APIs
Fehlertoleranz
Fehlertoleranzkonstrukte sind sehr wichtig, um kaskadierende Fehler zu verhindern und robuste Microservice-Architekturen aufzubauen. Federentwickler verwenden seit vielen Jahren Leistungsschalter zur Fehlertoleranz.
Tabelle 5. Beispiele für die von MicroProfile Fault Tolerance unterstützte API-Nutzung.
MicroProfile-Fehlertoleranzfunktionen
Beschreibung
Примеры
@Asynchron
Logik in einem separaten Thread ausführen
@Asynchronous
@Retry
public Future<String> getSalutation() {
...
return future;
}
@Schott
Begrenzung der Anzahl gleichzeitiger Anfragen
@Bulkhead(5)
public void fiveConcurrent() {
makeRemoteCall(); //...
}
@CircuitBreaker
Intelligentes Failover und Failover
@CircuitBreaker(delay=500 // milliseconds
failureRatio = .75,
requestVolumeThreshold = 20,
successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
@zurückgreifen
Im Fehlerfall alternative Logik aufrufen
@Timeout(500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
public String fallback() {
return "hello";
}
Bei fehlgeschlagener Anfrage erneut versuchen
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
Kontroll-Timeout bei Fehler
@Timeout(value = 500 ) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
Dienste prüfen (Service Health)
Kubernetes-Plattformen überwachen den Zustand von Containern mithilfe spezieller Dienste. Damit die zugrunde liegende Plattform Dienste überwachen kann, verwenden Spring-Entwickler normalerweise einen benutzerdefinierten HealthIndicator und Spring Boot Actuator. In Quarkus kann dies mithilfe von MicroProfile Health erfolgen, das standardmäßig eine Liveness-Prüfung durchführt, aber auch so konfiguriert werden kann, dass gleichzeitig Liveness und Bereitschaft (Bereitschaft) überprüft werden. Beispiele für die Verwendung der unterstützten MicroProfile Health-APIs sind in Tabelle 6 aufgeführt. Weitere Informationen finden Sie im Quarkus-Handbuch.
Tabelle 6. Verwendungsbeispiele für unterstützte MicroProfile Health-APIs.
MicroProfile-Gesundheitsfunktionen
Beschreibung
Примеры
@liveness
Die Plattform lädt ausgefallene Containeranwendungen neu
Endpunkt:
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();
}
@Bereitschaft
Die Plattform sendet keinen Datenverkehr an Containeranwendungen, wenn diese nicht bereit sind
Endpunkt:
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();
}
Metriken
Anwendungen stellen Metriken entweder für betriebliche Zwecke (zur Überwachung von Leistungs-SLAs) oder für nicht-operative Zwecke (Geschäfts-SLAs) bereit. Spring-Entwickler stellen Metriken mithilfe von Spring Boot Actuator und Micrometer bereit. Quarkus wiederum verwendet MicroProfile-Metriken, um Basismetriken (JVM und Betriebssystem), Anbietermetriken (Quarkus) und Anwendungsmetriken bereitzustellen. Für MicroProfile Metrics muss die Implementierung die Ausgabeformate JSON und OpenMetrics (Prometheus) unterstützen. Beispiele für die Verwendung der MicroProfile Metrics API sind in Tabelle 7 aufgeführt.
В
Tabelle 7. Beispiele für die Verwendung der MicroProfile Metrics-APIs.
Funktionen von MicroProfile-Metriken
Beschreibung
Примеры
@Counted
Gibt einen Zähler an, der die Anzahl der Aufrufe des mit Anmerkungen versehenen Objekts zählt
@Counted(name = "fallbackCounter",
displayName = "Fallback Counter",
description = "Fallback Counter")
public String salutationFallback() {
return fallbackSalutation;
}
@ConcurrentGauge
Gibt einen Messwert an, der die Anzahl gleichzeitiger Aufrufe des mit Anmerkungen versehenen Objekts zählt
@ConcurrentGuage(
name = "fallbackConcurrentGauge",
displayName="Fallback Concurrent",
description="Fallback Concurrent")
public String salutationFallback() {
return fallbackSalutation;
}
@Messgerät
Gibt ein Messgerät an, das den Wert eines mit Anmerkungen versehenen Objekts misst.
@Metered(name = "FallbackGauge",
displayName="Fallback Gauge",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
@metered
Gibt einen Zähler an, der die Anrufhäufigkeit des mit Anmerkungen versehenen Objekts überwacht
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Eine Anmerkung mit Informationen zu Metadaten, wenn eine Anfrage zum Beitragen oder Erzeugen einer Metrik eingeht
@Metric
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Bezeichnet einen Timer, der die Dauer des mit Anmerkungen versehenen Objekts verfolgt
@Timed(name = "TimedFallback",
displayName="Timed Fallback",
description="Fallback delay")
public String salutationFallback() {
return fallbackSalutation;
}
Metrik-Endpunkte
Anwendungsmetriken
Grundlegende Kennzahlen
Anbieterkennzahlen
Alle Kennzahlen
MicroProfile Rest Client
Microservices stellen häufig RESTful-Endpunkte bereit, für deren Zusammenarbeit entsprechende Client-APIs erforderlich sind. Um RESTful-Endpunkte zu verwenden, verwenden Spring-Entwickler normalerweise RestTemplate. Quarkus bietet für diese Aufgabe MicroProfile Rest Client-APIs an, Beispiele dafür sind in Tabelle 8 aufgeführt.
В
Tabelle 8. Anwendungsbeispiele für die MicroProfile Rest Client-API.
MicroProfile Rest Client-Funktionen
Beschreibung
Примеры
@RegisterRestClient
Registriert eine typisierte Java-Schnittstelle als REST-Client
@RegisterRestClient
@Path("/")
public interface MyRestClient {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getSalutation();
}
@RestClient
Markiert die Injektion einer Instanz einer typisierten REST-Client-Schnittstelle
@Autowired // or @Inject
@RestClient
MyRestClient restClient;
Aufruf
Ruft einen REST-Endpunkt auf
System.out.println(
restClient.getSalutation());
mp-rest/url
Gibt einen REST-Endpunkt an
application.properties:
org.example.MyRestClient/mp-rest/url=
http://localhost:8081/myendpoint
Ergebnisse
In diesem Blog, der sich hauptsächlich an Spring-Entwickler richtet, haben wir kurz untersucht, wie man die Spring-APIs in Quarkus zusammen mit den MicroProfile-APIs verwendet, um Java-Microservices zu entwickeln und sie dann in native Binärdateien zu kompilieren, die Hunderte Megabyte RAM einsparen und in Millisekunden starten.
Wie Sie bereits verstanden haben, finden Sie weitere Informationen zur Unterstützung der Spring- und MicroProfile-APIs sowie viele andere nützliche Informationen in
Source: habr.com