Ինչպես է Quarkus-ը համատեղում MicroProfile-ը և Spring-ը

Բարև բոլորին, ահա «Quarcus» շարքի երրորդ գրառումը:

Ինչպես է Quarkus-ը համատեղում MicroProfile-ը և Spring-ը

Java միկրոծառայությունների մշակման ժամանակ հաճախ ենթադրվում է, որ Eclipse MicroProfile и Գարնանային կոշիկ առանձին և անկախ API-ներ են: Լռելյայնորեն, ծրագրավորողները հակված են օգտագործել այն API-ները, որոնց արդեն սովոր են, քանի որ նոր շրջանակներ և գործարկման ժամանակի բաղադրիչներ սովորելը շատ ժամանակ է պահանջում: Այսօր մենք կփորձենք պարզեցնել որոշ հայտնիների զարգացումը MicroProfile API գարնանային մշակողների համար և ցույց կտա ձեզ, թե ինչպես միաժամանակ օգտագործել Spring API-ն և նոր օգտակար գործառույթները Քվարկուս.

Մի փոքր ավելի մանրամասն, մենք նախ կանդրադառնանք շրջանակներին և մանրամասներին, թե ինչպես է Quarkus-ն աջակցում Spring API-ներին՝ Spring ծրագրավորողներին ցույց տալու համար, թե ինչպես օգտագործել MicroProfile API-ն իրենց ամենօրյա աշխատանքում: Այնուհետև մենք կանդրադառնանք MicroProfile API-ներին, որոնք օգտակար են Spring ծրագրավորողների համար միկրոծառայություններ ստեղծելիս:

Ինչու Quarkus? Նախ, սա կենդանի կոդավորում է, այսինքն՝ MicroProfile API-ի, Spring API-ի և այլ Java API-ների ցանկացած փոփոխության ավտոմատ վերաբեռնում, որն իրականացվում է ընդամենը մեկ հրամանով՝ mvn quarkus:dev: Երկրորդ, դիտարկված է մեր օրինակում Անձի ծառայությունը (որը հավաքվում է Spring, MicroProfile և JPA API-ներից երկուականի մեջ՝ օգտագործելով բնիկ GraalVM պատկերը) սկսվում է ընդամենը 0.055 վայրկյանում և զբաղեցնում է մոտ 90 ՄԲ RAM (RSS) RESTful հավելվածի վերջնակետում: Ավելին, դրա կազմումն ինքնին կատարվում է ընդամենը մեկ հրամանով՝ mvn փաթեթ -Pnative։

Մենք չենք մանրամասնի MicroProfile-ի մասին, բացի այն, որ օգնենք Spring ծրագրավորողներին հասկանալ, թե ինչպես կարող են օգտագործել Spring API-ները MicroProfile API-ներով Quarkus-ում:

Կոնտեյներներ և Kubernetes

Այս հոդվածը պարզ պահելու համար մենք այստեղ կանդրադառնանք միայն աջակցության բարձր մակարդակի ասպեկտներին: Կուբերնետես, քանի որ կարևոր է հասկանալ. Quarkus-ը դիրքավորվում է որպես Kubernetes-ի Java ստեկ, այն նախատեսված է նվազագույնի հասցնելու հիշողության սպառումը և Java հավելվածների և ծառայությունների գործարկման ժամանակը, և, որպես արդյունք, մեծացնել դրանց խտությունը հոսթի վրա և նվազեցնել ընդհանուր ծախսերը:

Քվարկուսը նույնպես աջակցում է ավտոարտադրությանը Kubernetes ռեսուրսներ և առաջարկներ ուղեցույցներ Kubernetes և Red Hat OpenShift հարթակներում տեղակայման համար: Բացի այդ, Quarkus-ը ավտոմատ կերպով ստեղծում է Dockerfile.jvm (JVM փաթեթավորում) և Dockerfile.native (բնական երկուական փաթեթավորում) ֆայլերը, որոնք անհրաժեշտ են կոնտեյներներ ստեղծելու համար։

Վերջապես, կենտրոնանալով Kubernetes-ի վրա՝ որպես նպատակային տեղակայման միջավայրի, Quarkus-ը չի օգտագործում Java շրջանակներ այն դեպքերում, երբ նմանատիպ գործառույթն իրականացվում է հենց Kubernetes պլատֆորմի մակարդակով: Աղյուսակ 1-ը ներկայացնում է Kubernetes-ի և տիպիկ Java շրջանակների միջև ֆունկցիոնալ համապատասխանության քարտեզ, որն օգտագործվում է Spring ծրագրավորողների կողմից:

