Hallo allemaal, hier is het derde bericht in de Quarkus-serie!
Bij het ontwikkelen van Java-microservices wordt dat vaak gedacht
In wat meer detail zullen we eerst kijken naar de reikwijdte en details van hoe Quarkus Spring API's ondersteunt om Spring-ontwikkelaars te laten zien hoe ze de MicroProfile API in hun dagelijkse werk kunnen gebruiken. Vervolgens bespreken we de MicroProfile API's, die handig zijn voor Spring-ontwikkelaars bij het maken van microservices.
Waarom Quarkus? Ten eerste is dit live codering, dat wil zeggen het automatisch opnieuw laden van eventuele wijzigingen in de MicroProfile API, Spring API en andere Java API's, die wordt uitgevoerd met slechts één opdracht: mvn quarkus:dev. In de tweede plaats besproken in
We zullen niet in detail ingaan op MicroProfile, behalve om Spring-ontwikkelaars te helpen begrijpen hoe ze Spring API's kunnen gebruiken met MicroProfile API's in Quarkus.
Containers en Kubernetes
Om dit artikel eenvoudig te houden, bespreken we hier alleen de hogere aspecten van ondersteuning.
Quarkus ook
Door zich te concentreren op Kubernetes als de beoogde implementatieomgeving, maakt Quarkus ten slotte geen gebruik van Java-frameworks in gevallen waarin vergelijkbare functionaliteit wordt geïmplementeerd op het niveau van het Kubernetes-platform zelf. Tabel 1 geeft een kaart van de functionele correspondentie tussen Kubernetes en typische Java-frameworks die door Spring-ontwikkelaars worden gebruikt.
Tabel 1. Kaart van functionele correspondentie tussen Java-frameworks en Kubernetes.
functioneel
Traditionele lentelaars
Kubernetes
Service ontdekken
Eureka
DNS
Configuratie
Spring Cloud-configuratie
Kaarten/geheimen configureren
Load balancing
Lint (clientzijde)
Service, replicatiecontroller (serverzijde)
Het compileren en uitvoeren van de code uit het voorbeeld
In dit artikel verwijzen wij naar
Spring Framework-API's
Afhankelijkheid injectie
Quarkus ondersteunt een reeks van
В
Tabel 2. Voorbeelden van het gebruik van de ondersteunde Spring DI API's.
Ondersteunde Spring DI-functies
Примеры
Constructor-injectie
public PersonSpringController(
PersonSpringRepository personRepository, // injected
PersonSpringMPService personService) { // injected
this.personRepository = personRepository;
this.personService = personService;
}
Veldinjectie
@Autowired
@RestClient
SalutationRestClient salutationRestClient;
@Value("${fallbackSalutation}")
String fallbackSalutation;
@Configuratie
@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;
}
}
Webframework
MicroProfile-gebruikers zullen het geweldig vinden dat Quarkus JAX-RS, MicroProfile Rest Client, JSON-P en JSON-B ondersteunt als het primaire webprogrammeermodel. Spring-ontwikkelaars zullen blij zijn met de recente ondersteuning van Quarkus voor de Spring Web API, in het bijzonder REST-interfaces. Net als bij Spring DI is het belangrijkste doel van Spring Web API-ondersteuning om Spring-ontwikkelaars in staat te stellen Spring Web API's te gebruiken in combinatie met MicroProfile API's. Voorbeelden van het gebruik van de ondersteunde Spring Web API's vindt u in Tabel 3, en meer informatie en voorbeelden over dit onderwerp kunt u vinden in de Quarkus-tutorial genaamd
Tabel 3. Voorbeelden van het gebruik van de ondersteunde Spring Web API's.
Ondersteunde Spring Web-functies
Примеры
@RestController
@RequestMapping
@RestController
@RequestMapping("/person")
public class PersonSpringController {
...
...
...
}
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariabele
@PathVariabele
@CookieWaarde
@RequestBody
@ReactieStatus
@ExceptionHandler
@RestControllerAdvice (gedeeltelijk)
@GetMapping(path = "/greet/{id}",
produces = "text/plain")
public String greetPerson(
@PathVariable(name = "id") long id) {
...
...
...
}
Lente gegevens JPA
MicroProfile-gebruikers zullen het ook waarderen dat Quarkus JPA ondersteunt met behulp van de Hibernate ORM. Er is ook goed nieuws voor Spring-ontwikkelaars: Quarkus ondersteunt algemene Spring Data JPA-annotaties en -typen. Voorbeelden van het gebruik van de ondersteunde Spring Data JPA API's worden gegeven in Tabel 4.
В
Tabel 4. Voorbeelden van het gebruik van ondersteunde Spring Data JPA API's.
Ondersteunde Spring Data JPA-functies
Примеры
CrudRepository
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
bewaarplaats
JpaRepository
PagingAndSortingRepository
public class PersonRepository extends
Repository {
Person save(Person entity);
Optional findById(Person entity);
}
Bewaarplaatsfragmenten
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Afgeleide querymethoden
public interface PersonRepository extends CrudRepository {
List findByName(String name);
Person findByNameBySsn(String ssn);
Optional
findByNameBySsnIgnoreCase(String ssn);
Boolean existsBookByYearOfBirthBetween(
Integer start, Integer end);
}
Door de gebruiker gedefinieerde zoekopdrachten
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-API's
Fouttolerantie
Fouttolerantieconstructies zijn erg belangrijk voor het voorkomen van trapsgewijze fouten en het creëren van betrouwbare microservice-architecturen. Spring-ontwikkelaars gebruiken al jaren stroomonderbrekers voor fouttolerantie.
Tabel 5. Voorbeelden van het gebruik van ondersteunde MicroProfile Fault Tolerance API's.
MicroProfile-fouttolerantiefuncties
beschrijving
Примеры
@Asynchroon
Logica uitvoeren in een aparte thread
@Asynchronous
@Retry
public Future<String> getSalutation() {
...
return future;
}
@ Schot
Beperk het aantal gelijktijdige verzoeken
@Bulkhead(5)
public void fiveConcurrent() {
makeRemoteCall(); //...
}
@Zekering
Slimme storingsafhandeling en herstel na storingen
@CircuitBreaker(delay=500 // milliseconds
failureRatio = .75,
requestVolumeThreshold = 20,
successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
@Terugvallen
Alternatieve logica oproepen in geval van een storing
@Timeout(500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
public String fallback() {
return "hello";
}
Opnieuw proberen na mislukte aanvraag
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
Time-out voor foutcontrole
@Timeout(value = 500 ) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
Services controleren (Servicestatus)
Kubernetes-platforms monitoren de gezondheid van containers met behulp van speciale services. Om het onderliggende platform in staat te stellen services te monitoren, gebruiken Spring-ontwikkelaars doorgaans een aangepaste HealthIndicator en Spring Boot Actuator. In Quarkus kan dit worden gedaan met behulp van MicroProfile Health, dat standaard een liveness-check uitvoert, maar kan worden geconfigureerd om tegelijkertijd de liveness en gereedheid te controleren. Voorbeelden van het gebruik van de ondersteunde MicroProfile Health API's vindt u in Tabel 6, en aanvullende informatie vindt u in de Quarkus-handleiding
Tabel 6: Gebruiksvoorbeelden van ondersteunde MicroProfile Health API's.
MicroProfile Health-functies
beschrijving
Примеры
@Levendigheid
Het platform start mislukte containerapplicaties opnieuw op
eindpunt:
host:8080/gezondheid/live
@Liveness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(ready ? true:false)
.withData("mydata", data)
.build();
}
@Gereedheid
Het platform stuurt geen verkeer naar gecontaineriseerde applicaties als het er niet klaar voor is
eindpunt:
host:8080/gezondheid/klaar
@Readiness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(live ? true:false)
.withData("mydata", data)
.build();
}
statistieken
Applicaties bieden statistieken voor operationele doeleinden (om prestatie-SLA's te bewaken) of voor niet-operationele doeleinden (zakelijke SLA's). Spring-ontwikkelaars bieden statistieken met behulp van Spring Boot Actuator en Micrometer. Op zijn beurt gebruikt Quarkus MicroProfile Metrics om basisgegevens (JVM en besturingssysteem), leveranciersstatistieken (Quarkus) en applicatiestatistieken te leveren. MicroProfile Metrics vereist dat de implementatie de uitvoerformaten JSON en OpenMetrics (Prometheus) ondersteunt. Voorbeelden van het gebruik van de MicroProfile Metrics API worden gegeven in Tabel 7.
В
Tabel 7. Voorbeelden van het gebruik van MicroProfile Metrics-API's.
Functies voor microprofielstatistieken
beschrijving
Примеры
@geteld
Geeft een teller aan die het aantal keren telt dat een geannoteerd object is aangeroepen
@Counted(name = "fallbackCounter",
displayName = "Fallback Counter",
description = "Fallback Counter")
public String salutationFallback() {
return fallbackSalutation;
}
@ConcurrentGauge
Geeft een meter aan die het aantal gelijktijdige oproepen naar een geannoteerd object telt
@ConcurrentGuage(
name = "fallbackConcurrentGauge",
displayName="Fallback Concurrent",
description="Fallback Concurrent")
public String salutationFallback() {
return fallbackSalutation;
}
@Graadmeter
Geeft een metersensor aan die de waarde van een geannoteerd object meet
@Metered(name = "FallbackGauge",
displayName="Fallback Gauge",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
@Metered
Geeft een metersensor aan die de oproepfrequentie van een geannoteerd object bewaakt
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Een annotatie met informatie over metagegevens wanneer een verzoek wordt ontvangen om een metriek in te voeren of te produceren
@Metric
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Geeft een timer aan die de duur van een geannoteerd object bijhoudt
@Timed(name = "TimedFallback",
displayName="Timed Fallback",
description="Fallback delay")
public String salutationFallback() {
return fallbackSalutation;
}
Eindpunten van statistieken
Applicatiestatistieken
Basisstatistieken
Leverancierstatistieken
Alle statistieken
MicroProfile Rest-client
Microservices bieden vaak RESTful-eindpunten waarvoor overeenkomstige client-API's nodig zijn om mee te werken. Om RESTful-eindpunten te gebruiken, gebruiken Spring-ontwikkelaars doorgaans RestTemplate. Quarkus biedt MicroProfile Rest Client API's aan om dit probleem op te lossen; voorbeelden van gebruik hiervan worden gegeven in Tabel 8.
В
Tabel 8. Voorbeelden van het gebruik van MicroProfile Rest Client API's.
MicroProfile Rest Client-functies
beschrijving
Примеры
@RegisterRestClient
Registreert een getypte Java-interface als een REST-client
@RegisterRestClient
@Path("/")
public interface MyRestClient {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getSalutation();
}
@RestClient
Markeert de implementatie van een exemplaar van een getypte REST-clientinterface
@Autowired // or @Inject
@RestClient
MyRestClient restClient;
Aanroeping
Roept een REST-eindpunt aan
System.out.println(
restClient.getSalutation());
mp-rest/url
Specificeert het REST-eindpunt
application.properties:
org.example.MyRestClient/mp-rest/url=
http://localhost:8081/myendpoint
Resultaten van
In deze blog, die vooral gericht is op Spring-ontwikkelaars, hebben we kort gekeken hoe je de Spring API's met de MicroProfile API's in Quarkus kunt gebruiken om Java-microservices te ontwikkelen en deze vervolgens te compileren in native binaire code die honderden megabytes RAM bespaart en in een kwestie van milliseconden.
Zoals u al heeft begrepen, kunt u meer informatie over ondersteuning voor de Spring- en MicroProfile-API's, evenals veel andere nuttige informatie, vinden in
Bron: www.habr.com