Quên Play đi, hãy đến với ActiveJ: Framework thế hệ mới (Phần 1)
1. Giới thiệu
ActiveJ là một open-source Java platform thế hệ mới, dành cho mục đích xây dựng webservice, microservices với hiệu suất cao
“It is designed to be self-sufficient (no third-party dependencies), simple, lightweight and provides competitive performance. It consists of a number of libraries, from dependency injection and high-performance asynchronous I/O (inspired by Node.js), to application servers and big data solutions”
ActiveJ là kết quả của việc nghiên cứu & phát triển một nền tảng công nghệ quảng cáo phục vụ hơn 200 tỷ yêu cầu mỗi ngày tại AdKernel. Sau hơn 5 năm phát triển, ActiveJ kỳ vọng sẽ tạo ra một giải pháp vượt qua nhược điểm của các hệ sinh thái Java hiện tại. Tập trung vào tính đơn giản, hiệu suất cao và tính nhất quán trong tổng thể ứng dụng
2. Thông số về hiệu suất
Chúng ta cùng xem ActiveJ có những ưu điểm gì:
- Kích thước tệp JAR nhỏ hơn với chỉ 1.4 MB khi so sánh với Spring là 17 MB (1 Framework Java phổ biến)
- Thời gian khởi động từ cold-start rất nhanh, chỉ có 0.65s
- Thư viện DI của ActiveJ nhanh hơn 5.5 lần so với Google Guice và 100 lần so với Spring DI
- ActiveJ Promise nhanh hơn 7 lần so với Java CompletableFuture
- Có thư viện Serializer nhanh nhất trong thế giới JVM
- Có sẵn đầy đủ các thư viện cơ bản về reactive, http. Tạm biệt RxJava, Project Reactor v.v
- Build được ra native-image bằng GraalVM, từ đó tạo ra các ứng dụng Native Cloud dễ dàng
Liên tục đạt top 1 benchmark trong các JVM Frameworks (Chi tiết tại đây)
Mình đã cảm thấy thực sự thích thú về những điều này
3. Các công nghệ trong ActiveJ
“ActiveJ consists of loosely coupled components that complement and extend each other. Some of them can be used as stand-alone libraries.”
ActiveJ-Inject: một thư viện DI (Dependency Injection) nhẹ và nhanh, có thể sử dụng 1 cách độc lập thay thế cho Google Guice và các thư viện DI khác
ActiveJ-Reactive: một tập hợp các thư viện core I/O hiệu suất cao (Eventloop, Promise, Net) và xử lý data stream (CSP, Datastream)
ActiveJ-RPC: một thư viện binary protocol hiệu suất cao dành cho việc xây dựng các hệ thống phân tán hoặc microservices
ActiveJ-FS: Cung cấp những lớp trừu tượng bất đồng bộ dành cho local FS (File System), remote FS hoặc các storage phân tán. Nó có một giao thức gần giống với FTP với các tính năng như: zero-overhead streaming and supports data redundancy, rebalancing and resharding
ActiveJ-Serializer: cung cấp tính năng hỗ trợ đầy đủ cho subclasses, collections (bao gồm cả Maps) và các collections chuyên biệt như HPPC. Có thể sử dụng như 1 thành phần độc lập
ActiveJ-Specializer: 1 công nghệ mới giúp cải thiện hiệu suất của các class trong runtime. Nó sử dụng thư viện ASM(Assembly) để tự động chuyển đổi các class instances thành các static classes và các class instance fields thành static fields. Điều này cho phép thực hiện nhiều loại tối ưu hóa cho các lớp tĩnh mà không thể thực hiện được bằng cách khác như: dead code elimination, aggressively inlining methods, static constants. Trong nhiều tình huống khác nhau, hiệu suất có thể đạt tới 30% -50%.
4. Coding time
Trong phần này, chúng ta sẽ tạo ra 1 ứng dụng webservice đơn giản sử dụng Scala với ActiveJ
Bạn sẽ cần cài đặt trước các thành phần cơ bản như: môi trường java, sbt, scala, IDEA
Các thông số thành phần ở máy mình:
- Java: GraalVM CE 22.2.0 với JDK 17. Sử dụng GraalVM để sau này build native-image
- Sbt: v1.8.2
- Scala: v2.13.11
- IDEA: IntelIJ đã cài đặt sẵn plugin sbt & scala
- OS: MacOs với chip M1
4.1 Tạo sbt project
Bật terminal và paste command sau: sbt new scala/hello-world.g8
Hoặc bạn xem hướng dẫn chi tiết hơn tại đây
Điền tên project là: scala-activej và bạn có được project structure như ảnh bên dưới
Bạn thêm 2 thư viện như sau:
- “ch.qos.logback” % “logback-classic” % “1.4.8” => Cho việc hiển thị log
- “io.activej” % “activej-launchers-http” % “5.5” => Thư viện activeJ với full core component
4.2 Chỉnh sửa Main class
Giải thích các điểm cần chú ý:
- Chúng ta cần: extends HttpServerLauncher
- @Provides: Đây một là khai báo cho DI, tạo ra 1 instance AsyncServlet trong DI container, để các component khác có thể Inject và sử dụng
- Cần tạo 1 AsyncServlet: cái này giống như 1 Route Center, nhận request và điều hướng nó đến nơi xử lý. Sau này, chúng ta sẽ đến các ví dụ phức tạp hơn
- Thêm nội dung trong hàm main: Main.launch(args). Mục đích để gọi hàm launch của ActiveJ để start webservice
4.3 Chạy & Test
Có 2 cách chạy ứng dụng:
- Cách 1: Chạy thẳng qua Main class
- Cách 2: Sử dụng sbt qua command: sbt run
Sử dụng 1 trong 2 cách trên ta sẽ thấy log như sau:
Ứng dụng sẽ chạy tại địa chỉ: http://localhost:8080/
Paste vô trình duyệt và ta sẽ thấy màn hình hiển thị text: Hello World
Chúng ta đã hoàn thành 1 ví dụ cơ bản sử dụng Scala cùng với ActiveJ. Trong các bài viết tiếp theo, chúng ta sẽ đến với những ví dụ phức tạp như: exception handler, config loader, security, DI config v.v
Cảm ơn mọi người đã dành thời gian để đọc.