Thêm một lựa chọn nữa dành cho lập trình viên Java trong việc tạo ra các ứng dụng web microservice

Giới thiệu

Theo Trang www.infoq.com, thời gian vừa qua Oracle tuyên bố chính thức phát hành một Web Java Framework mới mã nguồn mở được thiết kế cho việc tạo ra các microservices appilcations có tên là Helidon Framework. Helidon Framework ban đầu có tên là J4C (Java for Cloud), và giống như với tên gọi của mình (khí Heli)  Helidon Framework được thiết kế với tiêu chí là một Framework nhanh và đơn giản. 

Vì sao Oracle lại tạo ra Helidon Framework trong khi đã có J2EE?

Theo như trả lời phỏng vấn của InfoQ với Dmitry Kornilov - senior software development manager của Oracle:

"Chúng tôi đã bắt đầu dự án Helidon đã được một thời gian rồi. Bây giờ Kiến trúc Microservices đã bắt đầu trở nên rất phổ biến trong việc tạo những dịch vụ đám mây (cloud services) đồng thời cũng là lúc cũng cần phải thay đổi những trải nghiệm cho lập trình viên trong việc sử dụng nó. That's how Helidon was born. JavaEE tuy vốn là 1 công nghệ đã được ổn định rồi nhưng bản thân có chứa quá nhiều code cũ từ những phiên bản cũ. Thay cho việc  phát triển và xây dựng Kiến trúc Microservices trên nền tảng JavaEE, chúng tôi nhận ra rằng chúng ta cần 1 framework hỗ trợ cho lập trình viên có thể giúp họ xây dựng được Microservices mà không cần đến J2EE. Và thế là Helidon được ra đời." (Dmitry Kornilov).

Kiến trúc của Helidon Framework

Helidon Bao gồm 2 phiên bản là Helidon SE (Standard Edition) và Helion MP (Microprofile). Vậy sự khác nhau giữa 2 phiên bản là gì ?

  • Helidon SE: là phần core nền tảng của Helidon Framework, dùng để tạo ra các Rest API, Microservice đi kèm các cấu hình cho phép tuỳ chỉnh bởi lập trình viên và 1 module bảo mật (Security) cho các Microservice resouces. Với các ứng dụng được tạo ra bởi Helidon SE, chúng không cần bất kỳ application server nào (Glass Fish, JBoss, TomcatEE,...) để vận hành. Lập trình viên chỉ cần build toàn bộ ứng dụng thành 1 gói Jar Executable và run với lệnh 
    java -jar  <app_name>.jar

    Và ngay lập tức chúng ta có ngay một ứng dụng web server. Cách làm này khá giống với Spring Boot của Spring Framework, có điều Spring đã làm điều này từ năm 2014 rồi. 

  • Helidon MP: Là một implementation theo chuẩn MicroProfile 1.1 cũng dùng để build những Microservice application. Phiên bản này là sự lựa chọn của Oracle dành cho các lập trình viên đã có kinh nghiệm làm việc với các implementation của J2EE, ví dụ như JBoss Wildfly, .... Helidon MP cho phép lập trình viên vừa vận dụng được sự đơn giản cho việc cấu hình theo chuẩn của Helidon và đồng thời cũng sử tái sử dụng lại được các  khái niệm quen thuộc của J2EE: @ApplicationScoped, @ApplicationPath, @Inject, ... Về mặt kiến trúc Helidon MP là một layer được xây dựng dựa trên phần core chính là Helidon SE.
  • Ngoài ra, Oracle Cloud còn hỗ trợ một số thành phần tuỳ chọn (optional) cho cả Helidon SE và Helidon MP.

Và tiếp theo đây là một số khái niệm và component chính cúa Helidon.

Web Server

Web server Helidon Framework là một Web server asynchronous (bất đồng bộ) và là 1 and reactive API server chạy trên nền Application Server Netty. Và hơn thế nữa, cú pháp khai báo của Helidon chịu sự ảnh hưởng bởi NodeJs và các Java Framework khác, như ở đây chúng ta có thể nhìn qua một chương trình Helidon đơn giản với cấu hình:

 public static void main(String[] args) throws Exception {
        WebServer webServer = WebServer
                .create(Routing.builder()
                        .any((req, res) -> res.send("It works!")) 
                        .build())
                .start() 
                .toCompletableFuture()
                .get(10, TimeUnit.SECONDS); 

        System.out.println("Server started at: https://localhost:" + webServer.port()); 
    }

Ví dụ trên có thể xem như chính là ví dụ Hello World của Helidon, sau khi start chương trình từ IDE bất kỳ Eclipse, IntelliJ, ... các bạn sẽ thấy được dòng log của chương trình đã được khởi tạo thành công cùng với số port: "Server started at: https://localhost:xx" . Các bạn truy cập vào đường dẫn bất kỳ của web app nói trên tất cả đều sẽ trả về dòng text  "It works!".

