Wie Quarkus MicroProfile und Spring kombiniert

Hallo zusammen, und hier ist der dritte Beitrag aus der Serie über Quarkus!

Wie Quarkus MicroProfile und Spring kombiniert

Bei der Entwicklung von Java-Microservices wird oft davon ausgegangen Eclipse-Mikroprofil и Frühlingsstiefel sind separate und unabhängige APIs. Standardmäßig neigen Programmierer dazu, die APIs zu verwenden, an die sie bereits gewöhnt sind, da das Erlernen neuer Frameworks und Laufzeitkomponenten zeitaufwändig ist. Heute werden wir versuchen, die Entwicklung einiger beliebter zu vereinfachen MicroProfile-API für Spring-Entwickler und zeigen, wie man die Spring API und neue nützliche Funktionen gleichzeitig nutzt Quark.

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 unser Beispiel Der Person-Dienst (er kompiliert mithilfe des nativen GraalVM-Images von Spring-, MicroProfile- und JPA-APIs in Binärdateien) startet in nur 0.055 Sekunden und verbraucht etwa 90 MB RAM (RSS) auf dem RESTful-Anwendungsendpunkt. Darüber hinaus wird die Kompilierung selbst mit nur einem Befehl durchgeführt: mvn package -Pnative.

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. Kubernetesweil es wichtig ist zu verstehen. Quarkus ist als Java-Stack für Kubernetes positioniert. Er soll den Speicherverbrauch und die Startzeit von Java-Anwendungen und -Diensten minimieren und dadurch deren Dichte auf dem Host erhöhen und die Gesamtkosten senken.

Quarkus auch unterstützt die automatische Generierung Kubernetes-Ressourcen und -Angebote Führer für die Bereitstellung auf Kubernetes- und Red Hat OpenShift-Plattformen. Darüber hinaus generiert Quarkus automatisch die Dateien Dockerfile.jvm (JVM-Verpackung) und Dockerfile.native (native Binärverpackung), die zum Erstellen von Containern erforderlich sind.

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 Beispielprojekt, wo die Spring- und MicroProfile-APIs gemeinsam genutzt werden, und sogar dieselbe Java-Klasse. Der Code in diesem Beispiel kann über die Befehlszeile kompiliert und ausgeführt werden. Weitere Informationen finden Sie in der Datei README.md.

Spring Framework-APIs

Abhängigkeitsspritze

Quarkus unterstützt eine Reihe von Kontext- und Dependency-Injection-APIs (CDI). und die Spring Dependency Injection (Spring DI) APIs. Wenn Sie mit MicroProfile arbeiten, Java EE und Jakarta EE, Sie sind bereits mit CDI vertraut. Andererseits können Spring-Entwickler die Quarkus-Erweiterung für die Spring DI-API verwenden, um mit Spring DI kompatibel zu sein. Beispiele für die Verwendung der unterstützten Spring DI-APIs sind in Tabelle 2 aufgeführt.

В Projekt aus unserem Beispiel Wird sowohl von CDI als auch von Spring Dependency Injection verwendet. Weitere Informationen und Beispiele zu diesem Thema finden Sie im Quarkus-Leitfaden namens Spring DI Guide.

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
Automatisch verkabelt
Wert

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Bohne
@Aufbau

@Configuration
public class AppConfiguration {
   @Bean(name = "capitalizeFunction")
   public StringFunction capitalizer() {
      return String::toUpperCase;
   }
}

Komponente

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

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 Frühlings-Web-Guide.

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.
В Projekt aus unserem Beispiel verwendet die Spring Data JPA-APIs. Weitere Informationen finden Sie im Quarkus-Handbuch mit dem Titel Spring Data JPA-Leitfaden.

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. Hystrix. Hystrix wurde jedoch schon lange nicht mehr aktualisiert, aber die Fehlertoleranz von MicroProfile wird jetzt aktiv weiterentwickelt und hat mehrere Jahre Produktionseinsatz hinter sich. Um die Zuverlässigkeit der Dienste in Quarkus zu verbessern, wird daher empfohlen, die MicroProfile-Fehlertoleranz-APIs zu verwenden. Beispiele hierfür finden Sie in Tabelle 5. Weitere Informationen hierzu finden Sie im Quarkus-Handbuch. Leitfaden 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";
}

Wiederholen

Bei fehlgeschlagener Anfrage erneut versuchen

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

Timeout

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. Gesundheitsführer.

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.

В Projekt aus unserem Beispiel MicroProfile-Metriken werden zur Bereitstellung von Anwendungsmetriken verwendet. Weitere Informationen finden Sie im Quarkus-Guide Metrischer Leitfaden.

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

Metrisch

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

Zeitgesteuert

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 localhost:8080/Metriken/Anwendung
Grundlegende Kennzahlen localhost:8080/Metriken/Basis
Anbieterkennzahlen localhost:8080/Metriken/Anbieter
Alle Kennzahlen localhost:8080/Metriken

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.

В Projekt aus unserem Beispiel Die Verwendung von RESTful-Endpunkten erfolgt mit dem MicroProfile Rest Client. Weitere Informationen und Beispiele zu diesem Thema finden Sie im Quarkus-Leitfaden Rest-Client-Handbuch.

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 Quarkus-Handbücher.

Source: habr.com

Kommentar hinzufügen