Hogyan kombinálja a Quarkus a MicroProfile-t és a tavaszt?

Üdv mindenkinek, itt a harmadik bejegyzés a Quarkus sorozatban!

Hogyan kombinálja a Quarkus a MicroProfile-t és a tavaszt?

Java mikroszolgáltatások fejlesztésekor gyakran úgy gondolják, hogy Eclipse MicroProfile и Tavaszi bakancs különálló és független API-k. Alapértelmezés szerint a programozók általában a már megszokott API-kat használják, mivel az új keretrendszerek és futásidejű összetevők megtanulása sok időt vesz igénybe. Ma megpróbáljuk leegyszerűsíteni néhány népszerű fejlesztését MicroProfile API tavaszi fejlesztőknek és megmutatja, hogyan használhatja egyszerre a Spring API-t és az új hasznos funkciókat quarkus.

Kicsit részletesebben először megvizsgáljuk a Quarkus Spring API-k támogatási körét és részleteit, hogy megmutassuk a Spring fejlesztőinek, hogyan használhatják a MicroProfile API-t a mindennapi munkájuk során. Ezután kitérünk a MicroProfile API-kra, amelyek hasznosak a Spring fejlesztői számára a mikroszolgáltatások létrehozásakor.

Miért Quarkus? Először is, ez az élő kódolás, vagyis a MicroProfile API, Spring API és más Java API-k változásainak automatikus újratöltése, amely egyetlen paranccsal hajtható végre: mvn quarkus:dev. Másodszor, figyelembe véve példánkban a Person szolgáltatás (amely a Spring, MicroProfile és JPA API-kból binárissá fordítja a natív GraalVM lemezképet) mindössze 0.055 másodperc alatt indul el, és körülbelül 90 MB RAM-ot (RSS) foglal el a RESTful alkalmazásvégponton. Sőt, maga a fordítás is egyetlen paranccsal történik: mvn package -Pnative.

Nem megyünk bele a MicroProfile részleteibe, azon kívül, hogy segítsünk a Spring fejlesztőinek megérteni, hogyan használhatják a Spring API-kat MicroProfile API-kkal a Quarkusban.

Konténerek és Kubernetes

A cikk egyszerűsége érdekében itt csak a támogatás magas szintű vonatkozásaira térünk ki. Kubernetes, mert fontos megérteni. A Quarkus Java-veremként van elhelyezve a Kubernetes számára, úgy tervezték, hogy minimalizálja a memóriafogyasztást és a Java-alkalmazások és -szolgáltatások indítási idejét, és ennek eredményeként növelje sűrűségüket a gazdagépen, és csökkentse az általános költségeket.

Quarkus is támogatja az automatikus generálást Kubernetes források és ajánlatok útmutatók Kubernetes és Red Hat OpenShift platformokon való telepítéshez. Ezenkívül a Quarkus automatikusan létrehozza a tárolók létrehozásához szükséges Dockerfile.jvm (JVM-csomagolás) és Dockerfile.native (natív bináris csomagolás) fájlokat.

Végül, mivel a Kubernetesre összpontosít, mint a céltelepítési környezetre, a Quarkus nem használ Java-keretrendszereket olyan esetekben, amikor hasonló funkcionalitást a Kubernetes platform szintjén is megvalósítanak. Az 1. táblázat a Kubernetes és a Spring fejlesztők által használt tipikus Java-keretrendszerek közötti funkcionális megfelelést mutatja be.

1. táblázat: A Java keretrendszerek és a Kubernetes közötti funkcionális megfeleltetés térképe.

funkcionális
Hagyományos tavaszi csizma
Kubernetes

Szolgáltatás felfedezése
Eureka
DNS

Configuration
Spring Cloud Config
Config Maps/Secrets

Terheléselosztás
Szalag (ügyféloldal)
Szolgáltatás, replikációs vezérlő (kiszolgálóoldali)

A kód fordítása és futtatása a példából

Ebben a cikkben hivatkozunk példaprojekt, ahol a Spring és a MicroProfile API-kat, sőt ugyanazt a Java osztályt együtt használják. A példában szereplő kód lefordítható és futtatható a parancssorból, a részletekért lásd a README.md fájlt.

Spring Framework API-k

Függőség-befecskendezés

A Quarkus számos funkciót támogat Contexts and Dependency Injection (CDI) API-k és Spring Dependency Injection (Spring DI) API-k. Ha a MicroProfile-lal dolgozik, Java EE és Jakarta EE, akkor már nagyon jól ismeri a CDI-t. Másrészt a Spring fejlesztői használhatják a Quarkus Extension for Spring DI API-t a Spring DI-vel való kompatibilitás eléréséhez. A támogatott Spring DI API-k használatára vonatkozó példákat a 2. táblázat tartalmazza.