Cú pháp trên cũng khá giống với cú pháp của một Framework mà TheCodeRoot đã giới thiệu đến với các bạn trong thời gian trước, đó chính là Framework Javalin, các bạn có thể tìm lại và xem ở trang chuyên mục Javalin

Configuration

Helidon hỗ trợ Configuration component nhiều cách để đọc các thông số config dưới format key/value. Mặc định config sẽ được đọc từ file application.properties hoặc application.yaml trong thư mục /src/main/resources - Hoàn toàn giống với cách làm của Spring Boot từ cách đặt tên file cho đến vị trí folder. Một ví dụ về khai báo config properties trong Helidon Framework:

// application.yaml
server:
 port: 8080
 host: 0.0.0.0

// starts the server on a port defined in application.yaml
public void startWebServerUsingDefinedPort() throws Exception {
    Config config = Config.create();
    ServerConfiguration serverConfig = ServerConfiguration.fromConfig(config.get("server"));
    WebServer webServer = WebServer
           .create(serverConfig,Routing.builder()
                   .any((req,res) -> res.send("It works!" + "\n"))
                   .build())
           .start()
           .toCompletableFuture()
           .get(10,TimeUnit.SECONDS);
    System.out.println("Server started at: https://localhost:" + webServer.port() + "\n");
    webServer.shutdown().toCompletableFuture();
    }
    

   

Security

Module Security hỗ trợ cho lập trình viên tạo ra cơ chế Authentication (login/logout), Authorizartion (roles and functions) và audit (check security) cho ứng dụng Microservice. Helidon hỗ trợ 3 cách có thể xây dựng Security cho một Helidon application: từ Builder, từ Configuration hoặc kết hợp cả 2 phương pháp trên. Ví dụ về cấu hình Security trong Helidon Framework.

// application.yaml
http-basic-auth:
 users:
   login: "mpredli"
   password: "${CLEAR=somePassword}"
   roles: ["user","admin"]

Config config = Config.create();
Security security = Security.builder()
       .config(config)
       .addProvider(...)
       .build();
String user = config.get("http-basic-auth.users.login").asString();
String password = config.get("http-basic-auth.users.password").asString();
System.out.println("\n");
System.out.println("INFO: user = " + user);
System.out.println("INFO: password = " + password);
SecurityTime time = SecurityTime.builder().build();
time = security.getServerTime();
System.out.println("INFO: server time = " + time.toString());
System.out.println("\n");

Các ưu điểm chính của Helidon Framework

Đơn giản và nhanh - Simple And Fast (Helidon SE)

Như đã giới thiệu ở trên Helidon được dùng chủ yếu cho các Web Microservice nhỏ. Cũng giống như Javalin các bước setup cho Helidon cực kỳ đơn giản, các bạn chỉ cần thêm 1 maven dependency như sau:

<dependency>
    <groupId>io.helidon.webserver</groupId>
    <artifactId>helidon-webserver</artifactId>
    <version>0.10.4</version>
</dependency>

Hoặc phiên bản Web Server chạy với Netty:

<dependency>
    <groupId>io.helidon.webserver</groupId>
    <artifactId>helidon-webserver-netty</artifactId>
    <version>0.10.4</version>
    <scope>runtime</scope>
</dependency>

Và hàm Main để chạy ứng dụng:

    public static void main(String[] args) throws Exception {
        WebServer webServer = WebServer
                .create(Routing.builder()
                        .any((req, res) -> res.send("It works!")) 
                        .build())
                .start() 
                .toCompletableFuture()
                .get(10, TimeUnit.SECONDS); 

        System.out.println("Server started at: https://localhost:" + webServer.port()); 
    }

Và để đáp ứng được tiêu chí nhanh-gọn, Helidon cũng chọn giải pháp là build và chạy trực tiếp trên gói Jar, tương tự như Spring BootJavalin.

Hỗ trợ Microprofile (Helidon MP)

Về bản chất Helidon là tập hợp của nhiều thư viện Java dành cho các lập trình viên. Và một điều khác biệt của Helidon so với Spring Boot hay Javalin là sự hỗ trợ cho phát triển API với JAX-RS, điều này sẽ giúp cho các lập trình viên quen làm việc với EJB (Enterprise Java Bean) có cơ hội tiếp cận nhanh hơn, mặt khác điều này cũng sẽ giúp cho việc training JAX-RS trở nên dễ dàng hơn trước khi mà lập trình viên không cần phải cài đặt cả bộ Framework EJB cồng kềnh. 

Helidon Framework vừa có thể hỗ trợ tạo nhanh Kiến trúc Microservices như Javalin mà lại vừa có thể hỗ trợ được chuẩn Microprofile do đó lập trình viên sẽ cần ít nhiều thời gian nghiên cứu và trải nghiệm vào những dự án thực tế để có thể nắm bắt được Helidon. Trong các bài tiếp theo TheCodeRoot sẽ tiếp tục gửi đến các bạn những bài hướng dẫn cơ bản về cách sử dụng Helidon Framework.  

Chúc các bạn thành công.

AutoCode.VN

minhnhatict@gmail.com Helidon