Series Quarkus - Tập 1: Quarkus là gì và cách khởi tạo
Các kiến trúc Java stacks truyền thống chẳng hạn như kiến trúc Monolithic
Ta thường viết tất cả các Authorization, presentation,business,... chung một project và như ví dụ trên ta có
- Tính năng Checkout
- Tính năng quản lí đơn hàng (OMS - Order Management System)
- Tính năng quản lí tồn kho (Inventory)
- Tính năng quản lí thông tin sản phẩm (Merchandise)
Và cuối cùng ta cấp cho project này 4 Cores CPU, 12GB Ram, 10TB ổ cứng.
Với mô hình này chỉ ổn định với những cửa hàng nhỏ, lượng request thấp, nhưng nếu áp dụng với những quy mô lớn hơn với lượng request ngày càng tăng, thì việc scale duplicate một instance (scale theo chiều ngang) là điều cần thiết.
Nếu như giả định tính năng Checkout là xử lý nhiều lượng request nhất và yêu cầu phải tăng gấp đôi tài nguyên mới xử lý triệt để nếu không sẽ lăn ra chết 🫠 hoặc ảnh hướng các tính năng khác ở một khung giờ cao điểm. Bây giờ chúng ta phải duplicate thêm 4 Cores CPU, 12GB Ram, 10TB ổ cứng.
Suy ra bây giờ ta phải mất đến 8 Cores CPU, 24GB Ram, 20TB ổ cứng để cho tính năng Checkout hoạt động ổn định.
Đáng ra ta chỉ cần cấp tài nguyên đúng vào chỗ tính năng checkout nên việc cấp thêm như vậy sẽ gây thừa thải và tốn chi phí.
Do đó, mô hình Microservice ra đời để tách biệt và tránh ảnh hưởng các tính năng khác.
Nếu áp dụng Microservice vào project này thì ta sẽ có
- Checkout Service
- OMS Service (Order Management System)
- Inventory Service (Inventory)
- Merchandise Service (Merchandise)
Chúng ta cũng sẽ cấp cho các service này 4 Cores CPU, 12GB Ram, 10TB ổ cứng. những chia đều ra.
Cũng là service của Checkout có lượng request lớn hơn rất nhiều so với tất cả service khác, thì lúc này ta chỉ cần duplicate instance của Checkout service, tách biệt, dễ dàng monitoring và tối ưu chi phí rất nhiều so với kiến trúc truyền thống.
Và Quarkus một Framework dành cho ngôn ngữ Java được ra đời để phát triển phục vụ cho mô hình Microservice.
Quarkus là một Java framework mới, release lần đầu vào tháng 3 năm 2019, được tạo ra cho dành cho các Java developers tạo ra những ứng dụng theo hướng điện toán đám mây (Cloud-native). Nó tối ưu cho GraalVM và HotSpot, cho phép thời gian khởi động nhanh và dung lượng bộ nhớ thấp.
Quarkus được thiết kế chạy trên Kubernetes, một nền tảng phổ biến để triển khai và quản lý các ứng dụng đồng thời cũng cung cấp số liệu và theo dõi.
Quarkus còn là một Open Source được cấp phép Apache License version 2.0. Quan trọng nhất nó là một cộng đồng mở nơi mà tất cả các nhà phát triển có thể đóng góp, ý tưởng, thảo luận một cách cởi mở,...
Vậy tại sao ta không dùng Spring có cộng đồng lớn hơn ? Ở đây mình sẽ không so sánh giữa 2 framework này với nhau, mình chỉ muốn giới thiệu tới mọi người một framework mới để có thêm nhiều lựa chọn cho các dự án.
Nhưng nếu bạn muốn tham khảo có thể đọc thêm về sự so sánh của 2 ông này tại đây nhe.
Tạo project trong Quarkus
Đầu tiên mình sẽ hướng dẫn các bạn làm quen cách tạo một project Java với Quarkus và tương tác API.
Để khởi tạo một project Quarkus các bạn truy cập vào đây.
Phần CONFIGURE YOUR APPLICATION sẽ có
- Group: Tên group.
- Artifact: Tên aritifact.
- Build Tool: Có 2 lựa chọn, Maven hoặc Gradle. Ở đây mình sử dụng Maven.
- Version: Version của dự án.
- Java Version: Phiên bản Java. Ở đây mình dùng Java 17.
- Starter Code: Yes
- Filter & Search: Bên dưới thanh Filter & Search là danh sách các thư viện mà Quarkus gợi ý cho bạn. Ở đây mình sẽ search và tích vào thư viện RESTEasy Classic Jackson thư viện này sẽ convert về dạng json để response cho phía Client.
Khi đã hoàn tất bạn nhấn vào button Generate your application và click vào DOWNLOAD THE ZIP project sẽ download xuống máy của bạn.
Sau khi giải nến file .zip mở Text Editor hoặc Idle yêu thích của các bạn. Ở đây mình sử dụng IntelliJ IDEA
Đây là cấu trúc thư mục của project. Thông thường các bạn chỉ cần quan tâm đến thư mục src và file pom.xml
Trong thư mục src -> main -> java -> org.duynd.pratice (thư mục mà bạn đã đặt tên Group trước đó) chúng ta sẽ code chủ yếu ở trong này.
Thư mục resources chúng ta sẽ sử dụng file application.properties để cấu hình những thứ cần thiết khi trong giai đoạn phát triển.
Tương tác với API
Click vào file GreetingResource
Đây là file default Quarkus tạo cho mình khi thêm thư viện RESTEasy Classic Jackson trước đó.
package org.duynd.practice;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/hello")
public class GreetingResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "Hello RESTEasy";
}
}
@Path
: Sử dụng Anotation này khi bạn muốn định nghĩa Class đó là Controller.
Vậy khi bạn run trên browser với url http://localhost:8080/hello thì chương tình sẽ thực thi function hello()
và trả về cho bowser. Tại sao ? Vì bạn đã định nghĩa @Path
ở class thì tất cả function trong Class sẽ có preflix là /hello
.
Ví dụ nếu bạn thêm
@Path("hi")
vào trên method hello()
bạn sẽ có route là http://localhost:8080/hello/hi
@GET
: Anotation này định nghĩa phương thức của giao thức HTTP (GET, POST, PUT, DELETE).
@Produces
: Anotation này định nghĩa phương thức response của method.
Bạn có thể loại bỏ và không sử dụng Anotation này, nhưng nếu muốn scope lại thì sử dụng sẽ rất tốt. Để rõ hơn bài sau mình sẽ nói rõ hơn về ông này.
Ở đây được định nghĩa là MediaType.TEXT_PLAIN
thì method này cho biết nó sẽ trả về một dạng plain text cho Client.
Ok, bây giờ chạy thử chương trình như sau:
./mvnw compile quarkus:dev
Và bây giờ truy cập vào http://localhost:8080/hello bạn sẽ thấy kết quả trả ra.
Bây giờ mình sẽ thêm một method khác và thêm @Path("hi")
để định nghĩa route cho nó thử nha.
package org.duynd.practice;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/hello")
public class GreetingResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "Hello RESTEasy";
}
@GET
@Path("hi")
public String hi() {
return "Hi Nè";
}
}
Và bây giờ thử truy cập đường link http://localhost:8080/hello/hi
Vậy là chúng ta đã tìm hiểu sơ qua cách tạo một project Quarkus và tương tác API một cách cơ bản nhất.
Mình sẽ cố gắng viết một series về Quarkus để những bạn mới có thể tiếp cận và dễ dàng hiểu hơn về nó.
Mong các bạn ủng hộ và góp ý nhé 🥰
All rights reserved