Աղյուսակ 1. Java շրջանակների և Kubernetes-ի միջև ֆունկցիոնալ համապատասխանության քարտեզ:

Ֆունկցիոնալ
Ավանդական գարնանային կոշիկներ
Կուբերնետես

Ծառայության բացահայտում
Eureka
DNS

Տեսիլ
Spring Cloud Config
Կազմաձևեք քարտեզներ/գաղտնիքներ

Բեռի հավասարակշռում
Ժապավեն (հաճախորդի կողմից)
Սպասարկում, կրկնօրինակման վերահսկիչ (սերվերի կողմ)

Կոդերի հավաքում և գործարկում օրինակից

Այս հոդվածում մենք անդրադառնում ենք օրինակ նախագիծ, որտեղ Spring և MicroProfile API-ները և նույնիսկ նույն Java դասը օգտագործվում են միասին։ Այս օրինակի կոդը կարող է կազմվել և գործարկվել հրամանի տողից, մանրամասների համար տես README.md ֆայլը:

Spring Framework API-ներ

Կախվածության ներարկում

Quarkus-ն աջակցում է մի շարք Contexts and Dependency Injection (CDI) API-ներ և Spring Dependency Injection (Spring DI) API-ներ: Եթե ​​դուք աշխատում եք MicroProfile-ի հետ, Java EE և Jakarta EE, ապա դուք արդեն շատ ծանոթ եք CDI-ին։ Մյուս կողմից, Spring ծրագրավորողները կարող են օգտագործել Quarkus Extension-ը Spring DI API-ի համար՝ Spring DI-ի հետ համատեղելիության հասնելու համար: Աջակցվող Spring DI API-ների օգտագործման օրինակներ տրված են Աղյուսակ 2-ում:

В նախագիծ մեր օրինակից Օգտագործում է ինչպես CDI, այնպես էլ գարնանային կախվածության ներարկում: Այս թեմայի վերաբերյալ լրացուցիչ տեղեկությունների և օրինակների համար տե՛ս Quarkus ուղեցույցը, որը կոչվում է Գարուն DI ուղեցույց.

Աղյուսակ 2. Աջակցվող Spring DI API-ների օգտագործման օրինակներ:

Աջակցված Spring DI-ի առանձնահատկությունները
օրինակները

Կոնստրուկտորային ներարկում

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

Դաշտային ներարկում
Ավտոմատ լարով
Արժեք

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Լոբի
@ Կազմաձևում

@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;
   }
}

Վեբ շրջանակ

MicroProfile-ի օգտատերերին դուր կգա, որ Quarkus-ն աջակցում է JAX-RS-ին, MicroProfile Rest Client-ին, JSON-P-ին և JSON-B-ին՝ որպես վեբ ծրագրավորման հիմնական մոդել: Գարնանային ծրագրավորողները գոհ կլինեն Quarkus-ի վերջին աջակցությամբ Spring Web API-ին, մասնավորապես REST ինտերֆեյսներին: Spring DI-ի նման, Spring Web API-ի աջակցության հիմնական նպատակն է Spring ծրագրավորողներին հնարավորություն տալ օգտագործել Spring Web API-ները MicroProfile API-ների հետ համատեղ: Աջակցվող Spring Web API-ներն օգտագործելու օրինակները տրված են Աղյուսակ 3-ում, և այս թեմայի վերաբերյալ լրացուցիչ տեղեկություններ և օրինակներ կարելի է գտնել Quarkus ձեռնարկում, որը կոչվում է. Գարնանային վեբ ուղեցույց.

Աղյուսակ 3. Աջակցվող Spring Web API-ների օգտագործման օրինակներ:

Աջակցված Գարնանային վեբ հնարավորություններ
օրինակները

@RestController
@RequestMapping

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

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (մասնակի)

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

Spring DataJPA

MicroProfile-ի օգտատերերը նույնպես կգնահատեն, որ Quarkus-ն աջակցում է JPA-ին՝ օգտագործելով Hibernate ORM: Գարուն մշակողների համար կա նաև լավ նորություն. Quarkus-ն աջակցում է Spring Data JPA-ի սովորական ծանոթագրություններին և տեսակներին: Աջակցվող Spring Data JPA API-ների օգտագործման օրինակներ տրված են Աղյուսակ 4-ում:
В նախագիծ մեր օրինակից Օգտագործվում են Spring Data JPA API-ները, և ավելի շատ տեղեկատվություն հասանելի է Quarkus-ի ձեռնարկում, որը կոչվում է Spring Data JPA ուղեցույց.

