1. Въведение
В днешно време е много често да пишете приложение и да се разполагате в облака и да не се притеснявате за инфраструктурата. Без сървъри и FaaS станаха много популярни.
В този тип среда, където екземплярите се създават и унищожават често, времето за зареждане и времето за първа заявка са изключително важни, тъй като те могат да създадат напълно различно потребителско изживяване.
Езиците като JavaScript и Python винаги са в центъра на вниманието при този тип сценарии. С други думи, Java с дебелите си JAR и дългото време за зареждане никога не е била най-добрият претендент.
В този урок ще представим Quarkus и ще обсъдим дали това е алтернатива за по-ефективно привеждане на Java в облака .
2. QuarkusIO
QuarkusIO, свръхзвуковата субатомна Java, обещава да достави малки артефакти, изключително бързо време за стартиране и по-ниско време до първата заявка. Когато се комбинира с GraalVM, Quarkus ще компилира преди време (AOT).
И тъй като Quarkus е изграден на върха на стандартите, не е нужно да научаваме нищо ново. Следователно можем да използваме CDI и JAX-RS, наред с други. Също така Quarkus има много разширения, включително такива, които поддържат Hibernate, Kafka, OpenShift, Kubernetes и Vert.x.
3. Първото ни заявление
Най-лесният начин да създадете нов проект на Quarkus е да отворите терминал и да напишете:
mvn io.quarkus:quarkus-maven-plugin:0.13.1:create \ -DprojectGroupId=com.baeldung.quarkus \ -DprojectArtifactId=quarkus-project \ -DclassName="com.baeldung.quarkus.HelloResource" \ -Dpath="/hello"
Това ще генерира скелета на проекта, HelloResource с изложена / hello крайна точка, конфигурация, проект Maven и Dockerfiles.
След като се импортират в нашата IDE, ще имаме структура, подобна на показаната на изображението по-долу:

Нека разгледаме съдържанието на класа HelloResource :
@Path("/hello") public class HelloResource { @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return "hello"; } }
Засега всичко изглежда добре. В този момент имаме просто приложение с една крайна точка RESTEasy JAX-RS. Нека продължим и да го тестваме, като отворим терминал и изпълним командата:
./mvnw compile quarkus:dev:

Нашата REST крайна точка трябва да бъде изложена на localhost: 8080 / здравей. Нека го тестваме с командата curl :
$ curl localhost:8080/hello hello
4. Горещо презареждане
Когато работи в режим на разработка ( ./mvn компилира quarkus: dev ), Quarkus предоставя възможност за презареждане с горещо зареждане. С други думи, промените, направени в Java файлове или в конфигурационни файлове, ще бъдат автоматично компилирани, след като браузърът се обнови . Най-впечатляващата характеристика тук е, че не е нужно да запазваме файловете си. Това може да бъде добро или лошо, в зависимост от нашите предпочитания.
Сега ще модифицираме нашия пример, за да демонстрираме възможността за презареждане на горещо. Ако приложението е спряно, можем просто да го рестартираме в режим на разработка. Ще използваме същия пример като преди като начална точка.
Първо ще създадем клас HelloService :
@ApplicationScoped public class HelloService { public String politeHello(String name){ return "Hello Mr/Mrs " + name; } }
Сега ще модифицираме класа HelloResource , инжектирайки HelloService и ще добавим нов метод:
@Inject HelloService helloService; @GET @Produces(MediaType.APPLICATION_JSON) @Path("/polite/{name}") public String greeting(@PathParam("name") String name) { return helloService.politeHello(name); }
След това нека тестваме новата ни крайна точка:
$ curl localhost:8080/hello/polite/Baeldung Hello Mr/Mrs Baeldung
Ще направим още една промяна, за да покажем, че същата може да се приложи към файлове с имоти. Нека редактираме файла application.properties и добавим още един ключ:
greeting=Good morning
След това ще модифицираме HelloService, за да използваме новото ни свойство:
@ConfigProperty(name = "greeting") private String greeting; public String politeHello(String name){ return greeting + " " + name; }
Ако изпълним същата команда curl , сега трябва да видим:
Good morning Baeldung
Можем лесно да опаковаме приложението, като стартираме:
./mvnw package
Това ще генерира 2 jar файла в целевата директория:
- quarkus-project-1.0-SNAPSHOT-runner.jar - изпълним буркан с зависимостите, копирани в target / lib
- quarkus-project-1.0-SNAPSHOT.jar - съдържа класове и файлове с ресурси
Вече можем да стартираме пакетираното приложение:
java -jar target/quarkus-project-1.0-SNAPSHOT-runner.jar
5. Родно изображение
След това ще създадем естествен образ на нашето приложение. Вътрешното изображение ще подобри времето за стартиране и времето за първи отговор. С други думи, той съдържа всичко необходимо за стартиране, включително минималния JVM, необходим за стартиране на приложението .
Като начало трябва да инсталираме GraalVM и да конфигурираме променливата на средата GRAALVM_HOME.
Сега ще спрем приложението (Ctrl + C), ако вече не е спряно, и изпълняваме командата:
./mvnw package -Pnative
Това може да отнеме няколко секунди, за да завършите. Тъй като родните изображения се опитват да създадат целия код AOT, за да стартират по-бързо, в резултат на това ще имаме по-дълги времена за изграждане.
We can run ./mvnw verify -Pnative to verify that our native artifact was properly constructed:

