0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Hướng Dẫn Tự Xây Dựng Web Server Framework Cho Java: CabinJv

Đăng vào 1 tuần trước

• 5 phút đọc

Hướng Dẫn Tự Xây Dựng Web Server Framework Cho Java: CabinJv

Chào các bạn!

Chúc mừng năm mới! Mong rằng năm nay mang đến cho các bạn nhiều thành công và hạnh phúc. Nếu bạn đang học lập trình, hãy nỗ lực để có thể kiếm tiền từ kỹ năng của mình nhé! Để không khí năm mới thêm phần vui tươi, hãy cùng nhau khám phá một dự án thú vị.

Trong bài viết này, mình sẽ hướng dẫn các bạn cách xây dựng một web server framework tên là CabinJv. Đây là một framework nhẹ nhàng, linh hoạt, được phát triển dựa trên ý tưởng của Express.js nhưng được điều chỉnh sao cho phù hợp với môi trường Java. CabinJv thích hợp cho những ai cảm thấy Spring Boot quá nặng nề hoặc không muốn làm việc với ServletJetty.

Khởi Động Web Server

Hãy bắt đầu bằng việc khởi động một web server đơn giản bằng Cabin:

java Copy
import com.cabin.express.router.Router;
import com.cabin.express.server.CabinServer;
import com.cabin.express.server.ServerBuilder;

import java.io.IOException;

public class HServerSample {
    public static void main(String[] args) throws IOException {
        CabinServer server = new ServerBuilder().setPort(8080).build();
        Router router = new Router();
        router.get("/", (req, res) -> {
            res.writeBody("Hello World");
            res.send();
        });
        server.use(router);
        server.start();
        System.err.println("Server started at http://localhost:8080");
    }
}

Như vậy, chỉ với vài dòng mã, bạn đã có một web server để hiển thị Hello World. Thật đơn giản phải không? Giờ chúng ta sẽ cùng tìm hiểu cách mà CabinJv được xây dựng.

CabinJv Là Gì?

CabinJv là một web framework đơn giản và nhẹ nhàng dành cho Java. Nó được phát triển hoàn toàn từ đầu mà không dựa vào bất kỳ framework nào có sẵn, sử dụng Java NIO (New Input/Output) và chỉ cần một thư viện Gson để ánh xạ dữ liệu.

Các Phân Khúc Trong Cabin

CabinJv gồm các package chính:

  • http
  • middleware
  • router
  • server
  • worker

Bây giờ hãy đi sâu vào từng package khái quát nhé.

Package HTTP

Package này bao gồm các lớp RequestResponse, cho phép bạn lưu trữ và xử lý các thông tin quan trọng từ yêu cầu và phản hồi tới server. Dưới đây là định nghĩa của lớp Request:

java Copy
public class Request {
    private String method;
    private String path;
    private String body;
    private Map<String, Object> bodyAsJson = new HashMap<>();
    private Map<String, String> queryParams = new HashMap<>();
    private Map<String, String> pathParams = new HashMap<>();
    private Map<String, String> headers = new HashMap<>();

    private static final Gson gson = new Gson();

    public Request(InputStream inputStream) throws Exception {
        parseRequest(inputStream);
        parseBodyAsJson();
    }
    //...
}

Còn đây là định nghĩa của lớp Response:

java Copy
public class Response {
    private int statusCode = 200;
    private Map<String, String> headers = new HashMap<>();
    private Map<String, String> cookies = new HashMap<>();
    private StringBuilder body = new StringBuilder();
    private final SocketChannel clientChannel;

    private static final Gson gson = new Gson();
    //...
}

Với những định nghĩa này, bạn đã có đầy đủ các thông tin cơ bản để xử lý request và response. Mặc dù hiện tại chưa có hệ thống session nhưng mình sẽ cập nhật tính năng này trong các phiên bản tiếp theo.

Middleware

Middleware được sử dụng để xử lý các tác vụ trước khi yêu cầu đến handler. Hiện tại, bạn có thể sử dụng nó như một danh sách quy trình xử lý request. Dưới đây là cách định nghĩa Middleware trong Cabin:

java Copy
public class MiddlewareChain {
    private final Iterator<Middleware> middlewareIterator;
    private final Handler routeHandler;

    public MiddlewareChain(List<Middleware> middleware, Handler routeHandler) {
        this.middlewareIterator = middleware.iterator();
        this.routeHandler = routeHandler;
    }

    public void next(Request request, Response response) throws IOException {
        if (middlewareIterator.hasNext()) {
            Middleware current = middlewareIterator.next();
            current.apply(request, response, this);
        } else if (routeHandler != null) {
            routeHandler.handle(request, response);
        }
    }
}

Router

Router dễ dàng xử lý các endpoint như api/v1/users hoặc các PathParameter như api/v1/users/${userId}/info. Dưới đây là phần định nghĩa của Router cùng cách sử dụng:

java Copy
public class Router {
    private String prefix = "";
    private final Map<String, Map<Pattern, Handler>> methodRoutes = new HashMap<>();
    //...
}

CabinServer

Cuối cùng, chính là CabinServer, nơi cấu hình các router, middleware và logger. Dưới đây là cấu hình tổng quát cho một HTTP server sử dụng Cabin:

java Copy
public class CabinDemoServer {
    public static void main(String[] args) throws IOException {
        CabinServer server = new ServerBuilder().setMaxPoolSize(200).setMaxQueueCapacity(1000).build();
        // Cấu hình router và middleware
        server.start();
    }
}

Kết Quả Thử Nghiệm Hiệu Năng

Web server của mình đạt hiệu suất cao trong quá trình benchmark bằng K6. Với cấu hình VPS 4 core và 4GB RAM, server đã hoạt động ổn định và có khả năng đáp ứng khoảng 100000 yêu cầu từ 1000 người dùng đồng thời mà không gặp trở ngại.

Kết Luận

CabinJv là một project thú vị mà mình đã tự tay xây dựng để tìm hiểu sâu hơn về cách mà web server hoạt động. Nếu bạn cũng đam mê lập trình và tìm hiểu sâu về backend, hãy thử nghiệm với CabinJv nhé! Đừng quên theo dõi các bản cập nhật tiếp theo từ mình. Cảm ơn các bạn đã đọc bài viết này. Chúc các bạn năm mới thật nhiều niềm vui và thành công!


Trà Vinh - 11:58 Sáng Mùng 1 Tết Ất Tỵ 2025
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào