Middleware là gì?

Bạn có thể đã nghe người ta sử dụng thuật ngữ "middleware" trong nhiều ngữ cảnh khác nhau và tự hỏi họ đang nói về điều gì. Hãy khám phá tập hợp công nghệ và quy trình rộng lớn và phong phú mà họ có thể đề cập đến!

Middleware có rất nhiều nghĩa

Middleware là một thuật ngữ linh hoạt mà mọi người sử dụng để chỉ những thứ khác nhau. Theo nghĩa rộng nhất có thể, bạn có thể coi nó là "các chương trình chạy giữa những chương trình khác". Nói cách khác, bất kỳ phần mềm nào phụ thuộc vào code riêng biệt để cung cấp đầu vào và xử lý đầu ra.

Một số middleware tồn tại dưới dạng một ứng dụng toàn diện giúp chuyển đổi dữ liệu từ trạng thái này sang trạng thái khác, với các giao thức và định dạng dữ liệu được xác định rõ ràng để code khác sử dụng. Nhưng middleware cũng có thể chi tiết như một hàm duy nhất, nối vào một loạt các hàm khác mà framework chạy.

Giống như nhiều phần mềm, middleware tận dụng khái niệm mô-đun: Chia nhỏ một tiến trình phức tạp thành các phần nhỏ, dễ quản lý hơn.

Middleware hoạt động như thế nào?

Middleware thường mạnh mẽ như các giao thức và hành vi được xác định công khai của nó. Các giao thức giao tiếp nghiêm ngặt cho phép những lập trình viên viết phần mềm tuân thủ các tiêu chuẩn để hoạt động chính xác.

Máy chủ ứng dụng web hoạt động như middleware để kết nối trải nghiệm giao diện người dùng của trang web với mô hình dữ liệu và logic mà ứng dụng back-end và cơ sở dữ liệu cung cấp. Vì nó không được liên kết chặt chẽ với các hệ thống giao tiếp với nó, nên ít nhất, về mặt lý thuyết, bạn có thể đổi máy chủ ứng dụng lấy một máy chủ tương thích mà không cần phải viết lại code ứng dụng hoặc cơ cấu lại cơ sở dữ liệu của mình.

Các thành phần Middleware thường sử dụng các công nghệ như JSON, REST, XML và SOAP. Tất cả đều trưởng thành, phổ biến và dựa trên văn bản, giúp việc trao đổi hoặc sắp xếp lại các thành phần dễ dàng hơn nhiều. Định dạng dựa trên văn bản và nhiều bộ công cụ khác nhau cũng cho phép gỡ lỗi dễ dàng và đáng tin cậy hơn.

Các loại Middleware khác nhau

Bởi vì thuật ngữ này rất rộng nên có rất nhiều ví dụ và cách sử dụng khác nhau cho middleware. Một số phổ biến nhất bao gồm:

  • Message broker, bổ sung cấu trúc cho giao tiếp giữa các tiến trình.
  • Máy chủ ứng dụng web và web framework.
  • Game engine cung cấp hành vi mặc định mà bạn có thể sử dụng, mở rộng hoặc thay thế.
  • Các nền tảng phát trực tuyến sự kiện như Apache Kafka.

Sử dụng Middleware trong phát triển phần mềm

Một trong những ứng dụng hữu hình nhất của middleware là thông qua các web framework. Hầu hết các framework đều cung cấp môi trường cốt lõi mà bạn có thể tùy chỉnh và mở rộng theo yêu cầu của riêng mình. Mô hình này thường liên quan đến việc chuyển các yêu cầu HTTP thông qua một loạt những hàm tùy chỉnh và tích hợp sẵn, theo một thứ tự xác định và trả về phản hồi HTTP ở cuối.

Framework Express.js sử dụng mô hình này để hỗ trợ tùy chỉnh. Lấy ví dụ này về hàm middleware được viết bằng JavaScript:

app.use('/user/:id', (req, res, next) => {
  console.log('Request Type:', req.method)
  next()
})

