Кваркус як Java-и субатомӣ аст. Шарҳи мухтасари чаҳорчӯба

Кваркус як Java-и субатомӣ аст. Шарҳи мухтасари чаҳорчӯба

Муқаддима

XNUMX март, RedHat (ба зудӣ IBM) муаррифӣ кард чаҳорчӯбаи нав - Кваркус. Ба гуфтаи таҳиягарон, ин чаҳорчӯба ба GraalVM ва OpenJDK HotSpot асос ёфтааст ва барои Kubernetes тарҳрезӣ шудааст. Ба стеки Quarkus дохил мешаванд: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus ва дигарон.

Ҳадаф аз он иборат аст, ки Java ба платформаи пешбари густариши Kubernetes ва таҳияи замимаҳои бе сервер табдил дода, ба таҳиягарон равиши ягонаи рушд дар услубҳои реактивӣ ва императивиро фароҳам меорад.

Агар назар кунед ин таснифоти чаҳорчӯбаҳо, пас Quarkus дар ҷое дар байни "Агрегаторҳо/генераторҳои код" ва "Чорчӯбаҳои пурраи сатҳи баланд" ҷойгир аст. Ин аллакай бештар аз агрегатор аст, аммо он ҳатто ба пуррагӣ намерасад, зеро... барои таҳияи пуштибонӣ пешбинӣ шудааст.

Суръати хеле баланди оғози барнома ва истеъмоли ками хотира ваъда дода мешавад. Ин аст маълумот аз вебсайти таҳиягар:

Вақт аз оғоз то ҷавоби аввал (ҳо):

Танзимот
РЕТ
REST+JPA

Quarkus+GraalVM
0.014
0.055

Quarkus+OpenJDK
0.75
2.5

Стеки анъанавии Cloud Native*
4.3
9.5

Истеъмоли хотира (Мб):

Танзимот
РЕТ
REST+JPA

Quarkus+GraalVM
13
35

Quarkus+OpenJDK
74
130

Стеки анъанавии Cloud Native*
140
218

Таъсирбахш, ҳамин тавр не?

*Ман дар бораи ин стеки технологӣ ягон маълумоте наёфтам, мо метавонем тахмин кунем, ки ин як навъ Boot баҳорӣ бо маҷмӯаи иловагии бадан аст.

Салом Ҷаҳон!

Соддатарин барномае, ки дар Кваркус навишта шудааст, чунин хоҳад буд:

@Path("/hello")
public class GreetingResource {

   @GET
   @Produces(MediaType.TEXT_PLAIN)
   public String hello() {
       return "hello";
   }
}

Ин аслан як синф аст ва ин кифоя аст! Шумо метавонед барномаро бо истифода аз Maven дар реҷаи рушд иҷро кунед:

mvn compile quarkus:dev
…
$ curl http://localhost:8080/hello
hello

Фарқият аз замимаи муқаррарӣ дар он аст, ки синфи Application вуҷуд надорад! Quarkus дубора боркунии гармро дастгирӣ мекунад, то шумо метавонед замимаи худро бидуни аз нав оғоз кардани он тағир диҳед ва рушдро боз ҳам тезтар кунед.

Баъд чӣ? Шумо метавонед хидматро ба контроллер бо истифода аз эзоҳ илова кунед Тазриқ намоед. Рамзи хидмат:

@ApplicationScoped
public class GreetingService {

   public String greeting(String name) {
       return "Hello " + name + "!";
   }
}

Назоратчӣ:

@Path("/hello")
public class GreetingResource {

   @Inject
   GreetingService service;

   @GET
   @Produces(MediaType.TEXT_PLAIN)
   @Path("/{name}")
   public String greeting(@PathParam("name") String name) {
       return service.greeting(name);
   }
}

$ curl http://localhost:8080/hello/developer
Hello developer!

Дар хотир доред, ки Quarkus эзоҳҳои стандартиро аз чаҳорчӯбаҳои шинос - CDI ва JAX-RS истифода мебарад. Албатта, агар шумо қаблан бо CDI ва JAX-RS кор карда бошед, ҳеҷ чизи навро омӯхтан лозим нест.

Кор бо базаи маълумот

Аннотацияҳои интизорӣ ва стандартии JPA барои объектҳо истифода мешаванд. Мисли контроллерҳои REST, шумо бояд ҳадди аққал код нависед. Барои нишон додани вобастагӣ дар файли ассамблея, илова кардани эзоҳҳо кофӣ аст @Entity ва манбаи маълумотро дар application.properties танзим кунед.

Ҳама. Не sessionFactory, persistence.xml ё дигар файлҳои хидматӣ. Мо танҳо рамзи лозимаро менависем. Аммо, агар лозим бошад, шумо метавонед файли persistence.xml эҷод кунед ва қабати ORM-ро дақиқтар танзим кунед.