В projekt a példánkból CDI-t és Spring Dependency Injectiont is használ. A témával kapcsolatos további információk és példák a Quarkus útmutatóban találhatók Tavaszi DI útmutató.

2. táblázat: Példák a támogatott Spring DI API-k használatára.

Támogatott tavaszi DI funkciók
Примеры

Konstruktor befecskendezés

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

Helyi befecskendezés
Automatikus bekötés
Érték

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Bab
@Konfiguráció

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

Összetevő

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

szolgáltatás

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

   public String getPrefix() {
      return message;
   }
}

Webes keretrendszer

A MicroProfile felhasználók imádni fogják, hogy a Quarkus támogatja a JAX-RS-t, a MicroProfile Rest Client-et, a JSON-P-t és a JSON-B-t, mint elsődleges webes programozási modellt. A tavaszi fejlesztők elégedettek lesznek azzal, hogy a Quarkus nemrégiben támogatja a Spring Web API-t, különösen a REST felületeket. A Spring DI-hez hasonlóan a Spring Web API támogatásának fő célja, hogy lehetővé tegye a Spring fejlesztők számára a Spring Web API-k használatát MicroProfile API-kkal együtt. A támogatott Spring Web API-k használatára vonatkozó példák a 3. táblázatban találhatók, a témával kapcsolatos további információk és példák pedig a Quarkus oktatóanyagban találhatók. Tavaszi webkalauz.

3. táblázat: Példák a támogatott Spring Web API-k használatára.

Támogatott tavaszi webszolgáltatások
Примеры

@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 DataJPA

A MicroProfile felhasználók azt is értékelni fogják, hogy a Quarkus támogatja a JPA-t a Hibernate ORM használatával. Van egy jó hír is a Spring fejlesztői számára: a Quarkus támogatja a közös Spring Data JPA megjegyzéseket és típusokat. A támogatott Spring Data JPA API-k használatára vonatkozó példákat a 4. táblázat tartalmazza.
В projekt a példánkból Spring Data JPA API-k használatosak, és további információk találhatók a Quarkus oktatóanyagban Spring Data JPA útmutató.

4. táblázat: Példák a támogatott Spring Data JPA API-k használatára.

Támogatott Spring Data JPA funkciók
Примеры

CrudRepository

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

raktár
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Repository Fragments

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

Származtatott 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-k

Hibatűrés

A hibatűrési konstrukciók nagyon fontosak a lépcsőzetes hibák megelőzésében és a megbízható mikroszolgáltatási architektúrák létrehozásában. A tavaszi fejlesztők évek óta használják a megszakítókat a hibatűrés érdekében. Hystrix. A Hystrix frissítése azonban hosszú ideje nem történt meg, de a MicroProfile hibatűrése jelenleg aktívan fejlődik, és több éves termelési használat áll mögötte. Ezért a Quarkus szolgáltatásainak megbízhatóságának javítása érdekében javasolt a MicroProfile hibatűrő API-k használata, amelyek példáit az 5. táblázat tartalmazza. Erről bővebben a Quarkus kézikönyvében olvashat. Hibatűrési útmutató.

5. táblázat: Példák a támogatott MicroProfile hibatűrő API-k használatára.

Mikroprofil hibatűrési jellemzők
Leírás
Примеры

@Aszinkron

A logika végrehajtása külön szálban

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

@Válaszfal

Korlátozza az egyidejű kérések számát

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

@Biztosíték

Okos hibakezelés és helyreállítás a hibákból

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

@Fallback

Hiba esetén alternatív logika hívása

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

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

Próbálja újra

Próbálja újra, ha a kérés sikertelen

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

Timeout

Hibakontroll időtúllépés

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

Szolgáltatások ellenőrzése (Szolgáltatás állapota)

A Kubernetes platformok speciális szolgáltatások segítségével figyelik a konténerek állapotát. Annak érdekében, hogy az alapul szolgáló platform figyelhesse a szolgáltatásokat, a Spring fejlesztői általában egyéni 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 élességellenőrzést végez, de beállítható úgy is, hogy egyszerre ellenőrizze az élénkséget és a készenlétet. A támogatott MicroProfile Health API-k használatára vonatkozó példák a 6. táblázatban találhatók, további információk pedig a Quarkus kézikönyvben találhatók. Egészségügyi útmutató.

6. táblázat: Példák a támogatott MicroProfile Health API-k használatára.

A MicroProfile Health szolgáltatásai
Leírás
Примеры

@Életesség

A platform újraindítja a sikertelen konténeres alkalmazásokat
Végpont:
házigazda:8080/egészség/élő

