Hej alla, och hÀr Àr det tredje inlÀgget i serien om Quarkus!

NÀr man utvecklar Java-mikrotjÀnster anses det ofta att och Àr separata och oberoende API:er. Som standard tenderar programmerare att anvÀnda de API:er de redan Àr bekanta med, eftersom det tar tid att lÀra sig nya ramverk och runtime-komponenter. Idag ska vi försöka förenkla inlÀrningen av nÄgra populÀra och vi kommer att visa hur man kan anvÀnda Spring API och nya anvÀndbara funktioner samtidigt. .
Om vi gÄr in lite mer detaljerat, sÄ först ska vi titta pÄ anvÀndningsomrÄdena och detaljerna kring hur Quarkus stöder Spring API:er, för att visa Spring-utvecklare hur de kan anvÀnda MicroProfile API i sitt dagliga arbete. DÀrefter kommer vi att gÄ igenom MicroProfile API som kommer att vara till nytta för Spring-utvecklare vid skapandet av mikrotjÀnster.
Varför just Quarkus? För det första möjliggör det live coding, vilket innebÀr automatisk omstart av alla Àndringar i MicroProfile API, Spring API och andra Java API, och det görs med endast ett kommando: mvn quarkus:dev. För det andra, det vi diskuterar i Person-tjÀnsten (som kompileras frÄn API:erna Spring, MicroProfile och JPA till en binÀr fil med hjÀlp av GraalVM:s inbyggda bild) startar pÄ bara 0,055 sekunder och upptar cirka 90 MB i RAM (RSS) pÄ den RESTful-applikations slutpunkten. SjÀlvklart sÄ görs sjÀlva kompileringen med bara ett kommando: mvn package -Pnative.
Vi ska inte gÄ in pÄ detaljer kring MicroProfile, utan bara försöka hjÀlpa Spring-utvecklare att förstÄ hur API:er frÄn Spring kan anvÀndas tillsammans med MicroProfile API i Quarkus.
Containrar och Kubernetes
För att inte överbelasta den hÀr artikeln kommer vi hÀr bara att gÄ igenom hög-nivÄ aspekter av stödet , eftersom det Àr viktigt att förstÄ. Quarkus marknadsförs som en Java-stack för Kubernetes, som syftar till att minimera minnesanvÀndning och starttider för Java-applikationer och tjÀnster, och dÀrmed öka deras kapacitet i en vÀrd och minska de totala kostnaderna.
Quarkus stöder ocksÄ av Kubernetes-resurser och erbjuder för distribution pÄ Kubernetes-plattformar och Red Hat OpenShift. Dessutom genererar Quarkus automatiskt Dockerfile.jvm (JVM-packaging) och Dockerfile.native (native binary packaging) filer som krÀvs för att skapa containrar.
Och slutligen, med Kubernetes som mÄlmiljö för distribution, anvÀnder Quarkus inte Java-ramverk nÀr motsvarande funktionalitet implementeras pÄ Kubernetes-plattformens nivÄ. Tabell 1 visar en karta över funktionalitetens överensstÀmmelse mellan Kubernetes och typiska Java-ramverk som anvÀnds av Spring-utvecklare.
Tabell 1. Karta över funktionalitetens överensstÀmmelse mellan Java-ramverk och Kubernetes.
Funktionalitet
Traditionell Spring Boot
Kubernetes
TjÀnstupptÀckning
Eureka
DNS
Konfiguration
Spring Cloud Config
Config Maps / Secrets
Lastbalansering
Ribbon (pÄ klientsidan)
TjÀnst, Replication Controller (pÄ serversidan)
Kompilera och kör koden frÄn exemplet
I denna artikel hÀnvisar vi till , dÀr API:erna frÄn bÄde Spring och MicroProfile anvÀnds tillsammans, samt den specifika Java-klassen. Koden frÄn det hÀr exemplet kan kompileras och köras frÄn kommandoraden; se README.md-filen för mer information.
API:er frÄn Spring Framework
Beroendeinjektion
Quarkus stöder en mÀngd olika och API:er för Spring Dependency Injection (Spring DI). Om du arbetar med MicroProfile, , Àr du redan vÀl bekant med CDI. à andra sidan kan Spring-utvecklare anvÀnda Quarkus Extension for Spring DI API för att sÀkerstÀlla kompatibilitet med Spring DI. Exempel pÄ anvÀndning av de stödda Spring DI API:erna ges i Tabell 2.
I anvÀnder bÄde CDI och Spring Dependency Injection. Mer information och exempel om detta finns i Quarkus-guiden som kallas .
Tabell 2. Exempel pÄ anvÀndning av stödda API:er för Spring DI.
Stödda funktioner för Spring DI
Exempel
Konstruktörsinjektion
public PersonSpringController(
PersonSpringRepository personRepository, /// injicerad
PersonSpringMPService personService) { /// injicerad
this.personRepository = personRepository;
this.personService = personService;
}
FĂ€ltinjektion
@Autowired
@RestClient
SalutationRestClient salutationRestClient;
@Value("${fallbackSalutation}")
String fallbackSalutation;
@Configuration
@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;
}
}
Webb-ramverk
MicroProfile-anvÀndare kommer att uppskatta att Quarkus stödjer JAX-RS, MicroProfile Rest Client, JSON-P och JSON-B som sin primÀra modell för webbprogrammering. Spring-utvecklare kommer att bli glada över det nyligen tillagda stödet för Spring Web API i Quarkus, sÀrskilt för de grÀnssnitt som ansvarar för REST. PÄ samma sÀtt som med Spring DI Àr huvudmÄlet med stödet för Spring Web API att Spring-utvecklare ska kunna anvÀnda Spring Web API:er tillsammans med MicroProfile API:er. Exempel pÄ hur de stödda Spring Web API:erna anvÀnds ges i tabell 3, och mer information och exempel om detta finns i Quarkus-guiden som heter .
Tabell 3. Exempel pÄ hur de stödda Spring Web API:erna anvÀnds.
Stödda funktioner för Spring Web
Exempel
@RestController
@RequestMapping
@RestController
@RequestMapping("/person")
public class PersonSpringController {
...
...
...
}
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (delvis)
@GetMapping(path = "/greet/{id}",
produces = "text/plain")
public String greetPerson(
@PathVariable(name = "id") long id) {
...
...
...
}
Spring Data JPA
MicroProfile-anvÀndare kommer ocksÄ att uppskatta att Quarkus stödjer JPA genom Hibernate ORM. För Spring-utvecklare finns det ocksÄ goda nyheter: Quarkus stödjer de vanliga annoteringarna och typerna i Spring Data JPA. Exempel pÄ hur de stödda Spring Data JPA API:erna anvÀnds ges i tabell 4.
I anvÀnds API:er frÄn Spring Data JPA, och mer information finns i Quarkus-guiden som heter .
Tabell 4. Exempel pÄ hur de stödda Spring Data JPA API:erna anvÀnds.
Stödda funktioner för Spring Data JPA
Exempel
CrudRepository
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Repository
JpaRepository
PagingAndSortingRepository
public class PersonRepository extends
Repository {
Person save(Person entity);
Optional findById(Person entity);
}
Repository Fragment
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
HÀrledda frÄgemetoder
public interface PersonRepository extends CrudRepository {
List findByName(String name);
Person findByNameBySsn(String ssn);
Optional
findByNameBySsnIgnoreCase(String ssn);
Boolean existsBookByYearOfBirthBetween(
Integer start, Integer end);
}
AnvÀndardefinierade frÄgor
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:er frÄn MicroProfile
FelsÀkerhet (Fault tolerance)
Funktionalitet för felhantering Àr mycket viktig för att förhindra kaskadfel och skapa pÄlitliga mikrotjÀnstarkitekturer. Spring-utvecklare har under mÄnga Är anvÀnt kretsbrytare för felhantering. . Men Hystrix har inte uppdaterats pÄ lÀnge, medan MicroProfile:s felhantering nu aktivt utvecklas och har flera Ärs produktionserfarenhet bakom sig. DÀrför rekommenderas anvÀndning av MicroProfile Fault Tolerance API:er i Quarkus för att öka tjÀnsternas tillförlitlighet, med exempel som ges i tabell 5. Ytterligare information finns i Quarkus-handboken. .
Tabell 5. Exempel pÄ anvÀndning av stödda MicroProfile Fault Tolerance API:er.
Funktioner för MicroProfile Fault Tolerance
Beskrivning
Exempel
@Asynkron
Utför logik i en separat trÄd
@Asynkron
@Retry
public Future getSalutation() {
...
return future;
}
@Bulkhead
BegrÀnsning av antalet samtidiga förfrÄgningar
@Bulkhead(5)
public void fiveConcurrent() {
makeRemoteCall(); //...
}
@CircuitBreaker
Intelligent felhantering och ÄterhÀmtning efter fel
@CircuitBreaker(delay=500 // millisekunder
failureRatio = .75,
requestVolumeThreshold = 20,
successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
@Fallback
Anropa alternativ logik vid fel
@Timeout(500) // millisekunder
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
public String fallback() {
return "hello";
}
Upprepa vid fel i förfrÄgan
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
Kontrolltid för vÀntan vid fel
@Timeout(value = 500) // millisekunder
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
TjÀnsteövervakning (Service Health)
Kubernetes-plattformar övervakar hÀlsan hos containrar med speciella tjÀnster. För att den underliggande plattformen ska kunna övervaka tjÀnster anvÀnder Spring-utvecklare vanligtvis anpassade HealthIndicator och Spring Boot Actuator. I Quarkus kan detta göras med MicroProfile Health, som som standard utför hÀlsokontroller (liveness check) men ocksÄ kan stÀllas in för att samtidigt kontrollera liveness och readiness (beredskap). Exempel pÄ anvÀndning av stödda MicroProfile Health API:er ges i tabell 6, och ytterligare information finns i Quarkus-handboken. .
Tabell 6. Exempel pÄ anvÀndning av stödda MicroProfile Health API:er.
Funktioner för MicroProfile Health
Beskrivning
Exempel
@Liveness
Plattformen utför omstart av trasiga containrar av applikationer
Endpoint:
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();
}
@Readiness
Plattformen kommer inte att skicka trafik till containeriserade applikationer om de inte Àr redo
Endpoint:
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();
}
MÀtvÀrden
Applikationer tillhandahÄller metrik antingen för operativa syften (för att övervaka SLA-prestanda) eller för icke-operativa (affÀrs-SLA-mÄtt). Spring-utvecklare tillhandahÄller metrik via Spring Boot Actuator och Micrometer. à sin sida anvÀnder Quarkus MicroProfile Metrics för att tillhandahÄlla grundlÀggande metrik (JVM och operativsystem), leverantörsmetrik (Quarkus) och applikationsmetrik. MicroProfile Metrics krÀver att implementeringen stödjer utdataformaten JSON och OpenMetrics (Prometheus). Exempel pÄ anvÀndning av MicroProfile Metrics API finns i tabell 7.
I MicroProfile Metrics anvÀnds för att tillhandahÄlla applikationsmetrik. Mer information finns i Quarkus-handledningen .
Tabell 7. Exempel pÄ anvÀndning av MicroProfile Metrics API.
Funktioner för MicroProfile Metrics
Beskrivning
Exempel
@Counted
Anger en counter som rÀknar antalet anrop pÄ den annoterade objektet
@Counted(name = "fallbackCounter",
displayName = "Fallback Counter",
description = "Fallback Counter")
public String salutationFallback() {
return fallbackSalutation;
}
@ConcurrentGauge
Anger en gauge som rÀknar antalet samtidiga anrop pÄ den annoterade objektet
@ConcurrentGuage(
name = "fallbackConcurrentGauge",
displayName="Fallback Concurrent",
description="Fallback Concurrent")
public String salutationFallback() {
return fallbackSalutation;
}
@Gauge
Anger en gauge som mÀter vÀrdet pÄ den annoterade objektet
@Metered(name = "FallbackGauge",
displayName="Fallback Gauge",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
@Metered
Anger en meter som spÄrar frekvensen av anropet till den annoterade objektet
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Annotation som innehÄller metadata-information nÀr en begÀran om att skapa eller producera en metrik görs
@Metric
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Anger en timer som spÄrar varaktigheten av den annoterade objektet
@Timed(name = "TimedFallback",
displayName="Timed Fallback",
description="Fallback delay")
public String salutationFallback() {
return fallbackSalutation;
}
Metrikslutpunkter (Metrics Endpoints)
Applikationsmetrier :8080/metrics/application
GrundlÀggande metrier :8080/metrics/base
Leverantörsmetrier :8080/metrics/vendor
Alla metrier :8080/metrics
Restklient för MicroProfile
MikrotjÀnster erbjuder ofta RESTful slutanrop som krÀver motsvarande klient-API:er. För att anvÀnda RESTful slutanrop tillÀmpar Spring-utvecklare vanligtvis RestTemplate. Quarkus erbjuder istÀllet MicroProfile Rest Client API:er, vars exempel finns i tabell 8.
I anvÀndningen av RESTful slutanrop görs med MicroProfile Rest Client. Mer information och exempel hittar du i Quarkus-handboken .
Tabell 8. Exempel pÄ anvÀndning av MicroProfile Rest Client API:er.
Funktioner i MicroProfile Rest Client
Beskrivning
Exempel
@RegisterRestClient
Registrerar ett typat Java-grÀnssnitt som en REST-klient
@RegisterRestClient
@Path("/")
public interface MyRestClient {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getSalutation();
}
@RestClient
Markerar en instans av det typade REST-klientgrÀnssnittet för injektion
@Autowired // or @Inject
@RestClient
MyRestClient restClient;
Anrop
Anropar REST-slutpunkten
System.out.println(
restClient.getSalutation());
mp-rest/url
Anger REST-slutpunkten
application.properties:
org.example.MyRestClient/mp-rest/url=
http://localhost:8081/myendpoint
Sammanfattning
I den hÀr bloggen, som frÀmst Àr till nytta för Spring-utvecklare, har vi kortfattat gÄtt igenom hur Quarkus anvÀnder API:erna frÄn Spring tillsammans med MicroProfiles API:er för att utveckla Java-mikrotjÀnster och sedan kompilera dem till nativa binÀrkod som sparar hundratals megabyte RAM och startar pÄ nÄgra millisekunder.
Som du redan har förstÄtt, finns det mer information om stödet för Spring- och MicroProfile-API:er samt mycket annan nyttig information i .
KĂ€lla: habr.com
