Ngày nay, việc phát triển và deploy các ứng dụng lên Cloud không còn là chuyện quá xa lạ. Chúng ta không cần phải lo lắng nhiều về cơ sở hạ tầng để deploy ứng dụng, mọi thứ Cloud Providers đã setup sẵn, chỉ cần tập trung phát triển ứng dụng mà thôi.
Xu hướng của deploy ứng dụng trên Cloud là làm sao có thể adapt được việc scalable, nói nôm na là chúng ta có thể deploy ứng dụng load balancer, có thể handle một số lượng lớn các request từ người dùng tại cùng một thời điểm. Để làm được điều này, deployment strategy của chúng ta phải đáp ứng được việc số lượng instance của application có thể tăng giảm dựa vào traffic tới application và đồng thời, khi start instance mới để handle request người dùng, thời gian start nhanh nhất có thể.
Đối với các script language như JavaScript, PHP, hay Python thì khi start một instance mới của ứng dụng, gần như chúng có thể handle request từ người dùng liền. Thế nhưng với Java, các ứng dụng cần thời gian start mới có thể handle request được.
Hiểu được những hạn chế đó, có nhiều framework, library mới của Java được giới thiệu để giải quyết ít nhiều vấn đề start time này, hướng tới giúp chúng ta có thể phát triển các ứng dụng Cloud Native với Java. Một trong số đó có Quarkus, một Supersonic Subatomic Java, tối ưu hoá để có thể chạy các ứng dụng Java sử dụng các container trên môi trường Cloud.
Trong bài viết này, mình sẽ giới thiệu với các bạn tổng quan về Quarkus và cách up và running một ứng dụng Java sử dụng Quarkus để xem, thời gian chạy lên một ứng dụng với Quarkus mất bao lâu các bạn nhé!
Đầu tiên, chúng ta hãy nói một xí về thuật ngữ Supersonic Subatomic Java của Quarkus.
Nói nôm na về Supersonic thì như mình nói ở trên, thời gian để một ứng dụng Quarkus có thể start và ready để handle request được giảm đáng kể so với các Java framework khác. Thông thường một ứng dụng RESTful API không có connect tới database, được implement sử dụng các Java framework khác Quarkus, trung bình thời gian start ứng dụng có thể mất khoảng ít nhất 4s, nhưng đối với Quarkus sử dụng HotSpot JVM, thời gian này trung bình chỉ khoảng 0.7s. Nếu Quarkus mà chạy với GraalVM nữa thì thời gian này còn giảm nữa, chỉ còn khoảng 0.01s thôi đó các bạn. Nhờ đó mà các ứng dụng Quarkus gần như có thể start và handle request của người ngay tức thì.
Subatomic thì liên quan đến size của Quarkus application. Khi chúng ta build Quarkus application, tập tin executable của Quarkus sẽ có kích thước nhỏ hơn so với khi chúng ta build các ứng dụng sử dụng các Java framework khác. Một điều nữa là các ứng dụng Quarkus sẽ consume ít memory hơn đó các bạn!
Bây giờ, chúng ta sẽ tạo mới một project Quarkus để làm ví dụ các bạn nhé!
Tạo mới Quarkus project
Tương tự như Spring framework với Spring Initializr https://start.spring.io/, Quarkus cũng có một công cụ giúp chúng ta có thể tạo mới nhanh một Quarkus project tại https://code.quarkus.io/.
Các bạn có thể tạo mới nhanh một ứng dụng RESTful API sử dụng extension Quarkus RESTEasy hoặc theo cơ chế reactive thì sử dụng extension Quarkus REST. Nói nôm na về thuật ngữ extension thì nó giống như dependency vậy đó các bạn!
Ví dụ, mình tạo mới một ứng dụng RESTful API bằng cách khai báo sử dụng extension Quarkus RESTEasy, một implementation của Jakarta EE Java API for RESTful Web Services, như sau:
Các bạn có thể chỉnh sửa thông tin project nếu muốn các bạn nhé!
Nhấn Generate your application:
và download project về máy nhé các bạn.
Kết quả mở project trong IntelliJ:
Mặc định như các bạn thấy, Quarkus Code sẽ generate một class GreetingResource định nghĩa endpoint “/hello” sử dụng JAX-RS như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package com.huongdanjava.quarkus; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; @Path("/hello") public class GreetingResource { @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return "Hello RESTEasy"; } } |
Chạy ứng dụng
Các bạn có thể chạy ứng dụng này lên sử dụng ở development mode sử dụng quarkus-maven-plugin được khai báo sẵn với generated project, bằng cách chạy Maven command như sau:
1 |
compile quarkus:dev |
Mở trình duyệt và đi đến địa chỉ http://localhost:8080/, các bạn sẽ thấy kết quả như sau:
Mở Console của IntellJ, các bạn sẽ thấy những dòng log sau:
1 2 3 4 5 6 7 8 9 10 11 12 |
Listening for transport dt_socket at address: 5005 Press [e] to edit command line args (currently ''), [h] for more options> Tests paused Press [e] to edit command line args (currently ''), [r] to resume testing, [h] for more options> Press [e] to edit command line args (currently ''), [r] to resume testing, [o] Toggle test output, [h] for more options> __ ____ __ _____ ___ __ ____ ______ --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \ --\___\_\____/_/ |_/_/|_/_/|_|\____/___/ 2024-08-07 06:41:41,424 INFO [io.quarkus] (Quarkus Main Thread) quarkus-example 1.0.0-SNAPSHOT on JVM (powered by Quarkus 3.13.0) started in 0.855s. Listening on: http://localhost:8080 2024-08-07 06:41:41,426 INFO [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated. 2024-08-07 06:41:41,426 INFO [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, resteasy, smallrye-context-propagation, vertx] |
Ở dòng 10 của đoạn log trên, nếu các bạn để ý thì thời gian start của ứng dụng ví dụ này là 0.855s. Quá nhanh phải không các bạn?
Nhưng nếu bây giờ các bạn chạy ứng dụng này bằng command line, với tập tin JAR, bằng cách: mở Terminal trên macOS hoặc Linux hoặc Console trên Window, đi đến thư mục project, chạy command:
1 |
mvn clean package |
sau đó thì vào thư mục tartget/quarkus-app, chạy câu lệnh:
1 |
java -jar quarkus-run.jar |
các bạn sẽ thấy kết quả như sau:
Như các bạn thấy, thời gian start ứng dụng bây giờ còn ít hơn cả một nửa lúc chúng ta chạy ở development mode trong IntelliJ, chỉ còn 0.355s.
Nếu các bạn build ứng dụng này với profile native sử dụng GraalVM với native-image component, với command:
1 |
mvn package -Dnative |
thì các bạn có thể chạy trực tiếp ứng dụng sử dụng tập tin quarkus-example-1.0.0-SNAPSHOT-runner trong thư mục target của project.
Thời gian start ứng dụng sẽ làm các bạn kinh ngạc như sau:
Nhanh lắm các bạn, chỉ cần nhấn execute command là ứng dụng start liền. Như các bạn thấy, chỉ mất 0.014s là ứng dụng ví dụ của chúng ta đã up và running rồi. Đây cũng chính là thời gian mà ứng dụng có thể up và running trên môi trường Cloud đó các bạn.
Quá ổn phải không các bạn?
Sabrac
Ngoài startup time ra thì quarkus có gì ưu việt hơn ko bác?
Dù là deploy lên cloud vẫn luôn có health check các thứ để hỗ trợ rolling deploy mà