Kiel Quarkus kombinas MicroProfile kaj Spring

Saluton al ĉiuj, jen la tria afiŝo de la serio Quarkus!

Kiel Quarkus kombinas MicroProfile kaj Spring

Dum evoluigado de Java mikroservoj, oni ofte kredas tion Eklipso Mikroprofilo и Printempa boteto estas apartaj kaj sendependaj APIoj. Defaŭlte, programistoj emas uzi la API-ojn al kiuj ili jam kutimas, ĉar lerni novajn kadrojn kaj rultempajn komponantojn prenas multan tempon. Hodiaŭ ni provos simpligi la disvolviĝon de iuj popularaj MicroProfile API por Spring-programistoj kaj montros al vi kiel samtempe uzi la Spring API kaj novajn utilajn funkciojn quarkus.

Iom pli detale, ni unue rigardos la amplekson kaj detalojn pri kiel Quarkus subtenas Spring API-ojn por montri al Spring-programistoj kiel uzi la MicroProfile API en sia ĉiutaga laboro. Poste ni kovros la MicroProfile-APIojn, kiuj estas utilaj por Spring-programistoj dum kreado de mikroservoj.

Kial Quarkus? Unue, ĉi tio estas viva kodado, tio estas, aŭtomata reŝargado de iuj ŝanĝoj en la MicroProfile API, Spring API kaj aliaj Java API, kiu estas farita per nur unu komando: mvn quarkus:dev. Due, diskutite en en nia ekzemplo la Person-servo (kiu kompilas de Spring, MicroProfile, kaj JPA-APIoj en binaron uzante la indiĝenan GraalVM-bildon) komenciĝas en nur 0.055 sekundoj kaj okupas ĉirkaŭ 90 MB da RAM (RSS) sur la RESTful-aplikfina finpunkto. Plie, ĝia kompilo mem estas farita per nur unu komando: mvn package -Pnative.

Ni ne eniros en detalojn pri MicroProfile, krom helpi Spring-programistojn kompreni kiel ili povas uzi Spring API-ojn kun MicroProfile-API-oj en Quarkus.

Ujoj kaj Kubernetes

Por konservi ĉi tiun artikolon simpla, ni kovros nur la altnivelajn aspektojn de subteno ĉi tie. Kubernetoj, ĉar gravas kompreni. Quarkus estas poziciigita kiel Java stako por Kubernetes, ĝi estas dizajnita por minimumigi memorkonsumon kaj ektempon de Java-aplikoj kaj servoj, kaj, kiel rezulto, pliigi ilian densecon sur la gastiganto kaj redukti ĝeneralajn kostojn.

Quarkus ankaŭ subtenas aŭtomatan generacion Rimedoj kaj ofertoj de Kubernetes gvidado por deplojo sur Kubernetes kaj Red Hat OpenShift-platformoj. Krome, Quarkus aŭtomate generas la dosierojn Dockerfile.jvm (JVM-pakaĵo) kaj Dockerfile.native (denaska binara pakado) necesajn por krei ujojn.

Finfine, fokusante Kubernetes kiel la cela deplojmedio, Quarkus ne uzas Java kadrojn en kazoj kie simila funkcieco estas efektivigita sur la nivelo de la Kubernetes platformo mem. Tablo 1 provizas mapon de la funkcia korespondado inter Kubernetes kaj tipaj Java kadroj uzataj de Spring-programistoj.

Tablo 1. Mapo de funkcia korespondado inter Java kadroj kaj Kubernetes.

Funkcia
Tradicia Printempa Boto
Kubernetoj

Servo-malkovro
Eureka
DNS

agordo
Printempa Nuba Agordo
Agordo Mapoj/Sekretoj

Balancado de ŝarĝo
Rubando (klienta flanko)
Servo, Replica Regilo (servila flanko)

Kompilante kaj kurante la kodon de la ekzemplo

En ĉi tiu artikolo ni referencas ekzemplo projekto, kie la Spring kaj MicroProfile APIs kaj eĉ la sama Java klaso estas uzataj kune. La kodo en ĉi tiu ekzemplo povas esti kompilita kaj rulita de la komandlinio, vidu la dosieron README.md por detaloj.

Spring Framework APIoj

Dependa Injekto

Quarkus subtenas gamon da Kuntekstoj kaj Dependency Injection (CDI) APIoj kaj Spring Dependency Injection (Spring DI) APIoj. Se vi laboras kun MicroProfile, Java EE kaj Ĝakarto EE, tiam vi jam tre konas CDI. Aliflanke, Spring-programistoj povas uzi la Quarkus Extension for Spring DI API por atingi kongruecon kun Spring DI. Ekzemploj de uzado de la subtenataj Spring DI-API-oj estas donitaj en Tabelo 2.