Աղյուսակ 4. Աջակցվող Spring Data JPA API-ների օգտագործման օրինակներ:

Աջակցված Spring Data JPA-ի առանձնահատկությունները
օրինակները

CrudRepository

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

Պահոց
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Պահեստային բեկորներ

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

Ստացված հարցման մեթոդներ

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Օգտագործողի կողմից սահմանված հարցումներ

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-ներ

Սխալների հանդուրժողականություն

Սխալների հանդուրժողականության կառուցվածքները շատ կարևոր են կասկադային խափանումները կանխելու և հուսալի միկրոսերվիսային ճարտարապետություն ստեղծելու համար: Գարնանային ծրագրավորողները երկար տարիներ օգտագործում են անջատիչներ սխալների հանդուրժողականության համար: Հիստրիկս. Այնուամենայնիվ, Hystrix-ը երկար ժամանակ չի թարմացվել, սակայն MicroProfile's Fault Tolerance-ն այժմ ակտիվորեն զարգանում է և դրա հետևում մի քանի տարվա արտադրության օգտագործում է: Հետևաբար, Quarkus-ում ծառայությունների հուսալիությունը բարելավելու համար խորհուրդ է տրվում օգտագործել MicroProfile Fault Tolerance API-ները, որոնց օրինակներն օգտագործվում են Աղյուսակ 5-ում: Այս մասին լրացուցիչ տեղեկությունների համար տե՛ս Quarkus ձեռնարկը: Սխալների հանդուրժողականության ուղեցույց.

Աղյուսակ 5. Աջակցվող MicroProfile Fault Tolerance API-ների օգտագործման օրինակներ:

MicroProfile Fault Tolerance-ի առանձնահատկությունները
Նկարագրություն
օրինակները

@Ասինխրոն

Տրամաբանության իրականացում առանձին թեմայում

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

@Bulkhead

Սահմանափակեք միաժամանակյա հարցումների քանակը

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

@CircuitBreaker

Խելացի խափանումների կառավարում և ձախողումներից վերականգնում

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

@Ընկնում ետ

Անհաջողության դեպքում այլընտրանքային տրամաբանություն կանչելը

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

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

Կրկնել

Խնդրի ձախողման դեպքում կրկին փորձեք

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

Ժամկետանց

Խափանման վերահսկման ժամանակի սպառում

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

Ստուգման ծառայություններ (Service Health)

Kubernetes հարթակները վերահսկում են բեռնարկղերի առողջությունը՝ օգտագործելով հատուկ ծառայություններ։ Որպեսզի հիմքում ընկած հարթակը վերահսկի ծառայությունները, Spring ծրագրավորողները սովորաբար օգտագործում են հատուկ HealthIndicator և Spring Boot Actuator: Quarkus-ում դա կարելի է անել MicroProfile Health-ի միջոցով, որը լռելյայն կատարում է աշխուժության ստուգում, բայց կարող է կազմաձևվել այնպես, որ միաժամանակ ստուգի աշխուժությունն ու պատրաստակամությունը: Աջակցվող MicroProfile Health API-ների օգտագործման օրինակները տրված են Աղյուսակ 6-ում, իսկ լրացուցիչ տեղեկություններ՝ Quarkus ձեռնարկում: Առողջության ուղեցույց.

Աղյուսակ 6. աջակցվող MicroProfile Health API-ների օգտագործման օրինակներ:

MicroProfile Առողջության առանձնահատկությունները
Նկարագրություն
օրինակները

@Liveness

Պլատֆորմը վերագործարկում է անհաջող բեռնարկղային հավելվածները
Վերջնական կետ.
հյուրընկալող:8080/առողջություն/կենդանի

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

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

@Պատրաստություն

Պլատֆորմը չի ուղարկի երթևեկություն դեպի կոնտեյներային հավելվածներ, եթե այն պատրաստ չէ
Վերջնական կետ.
հյուրընկալող:8080/առողջություն/պատրաստ

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

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

Չափումներ

