Ahoj všem, a zde je třetí příspěvek ze série o Quarkusu!

Při vývoji Java mikroslužeb je často považováno za samozřejmé, že a je sbírka oddělených a na sobě nezávislých API. Vývojáři obvykle používají ty API, na kterých jsou zvyklí, protože osvojení nových rámců a runtime komponentů vyžaduje hodně času. Dnes se pokusíme zjednodušit osvojení některých populárních a ukážeme, jak současně využít Spring API a nové užitečné funkce .
Přesněji řečeno, nejprve si ukážeme, jaký je záběr a detaily, jak Quarkus podporuje Spring API, abychom ukázali Spring vývojářům, jak lze využít MicroProfile API v jejich každodenní práci. Poté se zaměříme na MicroProfile API, které budou pro Spring vývojáře užitečné při vytváření mikroslužeb.
Proč zrovna Quarkus? Za prvé, je tu live coding, tedy automatické opětovné načítání jakýchkoli změn v MicroProfile API, Spring API a dalších Java API, které se provádí jedním příkazem: mvn quarkus:dev. Za druhé, příkladem v služba Person (ta se sestavuje z API rozhraní Spring, MicroProfile a JPA do binárního souboru pomocí nativního obrazu GraalVM) se spustí za pouhých 0,055 sekundy a zabere přibližně 90 MB v operační paměti (RSS) na koncovém bodě aplikace RESTful. Přičemž samotná její kompilace probíhá jedním příkazem: mvn package -Pnative.
Nechceme jít příliš do hloubky ohledně MicroProfile, ale pokusíme se pomoci Spring vývojářům pochopit, jak lze v Quarkusu využít Spring API spolu s MicroProfile API.
Kontejnery a Kubernetes
Abychom tuto příručku nezaplnili příliš podrobnostmi, zaměříme se zde pouze na vysoce úrovňové aspekty podpory , což je důležité si uvědomit. Quarkus je prezentován jako Java stack pro Kubernetes, který má za cíl minimalizovat spotřebu paměti a dobu spuštění Java aplikací a služeb, a tím zvýšit jejich umístění na hostiteli a snížit celkové náklady.
Quarkus také zdrojů Kubernetes a nabízí pro nasazení na platformách Kubernetes a Red Hat OpenShift. Kromě toho Quarkus automaticky generuje soubory Dockerfile.jvm (JVM balení) a Dockerfile.native (nativní binární balení), které jsou potřebné pro vytváření kontejnerů.
A nakonec, zaměřujíc se na Kubernetes jako na cílové prostředí nasazení, Quarkus nepoužívá Java frameworky tam, kde je podobná funkčnost implementována na úrovni samotné platformy Kubernetes. V tabulce 1 je uvedena mapa funkční shody Kubernetes a typických Java frameworků používaných vývojáři Spring.
Tabulka 1. Mapa funkční shody Java frameworků a Kubernetes.
Funkčnost
Tradiční Spring Boot
Kubernetes
Objevování služeb
Eureka
. Vytvořte A-záznam blog a určete pro něj nějakou fiktivní IP (to je oficiální
Konfigurace
Spring Cloud Config
Config Maps / Secrets
Zátěžové vyvažování
Ribbon (na straně klienta)
Služba, Replication Controller (na straně serveru)
Kompilace a spuštění kódu z příkladu
V tomto článku odkazujeme na , kde jsou společně používány API rozhraní Spring a MicroProfile a dokonce i ten samý Java třída. Kód z tohoto příkladu lze zkompilovat a spustit z příkazového řádku, podrobnosti viz soubor README.md.
API rozhraní Spring Framework
Závislostní injekce
Quarkus podporuje řadu a API rozhraní Spring Dependency Injection (Spring DI). Pokud pracujete s MicroProfile, , už jste dobře obeznámeni s CDI. Na druhou stranu, vývojáři Spring mohou použít Quarkus Extension pro Spring DI API, aby zajistili kompatibilitu se Spring DI. Příklady použití podporovaných Spring DI API jsou uvedeny v tabulce 2.
V se používá jak CDI, tak Spring Dependency Injection. Další informace a příklady na toto téma lze nalézt v průvodci Quarkus, který se nazývá .
Tabulka 2. Příklady použití podporovaných API rozhraní Spring DI.
Podporované funkce Spring DI
Příklady
Injekce konstruktoru
public PersonSpringController(
PersonSpringRepository personRepository, // injektováno
PersonSpringMPService personService) { // injektováno
this.personRepository = personRepository;
this.personService = personService;
}
Injekce pole
@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;
}
}
Webový framework
Uživatelé MicroProfile ocení, že Quarkus podporuje JAX-RS, MicroProfile Rest Client, JSON-P a JSON-B jako hlavní model webového programování. Vývojáře Spring potěší nedávno přidaná podpora Spring Web API, zejména pro rozhraní odpovídající REST. Podobně jako u Spring DI je hlavním cílem podpory Spring Web API umožnit vývojářům Spring využívat API rozhraní Spring Web spolu s API rozhraními MicroProfile. Příklady použití podporovaných Spring Web API jsou uvedeny v tabulce 3 a další informace a příklady na toto téma naleznete v příručce Quarkus s názvem .
Tabulka 3. Příklady použití podporovaných API rozhraní Spring Web.
Podporované funkce Spring Web
Příklady
@RestController
@RequestMapping
@RestController
@RequestMapping("/person")
public class PersonSpringController {
...
...
...
}
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (částečně)
@GetMapping(path = "/greet/{id}",
produces = "text/plain")
public String greetPerson(
@PathVariable(name = "id") long id) {
...
...
...
}
Spring Data JPA
Uživatelé MicroProfile také ocení, že Quarkus podporuje JPA pomocí Hibernate ORM. Pro vývojáře Spring je také skvělá zpráva, že Quarkus podporuje běžně používané anotace a typy Spring Data JPA. Příklady použití podporovaných API rozhraní Spring Data JPA jsou uvedeny v tabulce 4.
V používají API rozhraní Spring Data JPA, a další informace jsou dostupné v příručce Quarkus s názvem .
Tabulka 4. Příklady použití podporovaných API rozhraní Spring Data JPA.
Podporované funkce Spring Data JPA
Příklady
CrudRepository
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Repository
JpaRepository
PagingAndSortingRepository
public class PersonRepository extends
Repository {
Person save(Person entity);
Optional findById(Person entity);
}
Fragmenty repository
public interface PersonRepository
extends JpaRepository,
PersonFragment {
...
}
Odvozené metody dotazování
public interface PersonRepository extends CrudRepository {
List findByName(String name);
Person findByNameBySsn(String ssn);
Optional
findByNameBySsnIgnoreCase(String ssn);
Boolean existsBookByYearOfBirthBetween(
Integer start, Integer end);
}
Uživatelsky definované dotazy
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 rozhraní MicroProfile
Odolnost proti chybám
Konstruce tolerance k chybám jsou velmi důležité pro prevenci kaskádových selhání a pro vytváření spolehlivých mikroslužebních architektur. Vývojáři Spring už mnoho let používají pro zajištění spolehlivosti circuit-breakery. . Nicméně Hystrix nebyl dlouho aktualizován, zatímco Fault Tolerance z MicroProfile se v současnosti aktivně vyvíjí a má za sebou už několik let produkčního používání. Proto se doporučuje pro zvýšení spolehlivosti služeb v Quarkusu používat API rozhraní MicroProfile Fault Tolerance, příklady použití jsou uvedeny v tabulce 5. Další informace o tom lze nalézt v průvodci Quarkus. .
Tabulka 5. Příklady použití podporovaných API rozhraní MicroProfile Fault Tolerance.
Funkce MicroProfile Fault Tolerance
Popis
Příklady
@Asynchronous
Provádění logiky v samostatném vlákna.
@Asynchronous
@Retry
public Future getSalutation() {
...
return future;
}
@Bulkhead
Omezení počtu současných požadavků.
@Bulkhead(5)
public void fiveConcurrent() {
makeRemoteCall(); //...
}
@CircuitBreaker
Inteligentní zpracování selhání a obnovení po selhání.
@CircuitBreaker(delay=500 // milisekundy
failureRatio = .75,
requestVolumeThreshold = 20,
successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
@Fallback
Volání alternativní logiky v případě selhání.
@Timeout(500) // milisekundy
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
public String fallback() {
return "hello";
}
Opakování při selhání požadavku.
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
Kontrolní doba čekání při selhání.
@Timeout(value = 500) // milisekundy
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
Kontrola služeb (Service Health)
Platformy Kubernetes sledují stav kontejnerů pomocí speciálních služeb. Aby podkladová platforma mohla monitorovat služby, vývojáři Spring obvykle používají konfigurovatelné HealthIndicator a Spring Boot Actuator. V Quarkusu to lze udělat pomocí MicroProfile Health, které ve výchozím nastavení provádějí kontrolu funkčnosti (liveness check), ale mohou být také nastaveny na současnou kontrolu liveness a readiness (připravenosti). Příklady použití podporovaných API MicroProfile Health jsou uvedeny v tabulce 6, a další informace najdete v průvodci Quarkus. .
Tabulka 6. Příklady použití podporovaných API rozhraní MicroProfile Health.
Funkce MicroProfile Health
Popis
Příklady
@Liveness
Platforma provádí restart nefunkčních kontejnerizovaných aplikací.
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 nebude posílat provoz do kontejnerizovaných aplikací, pokud nejsou připravené.
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();
}
Metriky
Aplikace poskytují metriky buď pro provozní účely (sledování výkonnostních SLA), nebo pro neprovozní (podnikové SLA). Vývojáři Spring poskytují metriky pomocí Spring Boot Actuator a Micrometer. Na druhé straně Quarkus používá MicroProfile Metrics k zajištění základních metrik (JVM a operační systém), metriky dodavatele (Quarkus) a metriky aplikací. MicroProfile Metrics vyžaduje, aby implementace podporovala výstupní formáty JSON a OpenMetrics (Prometheus). Příklady použití API MicroProfile Metrics jsou uvedeny v tabulce 7.
V MicroProfile Metrics se používají k poskytování metrik aplikace. Další informace najdete v příručce Quarkus. .
Tabulka 7. Příklady použití API MicroProfile Metrics.
Funkce MicroProfile Metrics
Popis
Příklady
@Counted
Oz označuje counter, který počítá počet volání anotovaného objektu.
@Counted(name = "fallbackCounter",
displayName = "Fallback Counter",
description = "Fallback Counter")
public String salutationFallback() {
return fallbackSalutation;
}
@ConcurrentGauge
Oz označuje gauge, který počítá počet paralelních volání anotovaného objektu.
@ConcurrentGauge(
name = "fallbackConcurrentGauge",
displayName="Fallback Concurrent",
description="Fallback Concurrent")
public String salutationFallback() {
return fallbackSalutation;
}
@Gauge
Oz označuje gauge, který měří hodnotu anotovaného objektu.
@Metered(name = "FallbackGauge",
displayName="Fallback Gauge",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
@Metered
Oz označuje meter, který sleduje frekvenci volání anotovaného objektu.
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Anotace obsahující informace o metadatech při příjmu požadavku na vytvoření nebo výrobu metriky.
@Metric
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Oz označuje časovač, který sleduje trvání anotovaného objektu.
@Timed(name = "TimedFallback",
displayName="Timed Fallback",
description="Fallback delay")
public String salutationFallback() {
return fallbackSalutation;
}
Koncové body metrik (Metrics Endpoints)
Metriky aplikací :8080/metrics/application
Základní metriky :8080/metrics/base
Vendor metriky :8080/metrics/vendor
Všechny metriky :8080/metrics
Rest klient MicroProfile
Mikroslužby často poskytují koncové body RESTful, pro jejichž použití jsou potřeba odpovídající klientské API. K práci s RESTful koncovými body obvykle vývojáři Spring používají RestTemplate. Quarkus však nabízí pro tento úkol API rozhraní MicroProfile Rest Client, jejichž příklady použití jsou uvedeny v tabulce 8.
V Použití RESTful koncových bodů se provádí pomocí MicroProfile Rest Client. Další informace a příklady naleznete v průvodci Quarkus .
Tabulka 8. Příklady použití API rozhraní MicroProfile Rest Client.
Funkce MicroProfile Rest Client
Popis
Příklady
@RegisterRestClient
Registruje typizované Java rozhraní jako REST klienta
@RegisterRestClient
@Path("/")
public interface MyRestClient {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getSalutation();
}
@RestClient
Oz označuje injekci instance typizovaného rozhraní REST klienta
@Autowired // nebo @Inject
@RestClient
MyRestClient restClient;
Invocation
Volá koncový bod REST
System.out.println(
restClient.getSalutation());
mp-rest/url
Stanoví koncový bod REST
application.properties:
org.example.MyRestClient/mp-rest/url=
http://localhost:8081/myendpoint
Závěry
V tomto blogu, který bude primárně užitečný pro vývojáře Spring, se stručně podíváme na to, jak v Quarkus používat API rozhraní Spring spolu s API rozhraními MicroProfile k vyvíjení mikroslužeb Java a následnému kompilování do nativního binárního kódu, který šetří stovky megabajtů RAM a startuje během několika milisekund.
Jak jste asi pochopili, další informace o podpoře API rozhraní Spring a MicroProfile, stejně jako spoustu dalších užitečných informací, naleznete v .
Zdroj: habr.com
