Hogyan egyesíti a Quarkus a MicroProfile-t és a Springet

Üdvözlet mindenkinek, itt van a harmadik poszt a Quarkusról szóló sorozatunkból!

Hogyan egyesíti a Quarkus a MicroProfile-t és a Springet

Java-mikroszolgáltatások fejlesztésekor gyakran feltételezik, hogy Eclipse MicroProfile és Spring Boot – ezek különálló és egymástól független API-k. Alapértelmezés szerint a programozók rendszerint azokat az API-kat használják, amelyekhez már hozzászoktak, mivel új keretrendszerek és futási környezetek tanulmányozása sok időt igényel. Ma megpróbáljuk megkönnyíteni néhány népszerű MicroProfile API használatát Spring-fejlesztőknek és bemutatjuk, hogyan lehet egyszerre használni a Spring API-t és az új hasznos funkciókat Quarkus.

Ha egy kicsit bővebben kifejtjük, először megvizsgáljuk a használati területeket és a részleteket arról, hogyan támogatja a Quarkus a Spring API-kat, hogy megmutassuk a Spring-fejlesztőknek, hogyan alkalmazhatják a MicroProfile API-t a mindennapi munkájuk során. Ezután beszélni fogunk a MicroProfile API-król, amelyek hasznosak lehetnek a Spring-fejlesztők számára mikroszolgáltatások létrehozásakor.

Miért éppen a Quarkus? Először is, ez élő kódolás (live coding), tehát az összes változtatás automatikus újratöltése a MicroProfile API-ban, a Spring API-ban és más Java API-kban mindössze egy paranccsal végrehajtható: mvn quarkus:dev. Másodszor, amit a példánkban vizsgálunk szolgáltatás Person (ez Spring, MicroProfile és JPA API-kból fordít egy bináris fájlt a GraalVM natív képének használatával) mindössze 0.055 másodperc alatt elindul, és körülbelül 90 MB-ot foglal el a memóriában (RSS) a RESTful alkalmazás végpontján. Maga a fordítás mindössze egy paranccsal hajtható végre: mvn package -Pnative.

Nem fogunk belemenni a MicroProfile részleteibe, csak annyit szeretnénk segíteni a Spring-fejlesztőknek, hogy megértsék, hogyan használhatók a Spring API-k a Quarkus-ban a MicroProfile API-kkal együtt.

Konténerek és Kubernetes

Annak érdekében, hogy ne terheljük túl ezt a cikket, itt csak a Kubernetes támogatásának magas szintű aspektusait fogjuk megvizsgálni, Kubernetesmivel fontos ezt érteni. A Quarkus úgy pozicionálja magát, mint a Kubernetes Java-stackje, amely minimalizálja a memóriafogyasztást és a Java-alkalmazások és szolgáltatások indítási idejét, és ezzel növeli a hoszton való elhelyezés sűrűségét, valamint csökkenti az általános költségeket.

A Quarkus szintén támogatja az automatikus generálást Kubernetes erőforrásokhoz, és A kulcs feltöréséhez szükséges inicializáló vektorok száma nem korlátozott. Ez azért van, mert egyes vektorok gyengébbek és több információt veszítenek a kulcsról, mint mások. Általában az inicializáló vektorok keverednek erősebbekkel. Tehát, ha luck van, a kulcsot már 20 000 inicializáló vektorral feltörheti. Azonban gyakran ez sem elegendő, ajánlja a Kubernetes és a Red Hat OpenShift platformokon való telepítést. Továbbá a Quarkus automatikusan generálja a Dockerfile.jvm (JVM csomagolás) és a Dockerfile.native (natív bináris csomagolás) fájlokat, amelyek a konténerek létrehozásához szükségesek.

Végül, orientálva a Kubernetes-t mint célkörnyezet, a Quarkus nem használ Java keretrendszereket olyan esetekben, amikor hasonló funkciókat a Kubernetes platform szintjén valósítottak meg. Az 1. táblázat tartalmazza a Kubernetes és a tipikus Java keretrendszerek funkcionális illeszkedésének térképét, amelyet a Spring fejlesztők használnak.

