Pozdrav svima, evo trećeg posta u seriji Quarkus!
Pri razvoju Java mikroservisa često se vjeruje da
S malo više detalja, prvo ćemo pogledati opseg i detalje o tome kako Quarkus podržava Spring API-je kako bismo pokazali Spring programerima kako koristiti MicroProfile API u svom svakodnevnom radu. Zatim ćemo pokriti MicroProfile API-je, koji su korisni za Spring programere pri stvaranju mikroservisa.
Zašto Quarkus? Prvo, radi se o live kodiranju, odnosno automatskom ponovnom učitavanju bilo kakvih promjena u MicroProfile API-ju, Spring API-ju i drugim Java API-jima, koje se izvodi samo jednom naredbom: mvn quarkus:dev. Drugo, smatra se u
Nećemo ulaziti u detalje o MicroProfileu, osim da pomognemo Spring programerima da razumiju kako mogu koristiti Spring API-je s MicroProfile API-jima u Quarkusu.
Kontejneri i Kubernetes
Kako bi ovaj članak bio jednostavan, ovdje ćemo pokriti samo aspekte podrške na visokoj razini.
Quarkus također
Konačno, fokusirajući se na Kubernetes kao ciljano okruženje za implementaciju, Quarkus ne koristi Java okvire u slučajevima kada je slična funkcionalnost implementirana na razini same Kubernetes platforme. Tablica 1 prikazuje mapu funkcionalne korespondencije između Kubernetesa i tipičnih Java okvira koje koriste Spring programeri.
Tablica 1. Karta funkcionalne korespondencije između Java frameworka i Kubernetesa.
funkcionalna
Tradicionalna proljetna čizma
Kubernetes
Otkrivanje usluge
Eureka
DNS
konfiguracija
Spring Cloud Config
Konfigurirajte karte/tajne
Balansiranje opterećenja
Vrpca (strana klijenta)
Usluga, kontroler replikacije (strana poslužitelja)
Prevođenje i pokretanje koda iz primjera
U ovom članku se pozivamo na
API-ji Spring Framework
Injekcija ovisnosti
Quarkus podržava niz
В
Tablica 2. Primjeri korištenja podržanih Spring DI API-ja.
Podržane Spring DI značajke
Primjeri
Injekcija konstruktora
public PersonSpringController(
PersonSpringRepository personRepository, // injected
PersonSpringMPService personService) { // injected
this.personRepository = personRepository;
this.personService = personService;
}
Injekcija polja
@Autowired
@RestClient
SalutationRestClient salutationRestClient;
@Value("${fallbackSalutation}")
String fallbackSalutation;
@Konfiguracija
@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;
}
}
Web okvir
Korisnicima MicroProfilea će se svidjeti što Quarkus podržava JAX-RS, MicroProfile Rest Client, JSON-P i JSON-B kao primarni model web programiranja. Spring programeri bit će zadovoljni Quarkusovom nedavnom podrškom za Spring Web API, posebno REST sučelja. Slično Spring DI-ju, glavni cilj podrške za Spring Web API je omogućiti Spring programerima da koriste Spring Web API-je u kombinaciji s MicroProfile API-jima. Primjeri korištenja podržanih Spring Web API-ja navedeni su u tablici 3, a više informacija i primjera o ovoj temi možete pronaći u Quarkus tutorialu pod nazivom
Tablica 3. Primjeri korištenja podržanih Spring Web API-ja.
Podržane Spring Web značajke
Primjeri
@RestController
@RequestMapping
@RestController
@RequestMapping("/person")
public class PersonSpringController {
...
...
...
}
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@Zaglavlje zahtjeva
@MatrixVariable
@Varijabla puta
@CookieValue
@Tijelo zahtjeva
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (djelomično)
@GetMapping(path = "/greet/{id}",
produces = "text/plain")
public String greetPerson(
@PathVariable(name = "id") long id) {
...
...
...
}
Proljetni podaci JPA
Korisnici MicroProfilea također će cijeniti to što Quarkus podržava JPA koristeći Hibernate ORM. Postoje i dobre vijesti za programere Springa: Quarkus podržava uobičajene JPA komentare i tipove Spring Data. Primjeri korištenja podržanih Spring Data JPA API-ja navedeni su u tablici 4.
В
Tablica 4. Primjeri korištenja podržanih Spring Data JPA API-ja.
Podržane Spring Data JPA značajke
Primjeri
CrudRepository
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
skladište
JpaRepository
PagingAndSortingRepository
public class PersonRepository extends
Repository {
Person save(Person entity);
Optional findById(Person entity);
}
Fragmenti spremišta
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Izvedene metode upita
public interface PersonRepository extends CrudRepository {
List findByName(String name);
Person findByNameBySsn(String ssn);
Optional
findByNameBySsnIgnoreCase(String ssn);
Boolean existsBookByYearOfBirthBetween(
Integer start, Integer end);
}
Korisnički definirani upiti
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-ji
Tolerancija kvarova
Konstrukti tolerancije na pogreške vrlo su važni za sprječavanje kaskadnih kvarova i stvaranje pouzdanih arhitektura mikroservisa. Programeri opruga već dugi niz godina koriste prekidače za otpornost na greške.
Tablica 5. Primjeri korištenja podržanih MicroProfile Fault Tolerance API-ja.
MicroProfile značajke otpornosti na pogreške
Opis
Primjeri
@Asinkrono
Izvršavanje logike u zasebnoj niti
@Asynchronous
@Retry
public Future<String> getSalutation() {
...
return future;
}
@Pregrada
Ograničite broj istodobnih zahtjeva
@Bulkhead(5)
public void fiveConcurrent() {
makeRemoteCall(); //...
}
@Osigurač
Pametno rukovanje kvarovima i oporavak od kvarova
@CircuitBreaker(delay=500 // milliseconds
failureRatio = .75,
requestVolumeThreshold = 20,
successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
@Zamjena
Pozivanje alternativne logike u slučaju kvara
@Timeout(500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
public String fallback() {
return "hello";
}
Pokušaj ponovo ako zahtjev nije uspio
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
Istek kontrole neuspjeha
@Timeout(value = 500 ) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
Provjera usluga (zdravlje usluge)
Kubernetes platforme prate ispravnost spremnika pomoću posebnih usluga. Kako bi temeljnoj platformi omogućili praćenje usluga, Spring programeri obično koriste prilagođeni HealthIndicator i Spring Boot Actuator. U Quarkusu se to može učiniti pomoću MicroProfile Healtha, koji prema zadanim postavkama obavlja provjeru živosti, ali se može konfigurirati da istovremeno provjerava živost i spremnost. Primjeri korištenja podržanih MicroProfile Health API-ja navedeni su u Tablici 6, a dodatne informacije u Quarkus priručniku
Tablica 6: Primjeri korištenja podržanih MicroProfile Health API-ja.
Značajke MicroProfile Health
Opis
Primjeri
@Živahnost
Platforma ponovno pokreće neuspjele kontejnerske aplikacije
Krajnja točka:
domaćin:8080/zdravlje/uživo
@Liveness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(ready ? true:false)
.withData("mydata", data)
.build();
}
@Spremnost
Platforma neće slati promet aplikacijama u kontejnerima ako nije spremna
Krajnja točka:
domaćin:8080/zdravlje/spreman
@Readiness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(live ? true:false)
.withData("mydata", data)
.build();
}
Metrika
Aplikacije pružaju metriku bilo za operativne svrhe (za praćenje izvedbe SLA-ova) bilo za neoperativne svrhe (poslovni SLA-ovi). Programeri Springa pružaju metriku koristeći Spring Boot Actuator i Micrometer. Zauzvrat, Quarkus koristi MicroProfile Metrics za pružanje osnovne metrike (JVM i operativni sustav), metrike dobavljača (Quarkus) i metrike aplikacija. MicroProfile Metrics zahtijeva da implementacija podržava izlazne formate JSON i OpenMetrics (Prometheus). Primjeri korištenja API-ja MicroProfile Metrics navedeni su u tablici 7.
В
Tablica 7. Primjeri korištenja API-ja MicroProfile Metrics.
Značajke metrike mikroprofila
Opis
Primjeri
@Prebrojano
Označava brojač brojača koji broji koliko je puta označeni objekt pozvan
@Counted(name = "fallbackCounter",
displayName = "Fallback Counter",
description = "Fallback Counter")
public String salutationFallback() {
return fallbackSalutation;
}
@ConcurrentGauge
Označava mjerač koji broji broj istodobnih poziva označenom objektu
@ConcurrentGuage(
name = "fallbackConcurrentGauge",
displayName="Fallback Concurrent",
description="Fallback Concurrent")
public String salutationFallback() {
return fallbackSalutation;
}
@Mjerač
Označava mjerni senzor koji mjeri vrijednost označenog objekta
@Metered(name = "FallbackGauge",
displayName="Fallback Gauge",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
@Dozirano
Označava senzor mjerača koji prati frekvenciju poziva označenog objekta
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Bilješka koja sadrži informacije o metapodacima kada se primi zahtjev za unos ili izradu metrike
@Metric
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Označava mjerač vremena koji prati trajanje označenog objekta
@Timed(name = "TimedFallback",
displayName="Timed Fallback",
description="Fallback delay")
public String salutationFallback() {
return fallbackSalutation;
}
Krajnje točke metrike
Mjerila aplikacije
Osnovna metrika
Mjerni podaci dobavljača
Sve metrike
MicroProfile Rest Client
Mikrousluge često pružaju RESTful krajnje točke koje zahtijevaju odgovarajuće klijentske API-je za rad. Za korištenje RESTful krajnjih točaka, Spring programeri obično koriste RestTemplate. Quarkus nudi MicroProfile Rest Client API-je za rješavanje ovog problema, čiji su primjeri korištenja dati u tablici 8.
В
Tablica 8. Primjeri korištenja MicroProfile Rest Client API-ja.
Značajke MicroProfile Rest klijenta
Opis
Primjeri
@RegisterRestClient
Registrira upisano Java sučelje kao REST klijent
@RegisterRestClient
@Path("/")
public interface MyRestClient {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getSalutation();
}
@RestClient
Označava implementaciju instance tipiziranog sučelja REST klijenta
@Autowired // or @Inject
@RestClient
MyRestClient restClient;
prizivanje
Poziva REST krajnju točku
System.out.println(
restClient.getSalutation());
mp-ostatak/url
Određuje REST krajnju točku
application.properties:
org.example.MyRestClient/mp-rest/url=
http://localhost:8081/myendpoint
Rezultati
U ovom blogu, namijenjenom prvenstveno Spring programerima, brzo smo pogledali kako koristiti Spring API-je s MicroProfile API-jima u Quarkusu za razvoj Java mikroservisa i zatim ih prevesti u izvorni binarni kod koji štedi stotine megabajta RAM-a i pokreće se u pitanje milisekundi.
Kao što ste već shvatili, više informacija o podršci za API-je Spring i MicroProfile, kao i mnoge druge korisne informacije, možete pronaći u
Izvor: www.habr.com