Pozdrav svima, i dobrodošli u treći post iz serije o Quarkusu!

Prilikom razvoja Java mikroslužbi, često se smatra da i – to su odvojeni i nezavisni API koji se međusobno ne oslanjaju. Po defaultu, programeri obično koriste one API-je koje već poznaju, budući da učenje novih frameworka i runtime komponenti zahteva puno vremena. Danas ćemo pokušati olakšati učenje nekih popularnih i pokazati kako simultano koristiti Spring API i nove korisne mogućnosti. .
Ako malo detaljnije, prvo ćemo razmotriti područje primene i detalje o tome kako Quarkus podržava Spring API, kako bismo pokazali Spring programerima kako mogu primeniti MicroProfile API u svakodnevnom radu. Zatim ćemo govoriti o MicroProfile API-jima koji će imati koristi Spring programerima prilikom izrade mikroslužbi.
Zašto baš Quarkus? Prvo, to je live coding, što znači automatsko ponovno učitavanje svih promena u MicroProfile API, Spring API i drugim Java API-ima, što se izvršava jednom komandom: mvn quarkus:dev. Drugo, u našem uključenju Nećemo se zadržavati na detaljima MicroProfile-a, već ćemo pokušati pomoći Spring programerima da razumeju kako se u Quarkusu mogu koristiti Spring API zajedno sa MicroProfile API-jima.
Kontejneri i Kubernetes
Da ne preopterećujemo ovaj članak, ovde ćemo se fokusirati samo na visoke aspekte podrške
, što je važno razumeti. Quarkus se pozicionira kao Java stack za Kubernetes, ima za cilj minimizirati potrošnju memorije i vreme pokretanja Java aplikacija i usluga, i kao posledicu, povećati gustinu njihovog rasporeda na hostu i smanjiti ukupne troškove. Quarkus takođe
podržava automatsku generaciju za implementaciju na Kubernetes i Red Hat OpenShift platformama. Osim toga, Quarkus automatski generiše Dockerfile.jvm (JVM pakovanje) i Dockerfile.native (nativno binarno pakovanje) datoteke potrebne za izradu kontejnera. za implementaciju na platformama Kubernetes i Red Hat OpenShift. Osim toga, Quarkus automatski generira datoteke Dockerfile.jvm (pakiranje JVM-a) i Dockerfile.native (pakiranje izvorne binarne verzije) potrebne za izradu kontejnera.
I na kraju, oslanjajući se na Kubernetes kao na ciljano okruženje za implementaciju, Quarkus ne koristi Java okvire u slučajevima kada je slična funkcionalnost realizirana na razini same platforme Kubernetes. U tablici 1 prikazana je karta funkcionalnog usklađivanja između Kubernetesa i tipičnih Java okvira koji se koriste od strane Spring programera.
Tablica 1. Karta funkcionalnog usklađivanja Java okvira i Kubernetesa.
Funkcionalnost
Tradicionalni Spring Boot
Kubernetes
Service discovery
Eureka
DNS
Konfiguracija
Spring Cloud Config
Config Maps / Secrets
Balansiranje opterećenja
Ribbon (na strani klijenta)
Servis, Replication Controller (na strani poslužitelja)
Kompilacija i pokretanje koda iz primjera
U ovom članku referiramo se na , gdje se zajedno koriste API sučelja Spring i MicroProfile, pa čak i onaj Java razred. Kod iz ovog primjera može se kompajlirati i pokrenuti iz komandne linije, više informacija potražite u datoteci README.md.
API sučelja Spring Framework
Dependency Injection
Quarkus podržava cijeli niz i API sučelja Spring Dependency Injection (Spring DI). Ako radite s MicroProfileom, , već ste dobro upoznati s CDI. S druge strane, Spring programeri mogu koristiti Quarkus Extension for Spring DI API za osiguranje kompatibilnosti s Spring DI. Primjeri korištenja podržavanih Spring DI API-ja prikazani su u tablici 2.
U koriste se kako CDI, tako i Spring Dependency Injection. Dodatne informacije i primjere na ovu temu možete pronaći u priručniku Quarkus pod nazivom .
Tablica 2. Primjeri korištenja podržavanih API sučelja Spring DI.
Podržane funkcije Spring DI
Primjeri
Constructor Injection
public PersonSpringController(
PersonSpringRepository personRepository, // injected
PersonSpringMPService personService) { // injected
this.personRepository = personRepository;
this.personService = personService;
}
Field Injection
@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;
}
}
Web okvir
Korisnicima MicroProfile bit će drago što Quarkus podržava JAX-RS, MicroProfile Rest Client, JSON-P i JSON-B kao osnovni model za web programiranje. Razvojni programeri koji koriste Spring će se obradovati nedavnom podrškom Spring Web API-a u Quarkusu, posebice za sučelja koja se odnose na REST. Na sličan način kao i kod Spring DI, glavni cilj podrške Spring Web API-u je omogućiti Spring programerima korištenje Spring Web API sučelja zajedno s MicroProfile API sučeljima. Primjeri korištenja podržanih Spring Web API-a prikazani su u Tablici 3, a dodatne informacije i primjere o ovoj temi možete pronaći u Quarkus vodiču pod nazivom .
Tablica 3. Primjeri korištenja podržanih Spring Web API sučelja.
Podržane funkcije Spring Web
Primjeri
@RestController
@RequestMapping
@RestController
@RequestMapping("/person")
public class PersonSpringController {
...
...
...
}
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (djelomično)
@GetMapping(path = "/greet/{id}",
produces = "text/plain")
public String greetPerson(
@PathVariable(name = "id") long id) {
...
...
...
}
Spring Data JPA
Korisnicima MicroProfile također će se svidjeti što Quarkus podržava JPA korištenjem Hibernate ORM-a. Postoji dobra vijest i za Spring programere: Quarkus podržava uobičajene anotacije i tipove Spring Data JPA. Primjeri korištenja podržanih Spring Data JPA API-ja prikazani su u Tablici 4.
U koriste se Spring Data JPA API sučelja, a dodatne informacije dostupne su u Quarkus vodiču pod nazivom .
Tablica 4. Primjeri korištenja podržanih Spring Data JPA API sučelja.
Podržane funkcije Spring Data JPA
Primjeri
CrudRepository
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Repository
JpaRepository
PagingAndSortingRepository
public class PersonRepository extends
Repository {
Person save(Person entity);
Optional findById(Person entity);
}
Repository Fragments
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Derived query methods
public interface PersonRepository extends CrudRepository {
List findByName(String name);
Person findByNameBySsn(String ssn);
Optional
findByNameBySsnIgnoreCase(String ssn);
Boolean existsBookByYearOfBirthBetween(
Integer start, Integer end);
}
User-defined queries
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 sučelja MicroProfile
Otpornost na greške (Fault tolerance)
Konstrukcije otpornosti na greške su vrlo važne za sprečavanje kaskadnih kvarova i stvaranje pouzdanih mikroservisnih arhitektura. Spring programeri već dugi niz godina koriste circuit-breaker-e za otpornost na greške. . Međutim, Hystrix se već dugo nije ažurirao, dok se MicroProfile-ova otpornost na greške aktivno razvija i ima nekoliko godina produkcijskog korišćenja iza sebe. Stoga se za povećanje pouzdanosti servisa u Quarkusu preporučuje primena MicroProfile Fault Tolerance API interfejsa, čiji se primeri korišćenja nalaze u tabeli 5. Dodatne informacije o tome mogu se naći u Quarkus priručniku. .
Tabela 5. Primeri korišćenja podržanih MicroProfile Fault Tolerance API interfejsa.
Funkcije MicroProfile Fault Tolerance
Opis
Primjeri
@Asynchronous
Izvršavanje logike u posebnoj niti
@Asynchronous
@Retry
public Future getSalutation() {
...
return future;
}
@Bulkhead
Ograničenje broja simultanih zahteva
@Bulkhead(5)
public void fiveConcurrent() {
makeRemoteCall(); //...
}
@CircuitBreaker
Pametno upravljanje greškama i oporavak od grešaka
@CircuitBreaker(delay=500 // milisekundi
failureRatio = .75,
requestVolumeThreshold = 20,
successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
@Fallback
Pozivanje alternativne logike u slučaju greške
@Timeout(500) // milisekundi
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
public String fallback() {
return "hello";
}
Ponovo pokušajte u slučaju greške zahteva
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
Vreme čekanja prilikom greške
@Timeout(value = 500) // milisekundi
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
Proveravanje servisa (Service Health)
Kubernetes platforme prate ispravnost kontejnera pomoću specijalizovanih servisa. Da bi niža platforma mogla da nadgleda servise, Spring programeri obično koriste prilagodljive HealthIndicator i Spring Boot Actuator. U Quarkusu to se može učiniti putem MicroProfile Health, koje po defaultu vrše proveru rada (liveness check), ali se mogu konfigurisati da istovremeno proveravaju liveness i readiness (spremnost). Primeri korišćenja podržanih MicroProfile Health API interfejsa nalaze se u tabeli 6, a dodatne informacije su predstavljene u Quarkus priručniku. .
Tabela 6. Primeri korišćenja podržanih MicroProfile Health API interfejsa.
Funkcije MicroProfile Health
Opis
Primjeri
@Liveness
Platforma vrši ponovno pokretanje neispravnih kontejnerizovanih aplikacija
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
Platforma neće slati promet na kontejnerizirane aplikacije u slučaju njihove nespremnosti
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();
}
Metrije
Aplikacije pružaju metrike ili u operativne svrhe (za praćenje SLA performansi), ili u neoperativne (poslovne KPI). Spring programeri pružaju metrike putem Spring Boot Actuator i Micrometer. S druge strane, Quarkus koristi MicroProfile Metrics za pružanje osnovnih metrika (JVM i operativni sustav), vendorskih metrika (Quarkus) i metrika aplikacija. MicroProfile Metrics zahtijeva da implementacija podržava izlazne formate JSON i OpenMetrics (Prometheus). Primjeri korištenja MicroProfile Metrics API prikazani su u tablici 7.
U MicroProfile Metrics koriste se za pružanje metrika aplikacija. Dodatne informacije možete pronaći u vodiču Quarkus .
Tablica 7. Primjeri korištenja MicroProfile Metrics API.
Funkcije MicroProfile Metrics
Opis
Primjeri
@Counted
Označava counter koji broji broj poziva obeleženog objekta
@Counted(name = "fallbackCounter",
displayName = "Fallback Counter",
description = "Fallback Counter")
public String salutationFallback() {
return fallbackSalutation;
}
@ConcurrentGauge
Označava mernu tačku koja broji broj paralelnih poziva obeleženog objekta
@ConcurrentGuage(
name = "fallbackConcurrentGauge",
displayName="Fallback Concurrent",
description="Fallback Concurrent")
public String salutationFallback() {
return fallbackSalutation;
}
@Gauge
Označava mernu tačku koja meri vrednost obeleženog objekta
@Metered(name = "FallbackGauge",
displayName="Fallback Gauge",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
@Metered
Označava mernu tačku koja prati učestalost poziva obeleženog objekta
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Annotation koja sadrži informacije o metapodacima kada stigne zahtev za kreiranje ili proizvodnju metrike
@Metric
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Označava tajmer koji prati trajanje obeleženog objekta
@Timed(name = "TimedFallback",
displayName="Timed Fallback",
description="Fallback delay")
public String salutationFallback() {
return fallbackSalutation;
}
Krajnje točke metrika (Metrics Endpoints)
Metrike aplikacija :8080/metrics/application
Osnovne metrike :8080/metrics/base
Metrike dobavljača :8080/metrics/vendor
Sve metrike :8080/metrics
Rest-klijent MicroProfile
Mikroservisi često pružaju RESTful krajnje točke, za rad s kojima su potrebni odgovarajući klijentski API-ji. Da bi koristili RESTful krajnje točke, Spring developeri obično koriste RestTemplate. Quarkus nudi MicroProfile Rest Client API-je za tu svrhu, a primjeri korištenja su navedeni u Tablici 8.
U Korištenje RESTful krajnjih točaka ostvaruje se pomoću MicroProfile Rest Client-a. Dodatne informacije i primjere na ovu temu možete pronaći u vodiču za Quarkus. .
Tablica 8. Primjeri korištenja MicroProfile Rest Client API-ja.
Funkcije MicroProfile Rest Client
Opis
Primjeri
@RegisterRestClient
Registrira tipizirani Java interfejs kao REST klijent.
@RegisterRestClient
@Path("/")
public interface MyRestClient {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getSalutation();
}
@RestClient
Označava uvođenje instance tipiziranog REST klijent interfejsa.
@Autowired // or @Inject
@RestClient
MyRestClient restClient;
Invokacija
Poziva REST krajnju točku.
System.out.println(
restClient.getSalutation());
mp-rest/url
Postavlja REST krajnju točku.
application.properties:
org.example.MyRestClient/mp-rest/url=
http://localhost:8081/myendpoint
Zaključci
U ovom blogu, koji će prvenstveno biti koristan Spring developerima, ukratko ćemo razmotriti kako koristiti Spring API-je zajedno s MicroProfile API-jima u Quarkusu za razvoj Java mikroservisa i njihovu kompilaciju u nativni binarni kod, što štedi stotine megabajta RAM-a i omogućuje pokretanje u milisekundama.
Kao što ste već shvatili, dodatne informacije o podršci za Spring i MicroProfile API-je, kao i mnogo drugih korisnih informacija možete pronaći u .
Izvor: habr.com
