Hej alle sammen, her er det tredje indlæg i Quarkus-serien!
Når man udvikler Java-mikrotjenester, tror man ofte på det
Lidt mere detaljeret vil vi først se på omfanget og detaljerne om, hvordan Quarkus understøtter Spring API'er for at vise Spring-udviklere, hvordan de bruger MicroProfile API i deres daglige arbejde. Derefter vil vi dække MicroProfile API'erne, som er nyttige for Spring-udviklere, når de opretter mikrotjenester.
Hvorfor Quarkus? For det første er dette live kodning, det vil sige automatisk genindlæsning af eventuelle ændringer i MicroProfile API, Spring API og andre Java API'er, som udføres med kun én kommando: mvn quarkus:dev. For det andet overvejes i
Vi vil ikke gå i detaljer om MicroProfile, bortset fra at hjælpe Spring-udviklere med at forstå, hvordan de kan bruge Spring API'er med MicroProfile API'er i Quarkus.
Containere og Kubernetes
For at holde denne artikel enkel dækker vi kun de høje niveauer af support her.
Quarkus også
Endelig, ved at fokusere på Kubernetes som målimplementeringsmiljøet, bruger Quarkus ikke Java-frameworks i tilfælde, hvor lignende funktionalitet er implementeret på selve Kubernetes-platformens niveau. Tabel 1 giver et kort over den funktionelle korrespondance mellem Kubernetes og typiske Java-frameworks, der bruges af Spring-udviklere.
Tabel 1. Kort over funktionel korrespondance mellem Java frameworks og Kubernetes.
funktionel
Traditionel fjederstøvle
Kubernetes
Service opdagelse
Eureka
DNS
Konfiguration
Spring Cloud Config
Konfigurer kort/hemmeligheder
Lastbalancering
Bånd (klientside)
Service, replikeringscontroller (serverside)
Kompilere og køre koden fra eksemplet
I denne artikel henviser vi til
Spring Framework API'er
Afhængighed Injektion
Quarkus understøtter en række
В
Tabel 2. Eksempler på brug af de understøttede Spring DI API'er.
Understøttede Spring DI-funktioner
Примеры
Konstruktørindsprøjtning
public PersonSpringController(
PersonSpringRepository personRepository, // injected
PersonSpringMPService personService) { // injected
this.personRepository = personRepository;
this.personService = personService;
}
@Autowired
@RestClient
SalutationRestClient salutationRestClient;
@Value("${fallbackSalutation}")
String fallbackSalutation;
@Konfiguration
@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;
}
}
Webramme
MicroProfile-brugere vil elske, at Quarkus understøtter JAX-RS, MicroProfile Rest Client, JSON-P og JSON-B som den primære webprogrammeringsmodel. Spring-udviklere vil være glade for Quarkus' seneste support til Spring Web API, især REST-grænseflader. I lighed med Spring DI er hovedmålet med Spring Web API-support at gøre det muligt for Spring-udviklere at bruge Spring Web API'er sammen med MicroProfile API'er. Eksempler på, hvordan man bruger de understøttede Spring Web API'er, findes i Tabel 3, og flere oplysninger og eksempler om dette emne kan findes i Quarkus tutorial kaldet
Tabel 3. Eksempler på brug af de understøttede Spring Web API'er.
Understøttede forårswebfunktioner
Примеры
@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 DataJPA
MicroProfile-brugere vil også sætte pris på, at Quarkus understøtter JPA ved hjælp af Hibernate ORM. Der er også gode nyheder for Spring-udviklere: Quarkus understøtter almindelige Spring Data JPA-annotationer og -typer. Eksempler på brug af de understøttede Spring Data JPA API'er er givet i tabel 4.
В
Tabel 4. Eksempler på brug af understøttede Spring Data JPA API'er.
Understøttede Spring Data JPA-funktioner
Примеры
CrudRepository
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Repository
JpaRepository
PagingAndSortingRepository
public class PersonRepository extends
Repository {
Person save(Person entity);
Optional findById(Person entity);
}
Depotfragmenter
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Afledte forespørgselsmetoder
public interface PersonRepository extends CrudRepository {
List findByName(String name);
Person findByNameBySsn(String ssn);
Optional
findByNameBySsnIgnoreCase(String ssn);
Boolean existsBookByYearOfBirthBetween(
Integer start, Integer end);
}
Brugerdefinerede forespørgsler
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'er
Fejltolerance
Fejltolerancekonstruktioner er meget vigtige for at forhindre kaskadefejl og skabe pålidelige mikroservicearkitekturer. Fjederudviklere har brugt afbrydere til fejltolerance i mange år.
Tabel 5. Eksempler på brug af understøttede MicroProfile Fault Tolerance API'er.
MicroProfile-fejltolerancefunktioner
beskrivelse
Примеры
@Asynkron
Udfører logik i en separat tråd
@Asynchronous
@Retry
public Future<String> getSalutation() {
...
return future;
}
@Skutter
Begræns antallet af samtidige anmodninger
@Bulkhead(5)
public void fiveConcurrent() {
makeRemoteCall(); //...
}
@Afbryder
Smart fejlhåndtering og genopretning fra fejl
@CircuitBreaker(delay=500 // milliseconds
failureRatio = .75,
requestVolumeThreshold = 20,
successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
@Falde tilbage
Kalder alternativ logik i tilfælde af fejl
@Timeout(500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
public String fallback() {
return "hello";
}
Prøv igen, hvis anmodningen mislykkedes
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
Timeout for fejlkontrol
@Timeout(value = 500 ) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
Tjektjenester (Service Health)
Kubernetes-platforme overvåger containernes tilstand ved hjælp af specielle tjenester. For at give den underliggende platform mulighed for at overvåge tjenester, bruger Spring-udviklere typisk en tilpasset HealthIndicator og Spring Boot Actuator. I Quarkus kan dette gøres ved hjælp af MicroProfile Health, som som standard udfører et liveness-tjek, men kan konfigureres til samtidig at tjekke liveness og parathed. Eksempler på, hvordan du bruger de understøttede MicroProfile Health API'er, findes i tabel 6, og yderligere oplysninger findes i Quarkus-manualen
Tabel 6: Eksempler på brug af understøttede MicroProfile Health API'er.
MicroProfile Health-funktioner
beskrivelse
Примеры
@Livighed
Platformen genstarter mislykkede containeriserede applikationer
Endpoint:
vært:8080/sundhed/live
@Liveness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(ready ? true:false)
.withData("mydata", data)
.build();
}
@Beredskab
Platformen sender ikke trafik til containeriserede applikationer, hvis den ikke er klar
Endpoint:
vært:8080/sundhed/klar
@Readiness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(live ? true:false)
.withData("mydata", data)
.build();
}
Metrics
Applikationer giver målinger til enten operationelle formål (for at overvåge præstations-SLA'er) eller ikke-operative formål (forretnings-SLA'er). Spring-udviklere leverer metrics ved hjælp af Spring Boot Actuator og Micrometer. Til gengæld bruger Quarkus MicroProfile Metrics til at levere baseline-metrics (JVM og operativsystem), leverandør-metrics (Quarkus) og applikations-metrics. MicroProfile Metrics kræver, at implementeringen understøtter JSON og OpenMetrics (Prometheus) outputformater. Eksempler på brug af MicroProfile Metrics API er givet i tabel 7.
В
Tabel 7. Eksempler på brug af MicroProfile Metrics API'er.
MicroProfile Metrics funktioner
beskrivelse
Примеры
@Tællet
Angiver en tæller, der tæller antallet af gange, et kommenteret objekt er blevet kaldt
@Counted(name = "fallbackCounter",
displayName = "Fallback Counter",
description = "Fallback Counter")
public String salutationFallback() {
return fallbackSalutation;
}
@ConcurrentGauge
Angiver en måler, der tæller antallet af samtidige opkald til et kommenteret objekt
@ConcurrentGuage(
name = "fallbackConcurrentGauge",
displayName="Fallback Concurrent",
description="Fallback Concurrent")
public String salutationFallback() {
return fallbackSalutation;
}
@Målestok
Betegner en målersensor, der måler værdien af et kommenteret objekt
@Metered(name = "FallbackGauge",
displayName="Fallback Gauge",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
@Målet
Betegner en målersensor, der overvåger opkaldsfrekvensen for et kommenteret objekt
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
En annotation, der indeholder information om metadata, når der modtages en anmodning om at indtaste eller producere en metrik
@Metric
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Angiver en timer, der sporer varigheden af et kommenteret objekt
@Timed(name = "TimedFallback",
displayName="Timed Fallback",
description="Fallback delay")
public String salutationFallback() {
return fallbackSalutation;
}
Metriske endepunkter
Applikationsmålinger
Grundlæggende målinger
Leverandørmålinger
Alle målinger
MicroProfile Rest Client
Mikrotjenester leverer ofte RESTful-endepunkter, der kræver tilsvarende klient-API'er at arbejde med. For at bruge RESTful-endepunkter bruger Spring-udviklere typisk RestTemplate. Quarkus tilbyder MicroProfile Rest Client API'er til at løse dette problem, eksempler på brug er givet i tabel 8.
В
Tabel 8. Eksempler på brug af MicroProfile Rest Client API'er.
MicroProfile Rest Client-funktioner
beskrivelse
Примеры
@RegisterRestClient
Registrerer en indtastet Java-grænseflade som en REST-klient
@RegisterRestClient
@Path("/")
public interface MyRestClient {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getSalutation();
}
@RestClient
Markerer implementeringen af en forekomst af en indtastet REST-klientgrænseflade
@Autowired // or @Inject
@RestClient
MyRestClient restClient;
Indledningsbøn
Kalder et REST-endepunkt
System.out.println(
restClient.getSalutation());
mp-rest/url
Specificerer REST-slutpunktet
application.properties:
org.example.MyRestClient/mp-rest/url=
http://localhost:8081/myendpoint
Resultaterne af
I denne blog, der primært er rettet mod Spring-udviklere, tog vi et hurtigt kig på, hvordan man bruger Spring API'erne med MicroProfile API'erne i Quarkus til at udvikle Java-mikrotjenester og derefter kompilere dem til indbygget binær kode, der sparer hundredvis af megabyte RAM og lancerer i et spørgsmål om millisekunder.
Som du allerede har forstået, kan du finde flere oplysninger om support til Spring og MicroProfile API'erne samt en masse andre nyttige oplysninger i
Kilde: www.habr.com