Հավելվածները տրամադրում են չափումներ կամ գործառնական նպատակներով (արդյունավետության SLA-ները վերահսկելու համար) կամ ոչ գործառնական նպատակներով (բիզնես SLAs): Գարնանային մշակողները տրամադրում են չափումներ՝ օգտագործելով Spring Boot Actuator-ը և Micrometer-ը: Իր հերթին, Quarkus-ը օգտագործում է MicroProfile Metrics-ը` տրամադրելու բազային չափումներ (JVM և օպերացիոն համակարգ), վաճառողի չափումներ (Quarkus) և կիրառական չափումներ: MicroProfile Metrics-ը պահանջում է, որ իրականացումն աջակցի JSON և OpenMetrics (Prometheus) ելքային ձևաչափերին: MicroProfile Metrics API-ի օգտագործման օրինակները տրված են Աղյուսակ 7-ում:

В նախագիծ մեր օրինակից MicroProfile Metrics-ն օգտագործվում է հավելվածի չափումներ տրամադրելու համար: Լրացուցիչ տեղեկությունների համար տե՛ս Quarkus ձեռնարկը Չափման ուղեցույց.

Աղյուսակ 7. MicroProfile Metrics API-ների օգտագործման օրինակներ:

MicroProfile Metrics-ի առանձնահատկությունները
Նկարագրություն
օրինակները

@հաշված

Նշանակում է հաշվիչ, որը հաշվում է, թե քանի անգամ է կանչվել ծանոթագրված օբյեկտը

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

@ConcurrentGauge

Նշանակում է չափիչ, որը հաշվում է միաժամանակյա զանգերի քանակը դեպի ծանոթագրված օբյեկտ

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

@Gauge

Նշանակում է չափիչ սենսոր, որը չափում է ծանոթագրված օբյեկտի արժեքը

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

@Metered

Նշում է հաշվիչի սենսորը, որը վերահսկում է ծանոթագրված օբյեկտի զանգի հաճախականությունը

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

Մետրային

Անոտացիա, որը պարունակում է տեղեկատվություն մետատվյալների մասին, երբ ստացվում է չափորոշիչ մուտքագրելու կամ արտադրելու հարցում

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

Ժամանակին

Ցույց է տալիս ժամանակաչափ, որը հետևում է ծանոթագրված օբյեկտի տևողությունը

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

Չափման վերջնակետեր

Դիմումի չափումներ localhost:8080/մետրիկա/հավելված
Հիմնական չափումներ localhost:8080/մետրիկա/հիմք
Վաճառողի չափումներ localhost:8080/մետրիկա/վաճառող
Բոլոր չափումները localhost:8080/մետրիկա

MicroProfile Rest հաճախորդ

Միկրոծառայությունները հաճախ տրամադրում են RESTful վերջնակետեր, որոնց հետ աշխատելու համար պահանջվում են համապատասխան հաճախորդի API-ներ: RESTful վերջնակետեր օգտագործելու համար Spring ծրագրավորողները սովորաբար օգտագործում են RestTemplate: Այս խնդիրը լուծելու համար Quarkus-ն առաջարկում է MicroProfile Rest Client API-ներ, որոնց օգտագործման օրինակները տրված են Աղյուսակ 8-ում:

В նախագիծ մեր օրինակից RESTful վերջնակետերի օգտագործումը կատարվում է MicroProfile Rest Client-ի միջոցով: Այս թեմայի վերաբերյալ լրացուցիչ տեղեկություններ և օրինակներ կարելի է գտնել Quarkus ձեռնարկում Հանգստի հաճախորդի ուղեցույց.

Աղյուսակ 8. MicroProfile Rest Client API-ների օգտագործման օրինակներ:

MicroProfile Rest Client-ի առանձնահատկությունները
Նկարագրություն
օրինակները

@RegisterRestClient

Գրանցում է մուտքագրված Java ինտերֆեյսը որպես REST հաճախորդ

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

@RestClient

Նշում է մուտքագրված REST հաճախորդի ինտերֆեյսի օրինակի իրականացումը

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

Ներողություն

Կանչում է REST վերջնակետ

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

mp-rest/url

Նշում է REST վերջնակետը

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

Արդյունքները

Այս բլոգում, որն ուղղված է հիմնականում Spring ծրագրավորողներին, մենք արագ նայեցինք, թե ինչպես կարելի է օգտագործել Spring API-ները MicroProfile API-ներով Quarkus-ում Java միկրոծառայությունների մշակման համար, այնուհետև դրանք հավաքագրել բնիկ երկուական կոդի մեջ, որը խնայում է հարյուրավոր մեգաբայթ RAM և գործարկում: միլիվայրկյանների հարց:

Ինչպես արդեն հասկացաք, Spring և MicroProfile API-ների աջակցության մասին լրացուցիչ տեղեկություններ, ինչպես նաև շատ այլ օգտակար տեղեկություններ կարելի է գտնել այստեղ. Quarkus ձեռնարկներ.

Source: www.habr.com

Добавить комментарий