Përshëndetje të gjithëve, ja postimi i tretë në serialin Quarkus!
Gjatë zhvillimit të mikroshërbimeve Java, shpesh besohet se
Me pak më shumë detaje, së pari do të shikojmë shtrirjen dhe detajet se si Quarkus mbështet Spring API-të për t'u treguar zhvilluesve Spring se si të përdorin API-në MicroProfile në punën e tyre të përditshme. Më pas do të mbulojmë API-të e MicroProfile, të cilat janë të dobishme për zhvilluesit e Spring kur krijojnë mikroshërbime.
Pse Quarkus? Së pari, ky është kodim i drejtpërdrejtë, domethënë rimbushje automatike e çdo ndryshimi në MicroProfile API, Spring API dhe API të tjera Java, i cili kryhet vetëm me një komandë: mvn quarkus:dev. Së dyti, konsiderohet në
Ne nuk do të hyjmë në detaje rreth MicroProfile, përveçse të ndihmojmë zhvilluesit e Spring të kuptojnë se si mund të përdorin Spring API me MicroProfile API në Quarkus.
Kontejnerët dhe Kubernetes
Për ta mbajtur këtë artikull të thjeshtë, ne do të mbulojmë vetëm aspektet e nivelit të lartë të mbështetjes këtu.
Kuarkusi gjithashtu
Së fundi, duke u fokusuar në Kubernetes si mjedisi i vendosjes së synuar, Quarkus nuk përdor kornizat Java në rastet kur funksionalitet i ngjashëm zbatohet në nivelin e vetë platformës Kubernetes. Tabela 1 ofron një hartë të korrespondencës funksionale midis Kubernetes dhe kornizave tipike Java të përdorura nga zhvilluesit Spring.
Tabela 1. Harta e korrespondencës funksionale ndërmjet kornizave Java dhe Kubernetes.
funksional
Çizme tradicionale pranverore
Kubernetes
Zbulimi i shërbimit
Eureka
DNS
Konfiguracion
Konfigurimi i resë së pranverës
Konfigurimi i Hartave/Sekreteve
Balancimi i ngarkesës
Shiriti (ana e klientit)
Shërbimi, kontrolluesi i përsëritjes (nga ana e serverit)
Përpilimi dhe ekzekutimi i kodit nga shembulli
Në këtë artikull i referohemi
Spring Framework API
Injeksioni i varësisë
Quarkus mbështet një sërë
В
Tabela 2. Shembuj të përdorimit të API-ve të mbështetura Spring DI.
Karakteristikat e mbështetura të Spring DI
shembuj
Injeksion konstruktor
public PersonSpringController(
PersonSpringRepository personRepository, // injected
PersonSpringMPService personService) { // injected
this.personRepository = personRepository;
this.personService = personService;
}
Injeksion në terren
@Autowired
@RestClient
SalutationRestClient salutationRestClient;
@Value("${fallbackSalutation}")
String fallbackSalutation;
@Konfigurimi
@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;
}
}
Korniza në internet
Përdoruesve të MicroProfile do t'ju pëlqejë që Quarkus mbështet JAX-RS, MicroProfile Rest Client, JSON-P dhe JSON-B si modelin kryesor të programimit në internet. Zhvilluesit e pranverës do të jenë të kënaqur me mbështetjen e fundit të Quarkus për Spring Web API, në veçanti ndërfaqet REST. Ngjashëm me Spring DI, qëllimi kryesor i mbështetjes së Spring Web API është t'u mundësojë zhvilluesve Spring që të përdorin Spring Web API-të në lidhje me API-të MicroProfile. Shembuj të mënyrës se si të përdoren API-të e mbështetura të Spring Web jepen në Tabelën 3, dhe më shumë informacion dhe shembuj mbi këtë temë mund të gjenden në tutorialin e Quarkus të quajtur
Tabela 3. Shembuj të përdorimit të API-ve të mbështetura të Spring Web.
Veçoritë e mbështetura të uebit të pranverës
shembuj
@RestController
@RequestMapping
@RestController
@RequestMapping("/person")
public class PersonSpringController {
...
...
...
}
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (i pjesshëm)
@GetMapping(path = "/greet/{id}",
produces = "text/plain")
public String greetPerson(
@PathVariable(name = "id") long id) {
...
...
...
}
Pranvera e të dhënave JPA
Përdoruesit e MicroProfile do të vlerësojnë gjithashtu që Quarkus mbështet JPA duke përdorur ORM Hibernate. Ka gjithashtu një lajm të mirë për zhvilluesit e Spring: Quarkus mbështet shënimet dhe llojet e zakonshme të Spring Data JPA. Shembuj të përdorimit të API-ve të mbështetura të Spring Data JPA janë dhënë në Tabelën 4.
В
Tabela 4. Shembuj të përdorimit të API-ve të mbështetura të Spring Data JPA.
Karakteristikat e mbështetura të të dhënave të pranverës JPA
shembuj
CrudRepository
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
depo
JpaRepository
Depoja e PagingAndSorting
public class PersonRepository extends
Repository {
Person save(Person entity);
Optional findById(Person entity);
}
Fragmentet e depove
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Metodat e nxjerra të pyetjeve
public interface PersonRepository extends CrudRepository {
List findByName(String name);
Person findByNameBySsn(String ssn);
Optional
findByNameBySsnIgnoreCase(String ssn);
Boolean existsBookByYearOfBirthBetween(
Integer start, Integer end);
}
Pyetjet e përcaktuara nga përdoruesi
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
Toleranca ndaj gabimeve
Strukturat e tolerancës ndaj gabimeve janë shumë të rëndësishme për parandalimin e dështimeve në kaskadë dhe krijimin e arkitekturave të besueshme të mikroshërbimeve. Zhvilluesit e pranverës kanë përdorur ndërprerësit për tolerancën e gabimeve për shumë vite.
Tabela 5. Shembuj të përdorimit të API-ve të mbështetura të MicroProfile Fault Tolerance.
Karakteristikat e tolerancës së gabimeve të mikroprofilit
Përshkrim
shembuj
@Asinkron
Ekzekutimi i logjikës në një thread të veçantë
@Asynchronous
@Retry
public Future<String> getSalutation() {
...
return future;
}
@Bulkhead
Kufizoni numrin e kërkesave të njëkohshme
@Bulkhead(5)
public void fiveConcurrent() {
makeRemoteCall(); //...
}
@CircuitBreaker
Trajtimi i zgjuar i dështimeve dhe rikuperimi nga dështimet
@CircuitBreaker(delay=500 // milliseconds
failureRatio = .75,
requestVolumeThreshold = 20,
successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
@Tërhiqem
Thirrja e logjikës alternative në rast dështimi
@Timeout(500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
public String fallback() {
return "hello";
}
Riprovoni dështimin e kërkesës
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
Koha e kontrollit të dështimit
@Timeout(value = 500 ) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
Kontrollimi i shërbimeve (Shëndeti i Shërbimit)
Platformat Kubernetes monitorojnë shëndetin e kontejnerëve duke përdorur shërbime speciale. Për të lejuar platformën themelore të monitorojë shërbimet, zhvilluesit e Spring zakonisht përdorin një HealthIndicator të personalizuar dhe Spring Boot Actuator. Në Quarkus, kjo mund të bëhet duke përdorur MicroProfile Health, i cili si parazgjedhje kryen një kontroll të gjallërisë, por mund të konfigurohet për të kontrolluar njëkohësisht gjallërinë dhe gatishmërinë. Shembuj se si të përdoren API-të e mbështetura MicroProfile Health jepen në Tabelën 6 dhe informacione shtesë jepen në manualin e Quarkus
Tabela 6: Shembuj përdorimi të API-ve të mbështetura të MicroProfile Health.
Karakteristikat e shëndetit të MicroProfile
Përshkrim
shembuj
@Liveness
Platforma rinis aplikacionet e dështuara të kontejnerizuara
Pika e fundit:
host:8080/shëndet/live
@Liveness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(ready ? true:false)
.withData("mydata", data)
.build();
}
@Gatishmëri
Platforma nuk do të dërgojë trafik në aplikacionet e kontejnerizuar nëse nuk është gati
Pika e fundit:
host:8080/shëndet/gati
@Readiness
public class MyHC implements HealthCheck {
public HealthCheckResponse call() {
...
return HealthCheckResponse
.named("myHCProbe")
.status(live ? true:false)
.withData("mydata", data)
.build();
}
Metrikë
Aplikacionet ofrojnë matje ose për qëllime operacionale (për të monitoruar SLA-të e performancës) ose për qëllime jo-operative (SLA-të e biznesit). Zhvilluesit e pranverës ofrojnë metrikë duke përdorur Actuator dhe Micrometer Spring Boot. Nga ana tjetër, Quarkus përdor MicroProfile Metrics për të siguruar metrikat bazë (JVM dhe sistemi operativ), metrikat e shitësve (Quarkus) dhe metrikat e aplikacionit. MicroProfile Metrics kërkon që zbatimi të mbështesë formatet e daljes JSON dhe OpenMetrics (Prometheus). Shembuj të përdorimit të MicroProfile Metrics API janë dhënë në Tabelën 7.
В
Tabela 7. Shembuj të përdorimit të API-ve të MicroProfile Metrics.
Karakteristikat e Metrikës së MicroProfile
Përshkrim
shembuj
@Numërohen
Tregon një numërues që numëron sa herë është thirrur një objekt i shënuar
@Counted(name = "fallbackCounter",
displayName = "Fallback Counter",
description = "Fallback Counter")
public String salutationFallback() {
return fallbackSalutation;
}
@ConcurrentGauge
Tregon një matës që numëron numrin e thirrjeve të njëkohshme në një objekt të shënuar
@ConcurrentGuage(
name = "fallbackConcurrentGauge",
displayName="Fallback Concurrent",
description="Fallback Concurrent")
public String salutationFallback() {
return fallbackSalutation;
}
@Matës
Tregon një sensor matës që mat vlerën e një objekti të shënuar
@Metered(name = "FallbackGauge",
displayName="Fallback Gauge",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
@Metered
Tregon një sensor njehsor që monitoron frekuencën e thirrjes së një objekti të shënuar
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Një shënim që përmban informacion rreth meta të dhënave kur merret një kërkesë për të futur ose prodhuar një metrikë
@Metric
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Tregon një kohëmatës që gjurmon kohëzgjatjen e një objekti të shënuar
@Timed(name = "TimedFallback",
displayName="Timed Fallback",
description="Fallback delay")
public String salutationFallback() {
return fallbackSalutation;
}
Pikat e fundit të Metrikës
Metrikat e aplikimit
Metrikat bazë
Metrikat e shitësit
Të gjitha metrikat
Klienti i pushimit të MicroProfile
Mikroshërbimet shpesh ofrojnë pika përfundimtare RESTful që kërkojnë API-të përkatëse të klientit për të punuar me të. Për të përdorur pikat fundore RESTful, zhvilluesit e Spring zakonisht përdorin RestTemplate. Quarkus ofron MicroProfile Rest Client API për të zgjidhur këtë problem, shembuj të përdorimit të të cilave janë dhënë në Tabelën 8.
В
Tabela 8. Shembuj të përdorimit të MicroProfile Rest Client API.
Karakteristikat e klientit të pushimit të mikroprofilit
Përshkrim
shembuj
@RegisterRestClient
Regjistron një ndërfaqe Java të shtypur si klient REST
@RegisterRestClient
@Path("/")
public interface MyRestClient {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getSalutation();
}
@RestClient
Shënon zbatimin e një shembulli të një ndërfaqeje klienti të shtypur REST
@Autowired // or @Inject
@RestClient
MyRestClient restClient;
thirrje e muzës
Thërret një pikë fundore REST
System.out.println(
restClient.getSalutation());
mp-rest/url
Përcakton pikën përfundimtare REST
application.properties:
org.example.MyRestClient/mp-rest/url=
http://localhost:8081/myendpoint
Rezultatet e
Në këtë blog, që synon kryesisht zhvilluesit Spring, ne hodhëm një vështrim të shpejtë se si të përdorim API-të Spring me API-të MicroProfile në Quarkus për të zhvilluar mikroshërbime Java dhe më pas për t'i përpiluar ato në kodin binar vendas që kursen qindra megabajt RAM dhe nis në çështje milisekondash.
Siç e keni kuptuar tashmë, më shumë informacion rreth mbështetjes për API-të Spring dhe MicroProfile, si dhe shumë informacione të tjera të dobishme, mund të gjenden në
Burimi: www.habr.com