Sveiki visiem, lÅ«k, treÅ”ais ieraksts Quarkus sÄrijÄ!
IzstrÄdÄjot Java mikropakalpojumus, bieži tiek uzskatÄ«ts, ka
Nedaudz detalizÄtÄk mÄs vispirms apskatÄ«sim tvÄrumu un informÄciju par to, kÄ Quarkus atbalsta Spring API, lai parÄdÄ«tu Spring izstrÄdÄtÄjiem, kÄ ikdienas darbÄ izmantot MicroProfile API. PÄc tam apskatÄ«sim MicroProfile API, kas noder Spring izstrÄdÄtÄjiem, veidojot mikropakalpojumus.
KÄpÄc Quarkus? PirmkÄrt, tÄ ir reÄllaika kodÄÅ”ana, tas ir, automÄtiska visu MicroProfile API, Spring API un citu Java API izmaiÅu pÄrlÄdÄÅ”ana, kas tiek veikta tikai ar vienu komandu: mvn quarkus:dev. OtrkÄrt, apspriests
MÄs neiedziļinÄsimies sÄ«kÄk par MicroProfile, izÅemot to, lai palÄ«dzÄtu Spring izstrÄdÄtÄjiem saprast, kÄ viÅi var izmantot Spring API ar MicroProfile API Quarkus.
Konteineri un Kubernetes
Lai Å”is raksts bÅ«tu vienkÄrÅ”s, mÄs Å”eit apskatÄ«sim tikai augsta lÄ«meÅa atbalsta aspektus.
Kvarkus arī
Visbeidzot, koncentrÄjoties uz Kubernetes kÄ mÄrÄ·a izvietoÅ”anas vidi, Quarkus neizmanto Java ietvarus gadÄ«jumos, kad lÄ«dzÄ«ga funkcionalitÄte tiek ieviesta paÅ”as Kubernetes platformas lÄ«menÄ«. 1. tabulÄ ir sniegta funkcionÄlÄs atbilstÄ«bas karte starp Kubernetes un tipiskÄm Java ietvariem, ko izmanto Spring izstrÄdÄtÄji.
1. tabula. FunkcionÄlÄs atbilstÄ«bas karte starp Java ietvariem un Kubernetes.
FunkcionÄls
TradicionÄlie pavasara zÄbaki
Kubernetes
Pakalpojuma atklÄÅ”ana
Eureka
DNS
KonfigurÄcija
Pavasara mÄkoÅa konfigurÄcija
KonfigurÄt kartes/noslÄpumus
Slodzes līdzsvaroŔana
Lente (klienta pusÄ)
Pakalpojums, replikÄcijas kontrolieris (servera puse)
Koda kompilÄÅ”ana un palaiÅ”ana no piemÄra
Å ajÄ rakstÄ mÄs atsaucamies uz
Spring Framework API
Atkarības injekcija
Quarkus atbalsta virkni
Š
2. tabula. AtbalstÄ«to Spring DI API izmantoÅ”anas piemÄri.
AtbalstÄ«tÄs pavasara DI funkcijas
piemÄri
Konstruktora iesmidzinÄÅ”ana
public PersonSpringController(
PersonSpringRepository personRepository, // injected
PersonSpringMPService personService) { // injected
this.personRepository = personRepository;
this.personService = personService;
}
Lauka injekcija
@Autowired
@RestClient
SalutationRestClient salutationRestClient;
@Value("${fallbackSalutation}")
String fallbackSalutation;
@KonfigurÄcija
@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;
}
}
Tīmekļa ietvars
MicroProfile lietotÄjiem patiks, ka Quarkus atbalsta JAX-RS, MicroProfile Rest Client, JSON-P un JSON-B kÄ primÄro tÄ«mekļa programmÄÅ”anas modeli. Pavasara izstrÄdÄtÄji bÅ«s apmierinÄti ar Quarkus neseno atbalstu Spring Web API, jo Ä«paÅ”i REST saskarnÄm. LÄ«dzÄ«gi kÄ Spring DI, galvenais Spring Web API atbalsta mÄrÄ·is ir ļaut Spring izstrÄdÄtÄjiem izmantot Spring Web API kopÄ ar MicroProfile API. PiemÄri, kÄ izmantot atbalstÄ«tÄs Spring Web API, ir sniegti 3. tabulÄ, un vairÄk informÄcijas un piemÄrus par Å”o tÄmu var atrast Quarkus apmÄcÄ«bÄ ar nosaukumu
3. tabula. AtbalstÄ«to Spring Web API izmantoÅ”anas piemÄri.
AtbalstÄ«tÄs pavasara tÄ«mekļa funkcijas
piemÄri
@RestController
@RequestMapping
@RestController
@RequestMapping("/person")
public class PersonSpringController {
...
...
...
}
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (daļÄja)
@GetMapping(path = "/greet/{id}",
produces = "text/plain")
public String greetPerson(
@PathVariable(name = "id") long id) {
...
...
...
}
Pavasara datu JPA
MicroProfile lietotÄji arÄ« novÄrtÄs, ka Quarkus atbalsta JPA, izmantojot hibernate ORM. Ir arÄ« labas ziÅas Spring izstrÄdÄtÄjiem: Quarkus atbalsta izplatÄ«tÄs Spring Data JPA anotÄcijas un veidus. AtbalstÄ«to Spring Data JPA API izmantoÅ”anas piemÄri ir sniegti 4. tabulÄ.
Š
4. tabula. AtbalstÄ«to Spring Data JPA API izmantoÅ”anas piemÄri.
AtbalstÄ«tÄs Spring Data JPA funkcijas
piemÄri
CrudRepository
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
KrÄtuve
JpaRepozitorijs
PagingAndSortingRepository
public class PersonRepository extends
Repository {
Person save(Person entity);
Optional findById(Person entity);
}
Repozitorija fragmenti
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
AtvasinÄtÄs vaicÄjumu metodes
public interface PersonRepository extends CrudRepository {
List findByName(String name);
Person findByNameBySsn(String ssn);
Optional
findByNameBySsnIgnoreCase(String ssn);
Boolean existsBookByYearOfBirthBetween(
Integer start, Integer end);
}
LietotÄja definÄti vaicÄjumi
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
Kļūdu tolerance
Kļūdu tolerances konstrukcijas ir ļoti svarÄ«gas, lai novÄrstu kaskÄdes atteices un izveidotu uzticamas mikropakalpojumu arhitektÅ«ras. Pavasara izstrÄdÄtÄji jau daudzus gadus ir izmantojuÅ”i slÄdžus, lai nodroÅ”inÄtu kļūdu toleranci.
5. tabula. AtbalstÄ«to MicroProfile kļūdu tolerances API izmantoÅ”anas piemÄri.
Mikroprofila kļūdu tolerances līdzekļi
Apraksts
piemÄri
@Asinhroni
LoÄ£ikas izpilde atseviÅ”Ä·Ä pavedienÄ
@Asynchronous
@Retry
public Future<String> getSalutation() {
...
return future;
}
@Bulkhead
Ierobežojiet vienlaicīgu pieprasījumu skaitu
@Bulkhead(5)
public void fiveConcurrent() {
makeRemoteCall(); //...
}
@CircuitBreaker
Gudra kļūmju apstrÄde un atkopÅ”anÄs no kļūmÄm
@CircuitBreaker(delay=500 // milliseconds
failureRatio = .75,
requestVolumeThreshold = 20,
successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
@AtkÄpties
AlternatÄ«vas loÄ£ikas izsaukÅ”ana neveiksmes gadÄ«jumÄ
@Timeout(500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
public String fallback() {
return "hello";
}
Ja pieprasÄ«jums neizdodas, mÄÄ£iniet vÄlreiz
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
Atteices kontroles taimauts
@Timeout(value = 500 ) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
PÄrbaudes pakalpojumi (pakalpojuma veselÄ«ba)
Kubernetes platformas uzrauga konteineru stÄvokli, izmantojot Ä«paÅ”us pakalpojumus. Lai pamata platforma varÄtu pÄrraudzÄ«t pakalpojumus, Spring izstrÄdÄtÄji parasti izmanto pielÄgotu HealthIndicator un Spring Boot Actuator. ProgrammÄ Quarkus to var izdarÄ«t, izmantojot MicroProfile Health, kas pÄc noklusÄjuma veic dzÄ«vÄ«guma pÄrbaudi, taÄu to var konfigurÄt, lai vienlaikus pÄrbaudÄ«tu dzÄ«vÄ«gumu un gatavÄ«bu. AtbalstÄ«to MicroProfile Health API lietoÅ”anas piemÄri ir sniegti 6. tabulÄ, un papildu informÄcija ir sniegta Quarkus rokasgrÄmatÄ.
6. tabula. AtbalstÄ«to MicroProfile Health API lietoÅ”anas piemÄri.
MicroProfile Health funkcijas
Apraksts
piemÄri
@Dzīvīgums
Platforma atsÄknÄ konteinerizÄtÄs lietojumprogrammas
Galapunkts:
saimnieks:8080/veselība/tieŔraide
@Liveness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(ready ? true:false)
.withData("mydata", data)
.build();
}
@Gatavība
Platforma nenosÅ«tÄ«s trafiku uz konteinerizÄtajÄm lietojumprogrammÄm, ja tÄ nav gatava
Galapunkts:
saimniekdators:8080/veselība/gatavs
@Readiness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(live ? true:false)
.withData("mydata", data)
.build();
}
Metrika
Lietojumprogrammas nodroÅ”ina metriku gan darbÄ«bas mÄrÄ·iem (veiktspÄjas SLA pÄrraudzÄ«bai), gan neekspluatÄcijas mÄrÄ·iem (biznesa SLA). Pavasara izstrÄdÄtÄji nodroÅ”ina metriku, izmantojot Spring Boot Actuator un Micrometer. SavukÄrt Quarkus izmanto MicroProfile Metrics, lai nodroÅ”inÄtu bÄzes metriku (JVM un operÄtÄjsistÄmu), piegÄdÄtÄju metriku (Quarkus) un lietojumprogrammu metriku. MicroProfile Metrics pieprasa, lai ievieÅ”ana atbalstÄ«tu JSON un OpenMetrics (Prometheus) izvades formÄtus. MicroProfile Metrics API izmantoÅ”anas piemÄri ir sniegti 7. tabulÄ.
Š
7. tabula. MicroProfile Metrics API izmantoÅ”anas piemÄri.
Mikroprofila metrikas līdzekļi
Apraksts
piemÄri
@Saskaitīts
ApzÄ«mÄ skaitÄ«tÄju, kas uzskaita, cik reižu anotÄts objekts ir izsaukts
@Counted(name = "fallbackCounter",
displayName = "Fallback Counter",
description = "Fallback Counter")
public String salutationFallback() {
return fallbackSalutation;
}
@ConcurrentGauge
ApzÄ«mÄ mÄrÄ«tÄju, kas skaita vienlaicÄ«gu izsaukumu skaitu anotÄtam objektam
@ConcurrentGuage(
name = "fallbackConcurrentGauge",
displayName="Fallback Concurrent",
description="Fallback Concurrent")
public String salutationFallback() {
return fallbackSalutation;
}
@Gauge
ApzÄ«mÄ mÄrinstrumentu sensoru, kas mÄra anotÄta objekta vÄrtÄ«bu
@Metered(name = "FallbackGauge",
displayName="Fallback Gauge",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
@Metered
ApzÄ«mÄ skaitÄ«tÄja sensoru, kas uzrauga anotÄta objekta izsaukuma biežumu
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
AnotÄcija, kas satur informÄciju par metadatiem, kad tiek saÅemts pieprasÄ«jums ievadÄ«t vai izveidot metriku
@Metric
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
NorÄda taimeri, kas izseko anotÄtÄ objekta ilgumu
@Timed(name = "TimedFallback",
displayName="Timed Fallback",
description="Fallback delay")
public String salutationFallback() {
return fallbackSalutation;
}
Metrikas galapunkti
Lietojumprogrammu rÄdÄ«tÄji
Pamata rÄdÄ«tÄji
PÄrdevÄja rÄdÄ«tÄji
Visi rÄdÄ«tÄji
MicroProfile Rest Client
Mikropakalpojumi bieži nodroÅ”ina RESTful galapunktus, ar kuriem darbam ir nepiecieÅ”amas atbilstoÅ”as āāklientu API. Lai izmantotu RESTful galapunktus, Spring izstrÄdÄtÄji parasti izmanto RestTemplate. Å Ä«s problÄmas risinÄÅ”anai Quarkus piedÄvÄ MicroProfile Rest Client API, kuru izmantoÅ”anas piemÄri ir sniegti 8. tabulÄ.
Š
8. tabula. MicroProfile Rest Client API izmantoÅ”anas piemÄri.
MicroProfile Rest klienta funkcijas
Apraksts
piemÄri
@RegisterRestClient
ReÄ£istrÄ drukÄtu Java interfeisu kÄ REST klientu
@RegisterRestClient
@Path("/")
public interface MyRestClient {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getSalutation();
}
@RestClient
AtzÄ«mÄ drukÄta REST klienta interfeisa gadÄ«juma ievieÅ”anu
@Autowired // or @Inject
@RestClient
MyRestClient restClient;
UzaicinÄjums
Izsauc REST galapunktu
System.out.println(
restClient.getSalutation());
mp-rest/url
NorÄda REST galapunktu
application.properties:
org.example.MyRestClient/mp-rest/url=
http://localhost:8081/myendpoint
RezultÄti
Å ajÄ emuÄrÄ, kas galvenokÄrt paredzÄts Spring izstrÄdÄtÄjiem, mÄs Ä«si apskatÄ«jÄm, kÄ izmantot Spring API ar MicroProfile API programmÄ Quarkus, lai izstrÄdÄtu Java mikropakalpojumus un pÄc tam tos apkopotu vietÄjÄ binÄrajÄ kodÄ, kas ietaupa simtiem megabaitu RAM un tiek palaists milisekundes jautÄjums.
KÄ jau sapratÄt, vairÄk informÄcijas par atbalstu Spring un MicroProfile API, kÄ arÄ« daudz citas noderÄ«gas informÄcijas var atrast
Avots: www.habr.com