Secondly, we'll create a container image using our native executable. For that, we must have a container runtime (i.e. Docker) running in our machine. Let's open up a terminal window and execute:
./mvnw package -Pnative -Dnative-image.docker-build=true
This will create a Linux 64-bit executable, therefore if we're using a different OS, it might not be runnable anymore. That's okay for now.
The project generation created a Dockerfile.native for us:
FROM registry.fedoraproject.org/fedora-minimal WORKDIR /work/ COPY target/*-runner /work/application RUN chmod 775 /work EXPOSE 8080 CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]
If we examine the file, we have a hint at what comes next. First, we'll create a docker image:
docker build -f src/main/docker/Dockerfile.native -t quarkus/quarkus-project .
Now, we can run the container using:
docker run -i --rm -p 8080:8080 quarkus/quarkus-project
The container started in an incredibly low time of 0.009s. That's one of the strengths of Quarkus.
Finally, we should test our modified REST to validate our application:
$ curl localhost:8080/hello/polite/Baeldung Good morning Baeldung
6. Deploying to OpenShift
Once we're done testing locally using Docker, we'll deploy our container to OpenShift. Assuming we have the Docker image on our registry, we can deploy the application following the steps below:
oc new-build --binary --name=quarkus-project -l app=quarkus-project oc patch bc/quarkus-project -p '{"spec":{"strategy":{"dockerStrategy":{"dockerfilePath":"src/main/docker/Dockerfile.native"}}}}' oc start-build quarkus-project --from-dir=. --follow oc new-app --image-stream=quarkus-project:latest oc expose service quarkus-project
Now, we can get the application URL by running:
oc get route
Lastly, we'll access the same endpoint (note that the URL might be different, depending on our IP address):
$ curl //quarkus-project-myproject.192.168.64.2.nip.io/hello/polite/Baeldung Good morning Baeldung
7. Conclusion
В тази статия демонстрирахме, че Quarkus е чудесно допълнение, което може да донесе Java по-ефективно в облака. Например, сега е възможно да си представим Java на AWS Lambda. Също така Quarkus се основава на стандарти като JPA и JAX / RS. Следователно не е нужно да научаваме нищо ново.
Quarkus привлече много внимание напоследък и много нови функции се добавят всеки ден. Има няколко проекта за бърз старт, за да изпробваме Quarkus в хранилището на Quarkus GitHub.
Както винаги, кодът за тази статия е достъпен в GitHub. Честито кодиране!