В projekto el nia ekzemplo Uzas kaj CDI kaj Spring Dependency Injection. Por pliaj informoj kaj ekzemploj pri ĉi tiu temo, vidu la gvidilon pri Quarkus nomita Printempa DI-Gvidisto.

Tablo 2. Ekzemploj de uzado de la subtenataj Spring DI-APIoj.

Subtenataj Printempaj DI Trajtoj
ekzemploj

Konstruisto Injekto

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

Kampa Injekto
Aŭtomata kabligita
valoro

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

fabo
@Agordo

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

komponanto

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

servo

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

   public String getPrefix() {
      return message;
   }
}

Reta kadro

Uzantoj de MicroProfile amos, ke Quarkus subtenas JAX-RS, MicroProfile Rest Client, JSON-P kaj JSON-B kiel la ĉefan retprogramadan modelon. Printempaj programistoj ĝojos pri lastatempa subteno de Quarkus por la Spring Web API, precipe REST-interfacoj. Simile al Spring DI, la ĉefa celo de Spring Web API-subteno estas ebligi Spring-programistojn uzi Spring Web API-ojn kune kun MicroProfile-API. Ekzemploj pri kiel uzi la subtenatajn Spring Web API-ojn estas disponigitaj en Tabelo 3, kaj pli da informoj kaj ekzemploj pri ĉi tiu temo troveblas en la Quarkus-lernilo nomata Printempa Reta Gvidilo.

Tablo 3. Ekzemploj de uzado de la subtenataj Spring Web API-oj.

Subtenataj Printempaj Retaj Trajtoj
ekzemploj

@RestController
@RequestMapping

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

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@PetoBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (parta)

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

Spring DataJPA

Uzantoj de MicroProfile ankaŭ aprezos, ke Quarkus subtenas JPA uzante la Hibernate ORM. Estas ankaŭ bonaj novaĵoj por Spring-programistoj: Quarkus subtenas komunajn komentariojn kaj tipojn de Spring Data JPA. Ekzemploj de uzado de la subtenataj Spring Data JPA-API-oj estas donitaj en Tabelo 4.
В projekto el nia ekzemplo Spring Data JPA-APIoj estas uzataj kaj pliaj informoj haveblas en la Quarkus-lernilo nomata Spring Data JPA-Gvidilo.

Tablo 4. Ekzemploj de uzado de subtenataj Spring Data JPA-APIoj.

Subtenataj Spring Data JPA-Trajtoj
ekzemploj

CrudRepository

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

Repository
JpaDeponejo
PagingAnd SortingDepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Deponejo Fragmentoj

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

Derivitaj demandaj metodoj

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Demandoj difinitaj de uzanto

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 APIoj

Kulpo toleremo

Faŭltoleremo-konstruaĵoj estas tre gravaj por malhelpi kaskadajn fiaskojn kaj krei fidindajn mikroservajn arkitekturojn. Printempaj programistoj uzas ŝaltilojn por faŭltoleremo dum multaj jaroj. Hystrix. Tamen, Hystrix ne estis ĝisdatigita dum longa tempo, sed Fault Tolerance de MicroProfile nun aktive evoluas kaj havas plurajn jarojn da produktada uzo malantaŭ ĝi. Tial, por plibonigi la fidindecon de servoj en Quarkus, oni rekomendas uzi la MicroProfile-Fault Tolerance-API-ojn, kies ekzemploj estas uzataj en Tabelo 5. Por pliaj informoj pri tio, vidu la manlibron de Quarkus. Gvidilo pri Faŭltoleremo.

Tablo 5. Ekzemploj de uzado de subtenataj MicroProfile Fault Tolerance API-oj.

Trajtoj de MicroProfile Fault Tolerance
Priskribo
ekzemploj

@Asinkrona

Efektivigante logikon en aparta fadeno

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

@Kalmuro

Limigu la nombron da samtempaj petoj

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

@Cirkvitrompilo

Inteligenta misfunkciado kaj reakiro de misfunkciadoj

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

@Fallback

Voki alternativan logikon en kazo de fiasko

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

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

Retry

Reprovu je peto malsukceso

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

Tempo finiĝo

Tempo de malsukceso-kontrolo

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

Kontrolado de servoj (Serva Sano)

Kubernetes-platformoj kontrolas la sanon de ujoj uzante specialajn servojn. Por permesi al la subesta platformo monitori servojn, Spring-programistoj kutime uzas kutiman HealthIndicator kaj Spring Boot Actuator. En Quarkus, tio povas esti farita per MicroProfile Health, kiu defaŭlte faras vivecon-kontrolon, sed povas esti agordita por samtempe kontroli vivecon kaj pretecon. Ekzemploj pri kiel uzi la subtenatajn MicroProfile Health API-ojn estas disponigitaj en Tabelo 6, kaj pliaj informoj estas disponigitaj en la Quarkus-manlibro. Gvidilo pri Sano.

