Муқаддима
XNUMX март, RedHat (ба зудӣ IBM)
Ҳадаф аз он иборат аст, ки Java ба платформаи пешбари густариши Kubernetes ва таҳияи замимаҳои бе сервер табдил дода, ба таҳиягарон равиши ягонаи рушд дар услубҳои реактивӣ ва императивиро фароҳам меорад.
Агар назар кунед
Суръати хеле баланди оғози барнома ва истеъмоли ками хотира ваъда дода мешавад. Ин аст маълумот аз вебсайти таҳиягар:
Вақт аз оғоз то ҷавоби аввал (ҳо):
Танзимот
РЕТ
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
Кваркус як чаҳорчӯбаи васеъшаванда аст. Дар айни замон фармоиш вуҷуд дорад
хулоса
Ба андешаи ман, Кваркус ба тамоюлҳои замон комилан мувофиқ аст. Таҳияи коди пушти сар осонтар ва осонтар шуда истодааст ва ин чаҳорчӯба рушди хидматро тавассути илова кардани дастгирии ватанӣ барои Docker ва Kubernetes боз ҳам содда ва суръат мебахшад. Бартарии бузург ин дастгирии дарунсохт барои GraalVM ва тавлиди тасвирҳои аз платформа вобаста аст, ки ба хидматҳо имкон медиҳад, ки воқеан зуд оғоз кунанд ва фазои ками хотираро ишғол кунанд. Ва ин дар замони ҳаваси оммавӣ ба хидматрасонии микросерверҳо ва меъмории бе сервер хеле муҳим аст.
Сомонаи расмӣ -
Манбаъ: will.com