Hallo allemaal en welkom bij de derde post in de Quarkus-serie!

Bij het ontwikkelen van Java-microservices wordt er vaak vanuit gegaan dat и – dit zijn afzonderlijke en onafhankelijke API’s. Programmeurs gebruiken standaard de API's waar ze al aan gewend zijn, omdat het leren van nieuwe frameworks en runtime-componenten veel tijd kost. Vandaag zullen we proberen de ontwikkeling van enkele populaire en laten zien hoe je zowel de Spring API als nieuwe handige functies tegelijkertijd kunt gebruiken .
We gaan eerst wat uitgebreider in op de omvang 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 introduceren we de MicroProfile API, die handig is voor Spring-ontwikkelaars bij het bouwen van microservices.
Waarom Quarkus? Ten eerste is er sprake van live-codering, dat wil zeggen het automatisch opnieuw laden van alle wijzigingen in de MicroProfile API, Spring API en andere Java API's, wat gebeurt met slechts één opdracht: mvn quarkus:dev. In de tweede plaats degene die in overweging wordt genomen De Person-service (die wordt gecompileerd vanuit de Spring-, MicroProfile- en JPA-API's naar een binair bestand met behulp van een native GraalVM-image) start in slechts 0.055 seconden en neemt ongeveer 90 MB in beslag in het geheugen (RSS) op het RESTful-toepassingseindpunt. Bovendien wordt de compilatie zelf uitgevoerd met slechts één opdracht: mvn package -Pnative.
We gaan niet in op de details van MicroProfile, maar we proberen Spring-ontwikkelaars te helpen begrijpen hoe Spring API's samen met MicroProfile API's in Quarkus kunnen worden gebruikt.
Containers en Kubernetes
Om dit artikel niet te vol te maken, bespreken we hier alleen de belangrijkste aspecten van ondersteuning. , omdat het belangrijk is om te begrijpen. Quarkus wordt gepositioneerd als een Java-stack voor Kubernetes. Het is ontworpen om het geheugenverbruik en de opstarttijd van Java-applicaties en -services te minimaliseren en als gevolg daarvan de dichtheid ervan op de host te vergroten en de totale kosten te verlagen.
Quarkus ook Kubernetes-bronnen en -aanbiedingen over implementatie op Kubernetes- en Red Hat OpenShift-platformen. Daarnaast genereert Quarkus automatisch de bestanden Dockerfile.jvm (JVM-verpakking) en Dockerfile.native (native binaire verpakking) die nodig zijn om containers te maken.
Ten slotte gebruikt Quarkus, door Kubernetes als doelimplementatieomgeving te kiezen, geen Java-frameworks in gevallen waarin vergelijkbare functionaliteit al op het Kubernetes-platformniveau zelf is geïmplementeerd. Tabel 1 biedt een functionele koppeling 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
Configuratiekaarten / Geheimen
Load balancing
Lint (clientzijde)
Service, replicatiecontroller (serverzijde)
De voorbeeldcode compileren en uitvoeren
In dit artikel verwijzen we naar , waar de Spring en MicroProfile API's samen worden gebruikt, en zelfs dezelfde Java-klasse. De code in dit voorbeeld kan worden gecompileerd en uitgevoerd vanaf de opdrachtregel. Zie het bestand README.md voor meer informatie.
Spring Framework API's
Afhankelijkheid injectie
Quarkus ondersteunt een breed scala aan en Spring Dependency Injection (Spring DI) API's. Als u met MicroProfile werkt, , dan bent u al bekend met CDI. Spring-ontwikkelaars kunnen daarentegen de Quarkus Extension voor Spring DI API gebruiken om compatibiliteit met Spring DI te garanderen. Voorbeelden van het gebruik van de ondersteunde Spring DI API's vindt u in Tabel 2.
В Zowel CDI als Spring Dependency Injection worden gebruikt. Meer informatie en voorbeelden over dit onderwerp vindt u in de Quarkus-handleiding genaamd .
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
Gebruikers van MicroProfile zullen het waarderen dat Quarkus JAX-RS, MicroProfile Rest Client, JSON-P en JSON-B ondersteunt als primair webprogrammeermodel. Spring-ontwikkelaars zullen blij zijn om te horen dat Quarkus onlangs ondersteuning heeft toegevoegd voor de Spring Web API, met name de REST-gerelateerde interfaces. Net als bij Spring DI is het hoofddoel van de Spring Web API-ondersteuning om Spring-ontwikkelaars de mogelijkheid te bieden om Spring Web API's te gebruiken in combinatie met MicroProfile API's. Voorbeelden van het gebruik van de ondersteunde Spring Web API's worden gegeven in Tabel 3. Meer informatie en voorbeelden over dit onderwerp vindt u in de Quarkus-handleiding genaamd .
Tabel 3. Voorbeelden van het gebruik van de ondersteunde Spring Web API's.
Ondersteunde functies van Spring Web
Примеры
@RestController
@RequestMapping
@RestController
@RequestMapping("/person")
public class PersonSpringController {
...
...
...
}
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PadVariabele
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (gedeeltelijk)
@GetMapping(path = "/greet/{id}",
produces = "text/plain")
public String greetPerson(
@PathVariable(name = "id") long id) {
...
...
...
}
Lente gegevens JPA
Gebruikers van MicroProfile zullen ook blij zijn met de ondersteuning die Quarkus biedt voor JPA met 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 vindt u in Tabel 4.
В Er wordt gebruik gemaakt van Spring Data JPA API's en meer informatie is beschikbaar in de Quarkus-gids genaamd .
Tabel 4. Voorbeelden van het gebruik van de ondersteunde Spring Data JPA API's.
Spring Data JPA-ondersteunde functies
Примеры
CrudRepository
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
bewaarplaats
JpaRepository
Paging- en sorteringsrepository
public class PersonRepository extends
Repository {
Person save(Person entity);
Optional findById(Person entity);
}
Repository Fragmenten
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 query's
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 essentieel om opeenvolgende fouten te voorkomen en robuuste microservicearchitecturen te bouwen. Spring-ontwikkelaars gebruiken al jaren circuit-breakers voor fouttolerantie . Hystrix is echter al geruime tijd niet meer bijgewerkt, terwijl de Fault Tolerance van MicroProfile momenteel actief in ontwikkeling is en al enkele jaren in productie is. Om de betrouwbaarheid van de services in Quarkus te verbeteren, wordt daarom aanbevolen de MicroProfile Fault Tolerance API's te gebruiken, waarvan voorbeelden in Tabel 5 worden gegeven. Meer informatie hierover vindt u in de Quarkus-handleiding. .
Tabel 5. Voorbeelden van het gebruik van de ondersteunde MicroProfile Fault Tolerance API's.
MicroProfile fouttolerantiefuncties
beschrijving
Примеры
@Asynchronous
Logica uitvoeren in een aparte thread
@Asynchronous
@Retry
public Future<String> getSalutation() {
...
return future;
}
@Bulkhead
Beperking van het aantal gelijktijdige verzoeken
@Bulkhead(5)
public void fiveConcurrent() {
makeRemoteCall(); //...
}
@CircuitBreaker
Slimme storingsafhandeling en storingsherstel
@CircuitBreaker(delay=500 // milliseconds
failureRatio = .75,
requestVolumeThreshold = 20,
successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
@Terugval
Alternatieve logica aanroepen bij een storing
@Timeout(500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
public String fallback() {
return "hello";
}
Opnieuw proberen bij mislukte aanvraag
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
Time-out voor foutbewaking
@Timeout(value = 500 ) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
Service Gezondheidscontrole
Kubernetes-platformen controleren de status van containers met behulp van speciale services. Om het onderliggende platform services te laten monitoren, gebruiken Spring-ontwikkelaars doorgaans een aangepaste HealthIndicator en Spring Boot Actuator. In Quarkus kan dit worden gedaan met MicroProfile Health, dat standaard een liveness-controle uitvoert, maar kan worden geconfigureerd om zowel de liveness als de gereedheid tegelijkertijd te controleren. Voorbeelden van het gebruik van de ondersteunde MicroProfile Health API's vindt u in Tabel 6. Aanvullende informatie vindt u in de Quarkus-handleiding. .
Tabel 6. Voorbeelden van het gebruik van de ondersteunde MicroProfile Health API's.
MicroProfile Health-functies
beschrijving
Примеры
@Liveness
Het platform start kapotte containertoepassingen 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 een containertoepassing als deze nog niet gereed 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
Toepassingen leveren statistieken voor operationele doeleinden (het bewaken van SLA-prestatiegegevens) en voor niet-operationele doeleinden (bedrijfs-SLA-gegevens). Spring-ontwikkelaars leveren meetgegevens met behulp van Spring Boot Actuator en Micrometer. Quarkus gebruikt op zijn beurt MicroProfile Metrics om basismetrieken (JVM en OS), leveranciersmetrieken (Quarkus) en applicatiemetrieken te leveren. Voor MicroProfile Metrics is het vereist dat de implementatie JSON- en OpenMetrics- (Prometheus) uitvoerformaten ondersteunt. Voorbeelden van het gebruik van de MicroProfile Metrics API vindt u in Tabel 7.
В MicroProfile Metrics worden gebruikt om applicatiemetriek te verstrekken. Raadpleeg de Quarkus-handleiding voor meer informatie. .
Tabel 7. Voorbeelden van het gebruik van MicroProfile Metrics API's.
Functies van MicroProfile Metrics
beschrijving
Примеры
@Geteld
Geeft een teller aan die bijhoudt hoe vaak het geannoteerde object wordt aangeroepen.
@Counted(name = "fallbackCounter",
displayName = "Fallback Counter",
description = "Fallback Counter")
public String salutationFallback() {
return fallbackSalutation;
}
@ConcurrentGauge
Geeft een meter aan die het aantal parallelle aanroepen naar het geannoteerde object telt.
@ConcurrentGuage(
name = "fallbackConcurrentGauge",
displayName="Fallback Concurrent",
description="Fallback Concurrent")
public String salutationFallback() {
return fallbackSalutation;
}
@Graadmeter
Geeft een maatstaf aan die de waarde van het geannoteerde object meet.
@Metered(name = "FallbackGauge",
displayName="Fallback Gauge",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
@Metered
Geeft een meter aan die de frequentie van het aanroepen van een geannoteerd object bijhoudt.
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Annotatie met informatie over metagegevens wanneer een verzoek wordt ontvangen om een metrische gegevens 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 het geannoteerde object bijhoudt.
@Timed(name = "TimedFallback",
displayName="Timed Fallback",
description="Fallback delay")
public String salutationFallback() {
return fallbackSalutation;
}
Metriek-eindpunten
Toepassingsmetrieken :8080/metriek/applicatie
Basismetrieken :8080/metriek/basis
Leveranciersstatistieken :8080/metrics/leverancier
Alle statistieken :8080/metriek
MicroProfile Rest-client
Microservices stellen vaak RESTful-eindpunten beschikbaar waarvoor de bijbehorende client-API's moeten worden gebruikt. Om RESTful-eindpunten te gebruiken, gebruiken Spring-ontwikkelaars doorgaans de RestTemplate. Quarkus biedt de MicroProfile Rest Client API-interfaces om dit probleem op te lossen. Voorbeelden van het gebruik hiervan vindt u in Tabel 8.
В RESTful-eindpunten worden gebruikt via MicroProfile Rest Client. Meer informatie en voorbeelden over dit onderwerp vindt u in de Quarkus-handleiding .
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 injectie 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
Geeft een REST-eindpunt op
application.properties:
org.example.MyRestClient/mp-rest/url=
http://localhost:8081/myendpoint
Resultaten van
In deze blog, die voornamelijk bedoeld is voor Spring-ontwikkelaars, hebben we kort gekeken naar hoe Quarkus Spring API's samen met MicroProfile API's gebruikt om Java-microservices te ontwikkelen en deze vervolgens te compileren naar native binaries die honderden megabytes RAM besparen en binnen milliseconden opstarten.
Zoals u kunt zien, kunt u meer informatie over Spring en MicroProfile API-ondersteuning, evenals veel andere nuttige informatie, vinden in .
Bron: www.habr.com