1. táblázat. A Java keretrendszerek és a Kubernetes funkcionális illeszkedésének térképe.

Funkció
Hagyományos Spring Boot
Kubernetes

Szolgáltatás felfedezés
Eureka
DNS

Konfiguráció
Spring Cloud Config
Config Maps / Secrets

Terheléselosztás
Ribbon (ügyfél oldalon)
Szolgáltatás, Replikációs vezérlő (szerver oldalon)

A példa kódjának lefordítása és futtatása

Ebben a cikkben hivatkozunk a projekt példa, amelyben a Spring és a MicroProfile API-k közösen használatosak, és még a fenti Java osztály is. A példa kódját a parancssorból le lehet fordítani és futtatni, további részletekért lásd a README.md fájlt.

Spring Framework API-k

Dependency Injection

A Quarkus számos Contexts and Dependency Injection (CDI) API-t és Spring Dependency Injection (Spring DI) API-t támogat. Ha a MicroProfile-lal dolgozik, Java EE és Jakarta EE, akkor már jól ismeri a CDI-t. Másrészről, a Spring fejlesztők a Quarkus Extension for Spring DI API-t használhatják a Spring DI kompatibilitásának biztosításához. A támogatott Spring DI API-k használatának példái a 2. táblázatban találhatók.

A a példa projektben mind a CDI, mind a Spring Dependency Injection használatban van. További információkat és példákat e témában a Quarkus útmutatójában talál, amelynek neve Spring DI Guide.

2. táblázat. A támogatott Spring DI API-k használatának példái.

A támogatott Spring DI funkciók
Példák

Konstruktor injekció

public PersonSpringController(
   PersonSpringRepository personRepository,  // injektált
   PersonSpringMPService personService) {    // injektált
      this.personRepository = personRepository;
      this.personService = personService;
}

Mező injekció
Autowired
Érték

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

@Value("${fallbackSalutation}")
String fallbackSalutation;

Bean
@Configuration

@Configuration
public class AppConfiguration {
   @Bean(name = "capitalizeFunction")
   public StringFunction capitalizer() {
      return String::toUpperCase;
   }
}

Komponens

@Component("noopFunction")
public class NoOpSingleStringFunction implements StringFunction {
   @Override
   public String apply(String s) {
      return s;
   }
}

Service

@Service
public class MessageProducer {
   @Value("${greeting.message}")
   String message;

   public String getPrefix() {
      return message;
   }
}

Web keretrendszer

A MicroProfile felhasználói örömmel tapasztalják, hogy a Quarkus támogatja a JAX-RS, a MicroProfile Rest Client, a JSON-P és a JSON-B megoldásait mint alap webfejlesztési modellt. A Spring fejlesztők számára kedvező hír, hogy a Quarkus nemrégiben támogatni kezdte a Spring Web API-t, különös figyelmet fordítva a REST interfészekre. A Spring DI-hez hasonlóan a Spring Web API támogatásának fő célja, hogy a Spring fejlesztők a Spring Web API-kat a MicroProfile API-kkal együtt használhassák. A támogatott Spring Web API-k használatának példáit a 3. táblázat tartalmazza, a cikk visszautal a Quarkus útmutatójára, amelynek címe Spring Web Guide.

3. táblázat. A támogatott Spring Web API interfészek használatának példái.

Támogatott Spring Web funkciók
Példák

@RestController
@RequestMapping

@RestController
@RequestMapping("/person")
public class PersonSpringController {
   ...
   ...
   ...
}

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (részleges)

@GetMapping(path = "/greet/{id}",
   produces = "text/plain")
   public String greetPerson(
   @PathVariable(name = "id") long id) {
   ...
   ...
   ...
}

Spring Data JPA

A MicroProfile felhasználói számára kellemes hír, hogy a Quarkus támogatja a JPA-t a Hibernate ORM segítségével. A Spring fejlesztők számára is jó hír, hogy a Quarkus támogatja a közismert Spring Data JPA annotációkat és típusokat. A támogatott Spring Data JPA API-k használati példáit a 4. táblázat tartalmazza.
A a példa projektben a Spring Data JPA API-k használatát, míg további információk érhetők el a Quarkus útmutatójában, amelynek címe Spring Data JPA Guide.