Tablo 6: Uzado-ekzemploj de subtenataj MicroProfile Health API-oj.

Trajtoj de MicroProfile Health
Priskribo
ekzemploj

@Viveco

La platformaj rekomencoj malsukcesis konteneritajn aplikojn
Finpunkto:
gastiganto:8080/health/live

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

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

@Preteco

La platformo ne sendos trafikon al konteneritaj aplikoj se ĝi ne estas preta
Finpunkto:
gastiganto:8080/sano/preta

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

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

Metriko

Aplikoj disponigas metrikojn por aŭ funkciaj celoj (por monitori rendimentajn SLAojn) aŭ ne-funkciajn celojn (komercaj SLAoj). Printempaj programistoj provizas metrikojn per Spring Boot Actuator kaj Mikrometro. Siavice, Quarkus uzas MicroProfile Metrics por provizi bazliniajn metrikojn (JVM kaj operaciumo), vendistajn metrikojn (Quarkus) kaj aplikaĵajn metrikojn. MicroProfile Metrics postulas, ke la efektivigo subtenas produktaĵformatojn JSON kaj OpenMetrics (Prometheus). Ekzemploj de uzado de la MicroProfile Metrics API estas donitaj en Tabelo 7.

В projekto el nia ekzemplo MicroProfile Metrics estas uzataj por provizi aplikajn metrikojn. Por pliaj informoj, vidu la manlibron de Quarkus Gvidilo pri Metriko.

Tabelo 7. Ekzemploj de uzado de MicroProfile Metrics API-oj.

Trajtoj de MicroProfile Metrics
Priskribo
ekzemploj

@kalkulita

Indikas nombrilon, kiu nombras la nombron da fojoj kiam komentita objekto estis vokita

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

@ConcurrentGauge

Indikas mezurilon kiu kalkulas la nombron da samtempaj vokoj al komentita objekto

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

@Gauge

Indikas mezurilon kiu mezuras la valoron de komentita objekto

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

@Metered

Indikas metrosensilon kiu monitoras la vokfrekvencon de komentita objekto

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

metriko

Komentario enhavanta informojn pri metadatenoj kiam peto estas ricevita por enigi aŭ produkti metrikon

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

Tempigita

Indikas tempigilon, kiu spuras la daŭron de komentita objekto

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

Metrikaj Finpunktoj

Aplikaj metrikoj localhost:8080/metrics/application
Bazaj metrikoj localhost:8080/metrics/bazo
Vendistaj metrikoj localhost:8080/metrics/vendor
Ĉiuj metrikoj localhost:8080/metriko

MikroProfile Rest Kliento

Mikroservoj ofte disponigas RESTfulajn finpunktojn kiuj postulas respondajn klientajn APIojn funkcii per ili. Por uzi RESTful-finpunktojn, Spring-programistoj kutime uzas RestTemplate. Quarkus ofertas MicroProfile Rest Client API-ojn por solvi ĉi tiun problemon, kies ekzemploj de uzo estas donitaj en Tabelo 8.

В projekto el nia ekzemplo la uzo de RESTful finpunktoj estas farita uzante la MicroProfile Rest Kliento. Pliaj informoj kaj ekzemploj pri ĉi tiu temo troveblas en la manlibro de Quarkus Ripoza Kliento Gvidilo.

Tablo 8. Ekzemploj de uzado de MicroProfile Rest Client API-oj.

Trajtoj de MicroProfile Rest Kliento
Priskribo
ekzemploj

@RegisterRestClient

Registras tajpitan Java-interfacon kiel REST-klienton

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

@RestClient

Markas la efektivigon de kazo de tajpita REST-klientinterfaco

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

Alvoko

Vokas REST-finpunkton

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

mp-ripozo/url

Specifas la REST-finpunkton

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

Rezultoj

En ĉi tiu blogo, celita ĉefe al Spring-programistoj, ni rapide rigardis kiel uzi la Spring API-ojn kun la MicroProfile-API-oj en Quarkus por evoluigi Java-mikroservojn kaj poste kompili ilin en indiĝenan binaran kodon, kiu ŝparas centojn da megabajtoj da RAM kaj lanĉas en. afero de milisekundoj.

Kiel vi jam komprenis, pli da informoj pri subteno por la Spring kaj MicroProfile APIs, same kiel multaj aliaj utilaj informoj, troveblas en Quarkus-manlibroj.

fonto: www.habr.com

Aldoni komenton