Quarkus кэшкунии объектҳо, коллексияҳо барои муносибатҳои як ба бисёр ва дархостҳоро дастгирӣ мекунад. Дар назари аввал он бузург менамояд, аммо он маҳаллӣ кэшкунӣ, барои як гиреҳи Kubernetes. Онхое. Кэшҳои гиреҳҳои гуногун бо ҳамдигар ҳамоҳанг карда намешаванд. Ман умедворам, ки ин муваққатӣ аст.

Иҷрои коди асинхронӣ

Тавре ки дар боло зикр гардид, Quarkus инчунин услуби барномасозии реактивиро дастгирӣ мекунад. Рамзи аризаи қаблиро дар шакли дигар навиштан мумкин аст.

@Path("/hello")
public class GreetingResource {

   @GET
   @Produces(MediaType.TEXT_PLAIN)
   @Path("/{name}")
   public CompletionStage<String> greeting(@PathParam("name") String name) {
       return CompletableFuture.supplyAsync(() -> {
           return "Hello " + name + "!";
       });
   }
}

Рамзи асинхронӣ низ метавонад ба хидмат интиқол дода шавад, натиҷа ҳамон хоҳад буд.

санҷиши

Санҷишҳо барои барномаҳои Quarkus метавонанд дар JUnit4 ё JUnit5 навишта шаванд. Дар зер намунаи санҷиши нуқтаи ниҳоӣ оварда шудааст, ки он бо истифода аз RestAssured навишта шудааст, аммо чаҳорчӯбаи дигарро метавон истифода бурд:

@QuarkusTest
public class GreetingResourceTest {

   @Test
   public void testGreetingEndpoint() {
       String uuid = UUID.randomUUID().toString();
       given()
         .pathParam("name", uuid)
         .when().get("/hello/{name}")
         .then()
           .statusCode(200)
           .body(is("Hello " + uuid + "!"));
   }
}

Шарҳи @QuarkusTest ба шумо дастур медиҳад, ки пеш аз санҷишҳо барномаро иҷро кунед. Қисми боқимонда рамзест, ки ба ҳама таҳиягарон шинос аст.

Барномаи мушаххаси платформа

Азбаски Quarkus бо GraalVM зич муттаҳид шудааст, албатта тавлид кардани коди мушаххаси платформа имконпазир аст. Барои ин, шумо бояд GraalVM-ро насб кунед ва тағирёбандаи муҳити GRAALVM_HOME-ро муайян кунед. Минбаъд профилро барои ҷамъомад сабт кунед ва онро ҳангоми сохтани барнома муайян кунед:

mvn package -Pnative

Ҷолиб он аст, ки барномаи тавлидшуда метавонад санҷида шавад. Ва ин муҳим аст, зеро иҷрои рамзи аслӣ метавонад аз иҷрои JVM фарқ кунад. Тавсифи @SubstrateTest рамзи барномаи мушаххаси платформаро иҷро мекунад. Истифодаи такрории коди санҷишии мавҷуда метавонад бо истифода аз мерос анҷом дода шавад; дар натиҷа, код барои санҷиши барномаи вобаста ба платформа чунин хоҳад буд:

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

Тасвири тавлидшуда метавонад дар Docker бастабандӣ карда шавад ва дар Kubernetes ё OpenShift иҷро карда шавад, ки дар муфассал тавсиф карда шудааст. дастурҳо.

Toolkit

Чаҳорчӯбаи Quarkus метавонад бо Maven ва Gradle истифода шавад. Баръакси Gradle, Maven пурра дастгирӣ карда мешавад. Мутаассифона, дар айни замон Gradle тавлиди лоиҳаи холиро дастгирӣ намекунад; дар вебсайт маълумоти муфассал мавҷуд аст. китоби дарсӣ.

Extensions

Кваркус як чаҳорчӯбаи васеъшаванда аст. Дар айни замон фармоиш вуҷуд дорад 40 васеъшавӣ, ки функсияҳои гуногунро илова мекунанд - аз дастгирӣ Контейнери баҳори DI и Apache Camel пеш аз сабт кардан ва нашри ченакҳо барои хидматҳои иҷрошаванда. Ва ба ғайр аз Java, аллакай як тамдиди дастгирии навиштани замимаҳо дар Котлин мавҷуд аст.

хулоса

Ба андешаи ман, Кваркус ба тамоюлҳои замон комилан мувофиқ аст. Таҳияи коди пушти сар осонтар ва осонтар шуда истодааст ва ин чаҳорчӯба рушди хидматро тавассути илова кардани дастгирии ватанӣ барои Docker ва Kubernetes боз ҳам содда ва суръат мебахшад. Бартарии бузург ин дастгирии дарунсохт барои GraalVM ва тавлиди тасвирҳои аз платформа вобаста аст, ки ба хидматҳо имкон медиҳад, ки воқеан зуд оғоз кунанд ва фазои ками хотираро ишғол кунанд. Ва ин дар замони ҳаваси оммавӣ ба хидматрасонии микросерверҳо ва меъмории бе сервер хеле муҳим аст.

Сомонаи расмӣ - quarkus.io. Намунаҳои лоиҳаҳо барои оғози зуд аллакай дастрасанд GitHub.

Манбаъ: will.com

Илова Эзоҳ