4. táblázat. A támogatott Spring Data JPA API interfészek használatának példái.

Támogatott Spring Data JPA funkciók
Példák

CrudRepository

public interface PersonRepository
         extends JpaRepository,
                 PersonFragment {
   ...
}

Az Eloquent segítségével történő megvalósítása meglehetősen egyszerű:
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Repository Fragments

public interface PersonRepository
         extends JpaRepository,
                 PersonFragment {
   ...
}

Derivált lekérdezési módszerek

public interface PersonRepository extends CrudRepository {

    List findByName(String name);
    
    Person findByNameBySsn(String ssn);
    
    Optional 
       findByNameBySsnIgnoreCase(String ssn);

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Felhasználó által definiált lekérdezések

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 interfészek

Hibatűrés (Fault tolerance)

A hibamentes architektúrák rendkívül fontosak a kaszkádos hibák megakadályozásához és megbízható mikroszolgáltatás-architektúrák létrehozásához. A Spring-fejlesztők már évek óta használják a hibamentesség érdekében a circuit-breaker-eket. Hystrix. A Hystrix azonban régóta nem frissült, míg a MicroProfile hibamentes megoldásai aktívan fejlődnek és már több éves termelési tapasztalattal rendelkeznek. Ezért a Quarkusban ajánlott a MicroProfile Fault Tolerance API-k alkalmazása a szolgáltatások megbízhatóságának növelése érdekében, amelyek használatával kapcsolatos példák a 5. táblázatban találhatók. További információkat erről a Quarkus útmutatójában találhat. Hibamentességi útmutató.

5. táblázat. A támogatott MicroProfile Fault Tolerance API-k használatának példái.

MicroProfile Fault Tolerance funkciók
Leírás
Példák

@Asynchronous

Logika végrehajtása külön szálon

@Asynchronous
@Retry
public Future getSalutation() {
   ...
   return future;
}

@Bulkhead

A párhuzamos kérések számának korlátozása

@Bulkhead(5)
public void fiveConcurrent() {
   makeRemoteCall(); //...
}

@CircuitBreaker

Intelligens hiba kezelés és hiba utáni helyreállítás

@CircuitBreaker(delay=500   // milliszekundum
   failureRatio = .75,
   requestVolumeThreshold = 20,
   successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

@Fallback

Alternatív logika hívása hiba esetén

@Timeout(500) // milliszekundum
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

public String fallback() {
   return "hello";
}

Retry

Újrapróbálkozás hiba esetén

@Retry(maxRetries=3)
public String getSalutation() {
   makeRemoteCall(); //...
}

Timeout

Időkorlát elérési hiba esetén

@Timeout(value = 500 )   // milliszekundum
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

Szolgáltatások ellenőrzése (Service Health)

A Kubernetes platformok speciális szolgáltatásokkal figyelik a konténerek állapotát. Ahhoz, hogy az alapul szolgáló platform nyomon követhesse a szolgáltatásokat, a Spring-fejlesztők általában testreszabott HealthIndicator-t és Spring Boot Actuator-t használnak. A Quarkusban ezt a MicroProfile Health segítségével lehet megtenni, amely alapértelmezés szerint élettartam-ellenőrzést (liveness check) végez, de beállítható, hogy egyidejűleg ellenőrizze az élettartamot és a készenlétet (readiness). A támogatott MicroProfile Health API-k használatának példái a 6. táblázatban találhatók, további információk pedig a Quarkus útmutatójában. Egészségügyi útmutató.

6. táblázat. A támogatott MicroProfile Health API-k használatának példái.

MicroProfile Health funkciók
Leírás
Példák

@Liveness

A platform újraindítja a hibás konténerizált alkalmazásokat
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

A platform will not route traffic to containerized applications if they are not ready.
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();  
}

Metrikák

Applications provide metrics either for operational purposes (to monitor SLA performance indicators) or for non-operational ones (business SLA indicators). Spring developers provide metrics using Spring Boot Actuator and Micrometer. In turn, Quarkus uses MicroProfile Metrics to provide basic metrics (JVM and operating system), vendor metrics (Quarkus), and application metrics. MicroProfile Metrics requires the implementation to support output formats of JSON and OpenMetrics (Prometheus). Examples of using the MicroProfile Metrics API are presented in Table 7.

A a példa projektben MicroProfile Metrics are used to provide application metrics. For more details, refer to the Quarkus guide. Metrics Guide.

Table 7. Examples of using the MicroProfile Metrics APIs.

Functions of MicroProfile Metrics
Leírás
Példák

@Counted

Indicates a counter that counts the number of calls to the annotated object.

@Counted(name = "fallbackCounter", 
  displayName = "Fallback Counter", 
  description = "Fallback Counter")
public String salutationFallback() {
   return fallbackSalutation;
}

@ConcurrentGauge

Indicates a gauge that counts the number of concurrent calls to the annotated object.

@ConcurrentGuage(
  name = "fallbackConcurrentGauge", 
  displayName="Fallback Concurrent", 
  description="Fallback Concurrent")
public String salutationFallback() {
   return fallbackSalutation;
}

@Gauge

Indicates a gauge that measures the value of the annotated object.

@Metered(name = "FallbackGauge",
   displayName="Fallback Gauge",
   description="Fallback frequency")
public String salutationFallback() {
   return fallbackSalutation;
}

@Metered

Indicates a meter that tracks the frequency of calls to the annotated object.

@Metered(name = "MeteredFallback",
   displayName="Metered Fallback",
   description="Fallback frequency")
public String salutationFallback() {
   return fallbackSalutation;
}

Metric

Annotation containing metadata information when a request for metric generation or submission is received.

@Metric
@Metered(name = "MeteredFallback",
   displayName="Metered Fallback",
   description="Fallback frequency")
public String salutationFallback() {
   return fallbackSalutation;
}

Timed

Indicates a timer that tracks the duration of the annotated object.

@Timed(name = "TimedFallback",
   displayName="Időzített visszaesés",
   description="Visszaesési késleltetés")
public String salutationFallback() {
   return fallbackSalutation;
}

Metrias végpontok (Metrics Endpoints)

Alkalmazási metrikák localhost:8080/metrics/application
Alapmetrikák localhost:8080/metrics/base
Szállító metrikák localhost:8080/metrics/vendor
Összes metrika localhost:8080/metrics

MicroProfile Rest kliens

A mikroszolgáltatások gyakran RESTful végpontokat biztosítanak, amelyek használatához megfelelő kliens API-k szükségesek. A RESTful végpontok használatához a Spring-fejlesztők általában a RestTemplate-et alkalmazzák. A Quarkus e feladat megoldására MicroProfile Rest Client API-interfészeket kínál, amelyek használatának példái a 8. táblázatban találhatók.

A a példa projektben A RESTful végpontok használata a MicroProfile Rest Client segítségével történik. További információk és példák találhatók a Quarkus útmutatójában. Rest Kliens Útmutató.

8. táblázat. MicroProfile Rest Client API-interfészek használatának példái.

MicroProfile Rest Client funkciói
Leírás
Példák

@RegisterRestClient

Regisztrálja a típusos Java interfészt REST kliensként.

@RegisterRestClient
@Path("/")
public interface MyRestClient {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getSalutation();
}

@RestClient

Megjelöli a típusos REST kliens interfész példányának befecskendezését.

@Autowired // or @Inject
@RestClient
MyRestClient restClient;

Hívás

Hívja a REST végpontot.

System.out.println(
   restClient.getSalutation());

mp-rest/url

Meghatározza a REST végpontot.

application.properties:
org.example.MyRestClient/mp-rest/url=
   http://localhost:8081/myendpoint

Összegzés

Ebben a blogban, amely főleg a Spring-fejlesztők számára hasznos, röviden bemutattuk, hogyan lehet a Quarkus-ban a Spring API-kat együtt használni a MicroProfile API-kkal Java mikroszolgáltatások fejlesztésére, majd azokat natív bináris kódra fordítani, ami több száz megabájt memóriát takarít meg és millisekundák alatt indul.

Ahogy már említetted, további információk találhatók a Spring és MicroProfile API-k támogatásáról, valamint sok más hasznos információ a Quarkus útmutatókban..

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster