Pozdravljeni vsi, to je tretji prispevek v seriji o Quarkusu!

Pri razvijanju Java mikroservisov se pogosto smatra, da in – to so ločeni in neodvisni API-ji. Običajno programerji uporabljajo tiste API-je, ki so jim znani, saj učenje novih ogrodij in komponent za izvajanje zahteva veliko časa. Danes bomo poskusili poenostaviti usvajanje nekaterih priljubljenih in pokazali, kako hkrati uporabiti Spring API in nove uporabne možnosti. .
Če nekoliko podrobneje, bomo najprej obravnavali področje uporabe in podrobnosti o tem, kako Quarkus podpira Spring API-je, da bomo pokazali Spring razvijalcem, kako lahko uporabljajo MicroProfile API v svojem vsakdanjem delu. Potem bomo predstavili MicroProfile API-je, ki bodo koristni Spring razvijalcem pri ustvarjanju mikroservisov.
Zakaj prav Quarkus? Prvič, to je live coding, torej samodejno ponovno nalaganje vseh sprememb v MicroProfile API-jih, Spring API-jih in drugih Java API-jih, kar se izvede z eno samo ukazom: mvn quarkus:dev. Drugič, obravnavamo storitev Person (ta se sestavi iz Spring, MicroProfile in JPA API-jev v binarno datoteko z uporabo nativne slike GraalVM) se zažene v samo 0,055 sekunde in zasede približno 90 MB pomnilnika (RSS) na končni točki RESTful aplikacije. Njena kompilacija pa se izvede z eno samo ukazom: mvn package -Pnative.
Ne bomo se poglabljali v podrobnosti MicroProfile, ampak se bomo trudili, da pomagamo Spring razvijalcem razumeti, kako uporabiti Spring API-je skupaj z MicroProfile API-ji v Quarkusu.
Kontejnerji in Kubernetes
Da ne bi preobremenili tega članka, bomo tukaj obravnavali le višje ravni vidike podpore , saj je to pomembno razumeti. Quarkus se pozicionira kot Java kup za Kubernetes, ki minimizira porabo pomnilnika in čas zagona Java aplikacij in storitev, hkrati pa povečuje gostoto njihovega nameščanja na gostitelju in zmanjšuje skupne stroške.
Quarkus prav tako Kubernetes virov in ponuja za uvajanje na platformah Kubernetes in Red Hat OpenShift. Poleg tega Quarkus samodejno generira datoteke Dockerfile.jvm (JVM pakiranje) in Dockerfile.native (pakiranje nativne binarne slike), potrebne za ustvarjanje kontejnerjev.
In conclusion, focusing on Kubernetes as the target deployment environment, Quarkus does not use Java frameworks in cases where similar functionality is implemented at the Kubernetes platform level itself. Table 1 presents a functional mapping of Kubernetes and typical Java frameworks used by Spring developers.
Table 1. Functional mapping of Java frameworks and Kubernetes.
Functionality
Traditional Spring Boot
Kubernetes
Service discovery
Eureka
DNS
Konfiguracija
Spring Cloud Config
Config Maps / Secrets
Porazdelitev obremenitve
Ribbon (client-side)
Service, Replication Controller (server-side)
Compiling and running the example code
In this article, we refer to , where the Spring and MicroProfile APIs are used together and even that very Java class. The code from this example can be compiled and run from the command line; see the README.md file for more details.
Spring Framework APIs
Dependency Injection
Quarkus supports a wide range of and Spring Dependency Injection (Spring DI) APIs. If you are working with MicroProfile, , you are already well acquainted with CDI. On the other hand, Spring developers can use the Quarkus Extension for Spring DI API to ensure compatibility with Spring DI. Examples of using supported Spring DI APIs are provided in Table 2.
V uses both CDI and Spring Dependency Injection. More information and examples on this topic can be found in the Quarkus guide called .
Table 2. Examples of using supported Spring DI APIs.
Supported features of Spring DI
Primeri
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 framework
Uporabnikom MicroProfile bo všeč, da Quarkus podpira JAX-RS, MicroProfile Rest Client, JSON-P in JSON-B kot osnovni model za spletno programiranje. Razvijalce v Springu bo razveselila nedavno dodana podpora Quarkusa za Spring Web API, zlasti za vmesnike, ki skrbijo za REST. Po analogiji s Spring DI je glavni cilj podpore Spring Web API omogočiti razvijalcem Springa, da uporabljajo API vmesnike Spring Web skupaj z API vmesniki MicroProfile. Primeri uporabe podprtih Spring Web API so navedeni v tabeli 3, dodatne informacije in primeri pa so na voljo v vodniku Quarkus, ki nosi naziv .
Tabela 3. Primeri uporabe podprtih API vmesnikov Spring Web.
Podprte funkcionalnosti Spring Web
Primeri
@RestController
@RequestMapping
@RestController
@RequestMapping("/person")
public class PersonSpringController {
...
...
...
}
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (delno)
@GetMapping(path = "/greet/{id}",
produces = "text/plain")
public String greetPerson(
@PathVariable(name = "id") long id) {
...
...
...
}
Spring Data JPA
Uporabnikom MicroProfile bo prav tako ustrezala podpora Quarkusa za JPA z uporabo Hibernate ORM. Za razvijalce Springa je dobra novica, da Quarkus podpira splošno sprejete anotacije in tipe Spring Data JPA. Primeri uporabe podprtih API vmesnikov Spring Data JPA so navedeni v tabeli 4.
V uporabljajo se API vmesniki Spring Data JPA, dodatne informacije pa so na voljo v vodniku Quarkus z naslovom .
Tabela 4. Primeri uporabe podprtih API vmesnikov Spring Data JPA.
Podprte funkcionalnosti Spring Data JPA
Primeri
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 vmesniki MicroProfile
Odporna na napake (Fault tolerance)
Konstrukcije odpornosti na greške so zelo pomembne za preprečevanje kaskadnih napak in za ustvarjanje zanesljivih mikroservisnih arhitektur. Razvijalci Spring že leta uporabljajo circuit-breakerje za odpornost na napake. . Hystrix pa že dolgo ni bil posodobljen, medtem ko se microProfile-ov Fault Tolerance trenutno aktivno razvija in ima že več let izkušenj z uporabami v produkciji. Zato se za povečanje zanesljivosti storitev v Quarkusu priporoča uporaba API vmesnikov MicroProfile Fault Tolerance, katerih primere uporabe najdete v tabeli 5. Dodatne informacije so na voljo v vodniku Quarkus. .
Tabela 5. Primeri uporabe podprtih API vmesnikov MicroProfile Fault Tolerance.
Funkcije MicroProfile Fault Tolerance
Opis
Primeri
@Asynchronous
Izvajanje logike v ločenem niti
@Asynchronous
@Retry
public Future getSalutation() {
...
return future;
}
@Bulkhead
Omejevanje števila hkratnih zahtevkov
@Bulkhead(5)
public void fiveConcurrent() {
makeRemoteCall(); //...
}
@CircuitBreaker
Pametno obvladovanje napak in obnova po napakah
@CircuitBreaker(delay=500 // milliseconds
failureRatio = .75,
requestVolumeThreshold = 20,
successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
@Fallback
Klic alternativne logike v primeru napake
@Timeout(500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
public String fallback() {
return "hello";
}
Ponovni poskus pri napaki zahtevka
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
Nadzor časa čakanja pri napaki
@Timeout(value = 500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
makeRemoteCall(); //...
}
Preverjanje storitev (Health Service)
Platforme Kubernetes spremljajo delovanje kontejnerjev z uporabo posebnih storitev. Da bi spodnja platforma lahko spremljala storitve, razvijalci Spring običajno uporabljajo prilagodljive HealthIndicator in Spring Boot Actuator. V Quarkusu to lahko storite z MicroProfile Health, ki privzeto izvaja nadzor življenjske sposobnosti (liveness check), vendar jih lahko nastavite tudi na hkratno preverjanje poslušnosti in pripravljenosti (readiness). Primeri uporabe podprtih API MicroProfile Health so navedeni v tabeli 6, dodatne informacije pa so predstavljene v vodniku Quarkus. .
Tabela 6. Primeri uporabe podprtih API vmesnikov MicroProfile Health.
Funkcije MicroProfile Health
Opis
Primeri
@Liveness
Platforma izvede ponovno nalaganje okvarjenih kontejneriziranih aplikacij.
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
Plattform ne bo usmerjala prometa na kontejnerizirane aplikacije, če niso pripravljene
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();
}
Metrike
Aplikacije zagotavljajo metrike bodisi v operativne namene (za spremljanje KPI-jev zmogljivosti SLA) bodisi v neoperativne (poslovne KPI-jev SLA). Razvijalci v Springu zagotavljajo metrike prek Spring Boot Actuator in Micrometer. Quarkus uporablja MicroProfile Metrics za zagotavljanje osnovnih metrik (JVM in operacijski sistem), metrik dobavitelja (Quarkus) in metrik aplikacij. MicroProfile Metrics zahteva, da implementacija podpira izhodne formate JSON in OpenMetrics (Prometheus). Primeri uporabe MicroProfile Metrics API so prikazani v Tabeli 7.
V MicroProfile Metrics se uporablja za zagotavljanje metrik aplikacij. Dodatne informacije lahko najdete v priročniku Quarkus .
Tabela 7. Primeri uporabe API-jev MicroProfile Metrics.
Funkcije MicroProfile Metrics
Opis
Primeri
@Counted
Označuje število, ki šteje število klicev annotiranega objekta
@Counted(name = "fallbackCounter",
displayName = "Fallback Counter",
description = "Fallback Counter")
public String salutationFallback() {
return fallbackSalutation;
}
@ConcurrentGauge
Označuje gauge-senzor, ki šteje število hkratnih klicev annotiranega objekta
@ConcurrentGuage(
name = "fallbackConcurrentGauge",
displayName="Fallback Concurrent",
description="Fallback Concurrent")
public String salutationFallback() {
return fallbackSalutation;
}
@Gauge
Označuje gauge-senzor, ki meri vrednost annotiranega objekta
@Metered(name = "FallbackGauge",
displayName="Fallback Gauge",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
@Metered
Označuje meter-senzor, ki spremlja frekvenco klicev annotiranega objekta
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Annotacija, ki vsebuje informacije o metapodatkih ob prejemu zahteve za dodajanje ali dokončanje metrike
@Metric
@Metered(name = "MeteredFallback",
displayName="Metered Fallback",
description="Fallback frequency")
public String salutationFallback() {
return fallbackSalutation;
}
Označuje časomer, ki spremlja trajanje annotiranega objekta
@Timed(name = "TimedFallback",
displayName="Timed Fallback",
description="Fallback delay")
public String salutationFallback() {
return fallbackSalutation;
}
Merilne točke (Metrics Endpoints)
Merila aplikacij :8080/metrics/application
Osnovna merila :8080/metrics/base
Merila dobavitelja :8080/metrics/vendor
Vsa merila :8080/metrics
Rest-strank MicroProfile
Mikroservisi pogosto nudijo RESTful končne točke, za katere so potrebni ustrezni API-ji strank. Za delo s RESTful končnimi točkami Spring razvijalci običajno uporabljajo RestTemplate. Quarkus pa ponuja za ta namen API-čke MicroProfile Rest Client, katerih primere uporabe najdete v tabeli 8.
V Uporaba RESTful končnih točk se izvaja s pomočjo MicroProfile Rest Client. Dodatne informacije in primeri so na voljo v Quarkus priročniku. .
Tabela 8. Primeri uporabe API-jev MicroProfile Rest Client.
Funkcije MicroProfile Rest Client
Opis
Primeri
@RegisterRestClient
Registrira tipizirani Java vmesnik kot REST klienta.
@RegisterRestClient
@Path("/")
public interface MyRestClient {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getSalutation();
}
@RestClient
Ozmarka vstavitve primerka tipiziranega vmesnika REST klienta.
@Autowired // or @Inject
@RestClient
MyRestClient restClient;
Klic
Kliče REST končno točko.
System.out.println(
restClient.getSalutation());
mp-rest/url
Določa REST končno točko.
application.properties:
org.example.MyRestClient/mp-rest/url=
http://localhost:8081/myendpoint
Zaključki
V tem blogu, ki bo v prvi vrsti koristen za Spring razvijalce, bomo na kratko obravnavali, kako v Quarkusu uporabiti Spring API-je skupaj z MicroProfile API-ji za razvoj Java mikroservisov in njihovo kompilacijo v nativno binarno kodo, kar prihrani stotine megabajtov pomnilnika in se zažene v nekaj milisekundah.
Kot ste že razumeli, dodatne informacije o podpori Spring in MicroProfile API-jem ter številne druge koristne informacije najdete v .
Izvor: habr.com