Hàm này cực kỳ đơn giản:

  1. Nó xử lý các URL cụ thể bắt đầu bằng "/user/", theo sau là id.
  2. Nó ghi lại loại phương thức yêu cầu có thể là GET, POST, v.v...
  3. Nó gọi một hàm được cung cấp, next, để tiếp tục xử lý chuỗi các hàm middleware.

Lệnh gọi next cuối cùng đó là một bước quan trọng trong tiến trình middleware và cho thấy cách tiếp cận này có thể linh hoạt như thế nào. Miễn là mỗi hàm của middleware hoạt động độc lập, bạn có thể trao đổi chúng vào và ra, cũng như sắp xếp lại hành vi của toàn bộ chuỗi một cách dễ dàng.

Framework PHP, Laravel, có thiết lập middleware gần như giống hệt nhau. Lưu ý cách không gian tên định nghĩa rõ ràng lớp này là "middleware".

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class EnsureTokenIsValid
{
    /**
     * Handle an incoming request.
     */
    public function handle(Request $request, Closure $next): Response
    {
        if ($request->input('token') !== 'my-secret-token') {
            return redirect('home');
        }

        return $next($request);
    }
}

Một lần nữa, vai trò của lớp này rất cụ thể: Tất cả những gì nó làm là kiểm tra yêu cầu để xem liệu nó có chứa token hay không. Trong trường hợp này, hàm middleware có thể phá vỡ chuỗi, từ chối gọi hàm next và thay vào đó gửi một redirect. Hàm redirect sẽ trả về một đối tượng Response thích hợp mà hàm middleware sẽ trả về như một phần trong signature contract của nó.

Ví dụ cuối cùng này cho thấy cách Django, một web framework dựa trên Python, xử lý middleware. Django sử dụng thuật ngữ "plugin" để mô tả kiến trúc middleware của nó, tương tự như các thuật ngữ liên quan khác mà bạn có thể nghe thấy như "hook" hoặc "callback". Về bản chất, đây chỉ đơn giản là một trường hợp khác của việc thiết lập middleware mang lại sự linh hoạt trong suốt tiến trình có cấu trúc.

def simple_middleware(get_response):
    # One-time configuration and initialization.

    def middleware(request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.

        response = get_response(request)

        # Code to be executed for each request/response after
        # the view is called.

        return response

    return middleware

Sau đó, bạn có thể kiểm soát middleware nào chạy và theo thứ tự nào bằng một mảng đơn giản:

MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
]

Django cung cấp hành vi mặc định như lớp CommonMiddleware mà hầu hết các ứng dụng sẽ được hưởng lợi; nó cấm truy cập vào một số tác nhân người dùng "xấu" nhất định và xử lý việc chuẩn hóa URL. Việc middleware tập trung vào bảo mật, quan trọng cho nhiệm vụ thường chạy sớm trong tiến trình là điều khá phổ biến, nhưng tính linh hoạt này cho phép bạn tùy chỉnh thứ tự tùy thuộc vào nhu cầu của ứng dụng.

Tại sao Middleware lại hữu ích?

Middleware giúp kết nối các ứng dụng không được thiết kế để kết nối dễ dàng hơn. Nó cung cấp chức năng để tích hợp chúng, cùng với các giao thức có cấu trúc, mạnh mẽ để chúng có thể giao tiếp.

Do đó, middleware có một số lợi ích quan trọng, bao gồm:

  • Phát triển ứng dụng hợp lý và giảm thời gian đưa ra thị trường.
  • Kết nối hiệu quả.
  • Chuyển đổi nhanh hơn các thay đổi.
  • Các công cụ làm việc dễ dàng truy cập.

Cuối cùng, middleware là một dạng mô-đun, một khái niệm có lợi khi áp dụng cho tất cả các dạng lập trình, từ cấp cao nhất đến cấp thấp nhất.

Thứ Hai, 22/01/2024 17:19
51 👨 346
0 Bình luận
Sắp xếp theo
    ❖ Kiến thức cơ bản