@Liveness
public class MyHC implements HealthCheck {
  public HealthCheckResponse call() {

   ...
   return HealthCheckResponse
     .named("myHCProbe")
     .status(ready ? true:false)
     .withData("mydata", data)
     .build();  
}

@Készenlét

A platform nem küld forgalmat konténeres alkalmazásoknak, ha nem áll készen
Végpont:
host:8080/egészség/kész

@Readiness
public class MyHC implements HealthCheck {
  public HealthCheckResponse call() {

   ...
   return HealthCheckResponse
     .named("myHCProbe")
     .status(live ? true:false)
     .withData("mydata", data)
     .build();  
}

Metrikák

Az alkalmazások mérőszámokat biztosítanak akár működési célokra (a teljesítmény SLA-k figyelésére), akár nem működési célokra (üzleti SLA-k). A tavaszi fejlesztők a Spring Boot Actuator és a Micrometer használatával biztosítják a mutatókat. A Quarkus viszont a MicroProfile Metrics segítségével biztosítja az alapszintű mérőszámokat (JVM és operációs rendszer), a szállítói mérőszámokat (Quarkus) és az alkalmazási mérőszámokat. A MicroProfile Metrics megköveteli, hogy a megvalósítás támogassa a JSON és az OpenMetrics (Prometheus) kimeneti formátumokat. A MicroProfile Metrics API használatára a 7. táblázatban talál példákat.

В projekt a példánkból A MicroProfile Metrics alkalmazási metrikák biztosítására szolgál. További információkért lásd a Quarkus kézikönyvét Mérési útmutató.

7. táblázat: Példák a MicroProfile Metrics API-k használatára.

MicroProfile Metrics jellemzői
Leírás
Примеры

@Számolt

Egy számláló számlálót jelöl, amely megszámolja, hogy hányszor hívtak meg egy annotált objektumot

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

@ConcurrentGauge

Olyan mérőeszközt jelöl, amely számolja a megjegyzésekkel ellátott objektum egyidejű hívásainak számát

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

@Nyomtáv

Olyan mérőérzékelőt jelöl, amely egy megjegyzéssel ellátott objektum értékét méri

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

@Metered

Olyan mérőérzékelőt jelöl, amely egy megjegyzéssel ellátott objektum hívási gyakoriságát figyeli

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

Metric

Metaadatokkal kapcsolatos információkat tartalmazó megjegyzés, amikor egy metrika megadására vagy előállítására vonatkozó kérelem érkezik

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

időzített

Egy időzítőt jelöl, amely nyomon követi a megjegyzésekkel ellátott objektum időtartamát

@Timed(name = "TimedFallback",
   displayName="Timed Fallback",
   description="Fallback delay")
public String salutationFallback() {
   return fallbackSalutation;
}

Metrikák végpontjai

Alkalmazási mutatók localhost:8080/metrics/alkalmazás
Alapvető mérőszámok localhost:8080/metrics/alap
Szállítói mutatók localhost:8080/metrics/szállító
Minden mérőszám localhost:8080/metrika

MicroProfile Rest Client

A mikroszolgáltatások gyakran biztosítanak RESTful végpontokat, amelyekhez megfelelő ügyfél API-k szükségesek. A RESTful végpontok használatához a Spring fejlesztői általában a RestTemplate-et használják. A Quarkus MicroProfile Rest Client API-kat kínál a probléma megoldására, amelyek felhasználási példáit a 8. táblázat tartalmazza.

В projekt a példánkból a RESTful végpontok használata a MicroProfile Rest Client segítségével történik. A témával kapcsolatos további információk és példák a Quarkus kézikönyvében találhatók Rest Client Guide.

8. táblázat: Példák a MicroProfile Rest Client API-k használatára.

MicroProfile Rest Client funkciók
Leírás
Примеры

@RegisterRestClient

A beírt Java interfészt REST kliensként regisztrálja

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

@RestClient

Egy beírt REST kliens felület példányának megvalósítását jelöli

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

könyörgés

REST végpontot hív meg

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

mp-rest/url

Megadja a REST végpontot

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

Eredményei

Ebben a blogban, amely elsősorban a Spring fejlesztőinek szól, áttekintettük, hogyan használhatjuk a Spring API-kat a Quarkus MicroProfile API-jaival Java mikroszolgáltatások fejlesztésére, majd azokat natív bináris kódba fordítva, amely több száz megabájt RAM-ot takarít meg, és ezredmásodperc kérdése.

Amint azt már megértette, a Spring és a MicroProfile API-k támogatásával kapcsolatos további információk, valamint sok más hasznos információ a következő helyen található: Quarkus kézikönyvek.

Forrás: will.com

Hozzászólás