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

25 tháng 07, 2021 - 2665 lượt xem

Bài viết gốc: How web servers work? by Lokesh Gupta

Nhiều khi chúng ta tự hỏi rằng máy chủ hay web server như tomcat, jboss hoạt động như thế nào? Làm sao nó xử lý các yêu cầu đến từ khắp nơi trên thế giới? Điều gì diễn ra đằng sau mỗi lần nhấp chuột? Các java servlet API như ServletContext, ServletRequest, ServletResponse và Session tham gia vào quá trình này như thế nào? Đây là các câu hỏi, khái niệm rất quan trọng bạn phải biết nếu bạn là một lập trình viên web-application hoặc mong muốn trở thành web developer. Trong bài này tôi sẽ cố gắng tìm câu trả lời cho các câu hỏi ở trên.

Web server, application server, web container? Chúng là gì?

Đầu tiên hãy nói về Web Server và Application Server. Trước đây, chúng khác nhau nhưng đang dần được hợp nhất và giờ được xem như một thực thể trong hầu hết các trường hợp và mục đích sử dụng.

Trong những ngày đầu của trình duyệt Mosaic (được xem là trình duyệt web đầu tiên), nội dung siêu liên kết, đã phát triển một khái niệm mới - web server, thứ cung cấp nội dung web tĩnh và hình qua giao thức HTTP. Vào thời này, hầu hết là nội dung tĩnh và giao thức HTTP 1.0 là cách duy nhất để truyền file đi. Nhưng ngay sau đó, các máy chủ web đã phát triển để có khả năng CGI. Nó có nghĩa là khởi chạy một quá trình trên mỗi web request một cách hiểu quả để tạo ra nội dung động. Ngày nay, giao thức HTTP đã phát triển và các máy chủ web trở nên phức tạp hơn với các chức năng bổ sung như bộ nhớ đệm, bảo mật và quản lý phiên (session management). Khi công nghệ phát triển hơn nữa, chúng ta có các công nghệ phía máy chủ dựa trên Java từ Kiva và NetDynamics, cuối cùng tất cả được hợp nhất thành JSP (java server pages), công nghệ mà chúng ra vẫn sử dụng trong hầu hết các ứng dụng ngày nay.
web application

Đó là web server, bây giờ hãy nói đến application servers.

Các application server đã phát triển và tồn tại trong một thời gian dài. Một số công ty đã cung cấp sản phẩm cho UNIX như Tuxedo (transaction-oriented middleware), TopEnd, Encina. Vào những năm 90, các application server này bắt đầu nhúng khả năng giao tiếp cơ bản, đầu tiên là gateway. Về sau, khoảng cách khác biệt giữa web server và application server mờ nhạt dần.

Theo thời gian, các web server dần hoàn thiện để xử lý tải cao hơn, tính năng tốt hơn và đồng thời hơn. Các application server bắt đầu cung cấp ngày càng nhiều khả năng giao tiếp dựa trên HTTP. Và tất những điều này làm mờ ranh đi giới giữa web server và application server.
web-server-servlet

Vùng chứa web (web container) cụ thể trong java đề cập đến vùng chứa servlet (servlet container).

Servlet container là một phần của web server tương tác với các java servlet. Một web container chịu trách nhiệm quản lý vòng đời của các servlet, ánh xạ một URL tới một servlet cụ thể và đảm bảo rằng người yêu cầu URL có quyền truy cập chính xác và nhiều dịch vụ khác như vậy. Về cơ bản, tổng hợp tất cả các thông tin trên, servlet container là runtime environment nơi servlet của bạn chạy và vòng đời của nó được duy trì.

Servlet là gì?

Trong java, servlet cho phép bạn viết các thành phần phía máy chủ giúp tạo ra nội dung động dựa trên request. Thực tế, servlet là một interface được định nghĩa trong gói javax.servlet. Nó khai báo 3 phương thức chính cho vòng đời của một servlet: init(), service() và destroy(). Chúng được triển khai bởi các servlet (được xác định trong SDK hoặc do lập trình viên) và được máy chủ gọi vào những thời điểm cụ thể trong vòng đời của nó.

Các lớp servlet được tải vào container bởi trình tải động của nó thông qua lazy-loading hoặc eager-loading. Mỗi request nằm trong luồng riêng của nó và một đối tượng servlet có thể phục vụ nhiều luồng cùng một lúc. Khi nó không còn được dùng sẽ được thu gom bỏi JVM.

  • Lazy loading servlet
    Lazy loading servlet
  • Eager loading
    Eager loading

ServletContext là gì? Ai tạo ra nó?

Khi servlet container khởi động, nó sẽ triển khai và tải tất cả các web application. Đến khi một web application được tải xong, servlet container sẽ tạo ServletContext cho từng ứng dụng và đặt nó tại bộ nhớ của server. Web.xml của ứng dụng web sẽ được phân tích cú pháp và mọi Servlet, Filter, Listener tìm thấy trong web.xml sẽ được tạo và lưu trong bộ nhớ của máy chủ. Khi servlet container tắt, nó sẽ dỡ bỏ tất cả các web-app và ServletContext, cũng như các Servlet, Filter, Listener.

ServletContext định nghĩa một tập hợp các phương thức mà một servlet sử dụng để giao tiếp với servlet container chứa nó.

ServletRequest và ServletResponse

Servlet container được gắn vào webserver lắng nghe các HTTP request ở một số cổng nhất định, thường là 80. Khi một máy khách (trình duyệt web) gửi một yêu cầu HTTP, servlet container sẽ tạo các đối tượng HttpServletRequets và HttpServletRespone và pass nó vào các phường thức của đối tượng Filter, Servlet đã được tạo sẵn có mẫu URL khớp với URL yêu cầu.

Request Object (thông tin client gửi lên server) cung cấp quyền truy cập tới tất các các thông tin của HTTP request, chẳng hạn như request header và request body. Response Object (thông tin client nhận từ server) cung cấp cở sở đến kiểm soát và gửi phản hồi HTTP theo cách bạn muốn, như thiết lập header và body (thường là nội dung HTML từ JSP). Khi phản hồi HTTP được cam kết và kết thúc, thì cả request object và response object sẽ được chuyển vào thùng rác.

Khi khách hàng truy cập ứng dụng web lần đầu tiên hoặc HttpSession sẽ được lấy lần đầu tiên bằng request.getSession(), thì servlet container sẽ tạo nó, tạo một ID dài và duy nhất (bạn có thể lấy theo session.getId()) và lưu trữ nó trong bộ nhớ của máy chủ (server). Servlet Container cũng sẽ đặt Cookie trong HTTP response với JSESSIONID làm tên cookie và sesion ID duy nhất làm giá trị cookie.

Theo các đặc tả của HTTP cookie (hợp đồng mà trình duyệt và máy chủ phải tuân thủ), client (trình duyệt web) được yêu cầu gửi lại cookie này trong các yêu cầu tiếp theo miễn là cookie hợp lệ. Servlet container sẽ xác định mọi header của HTTP request đến về sự hiện diện của cookie với tên JSESSIONID và sử dụng giá trị của nó để lấy HttpSession được liên kết từ bộ nhớ của máy chủ.

HttpSession sẽ tồn tại cho đến khi nó không được sử dụng quá thời gian, bạn có thể thiết lập này trong web.xml, thiết lập này mặc định là 30 phút. Vì vậy, khi client không truy cập ứng dụng nữa trong 30 phút, thì servlet conainer sẽ xoá phiên làm việc. Ở mọi request tiếp theo, ngay cả khi đã chỉ định cookie, sẽ không có quyền truy cập vào cùng một phiên nữa. Lúc này servlet container sẽ tạo một cái mới.

  • Phiên hiện tại
    Existing Session
  • Phiên mới
    New Session

Mặt khác, session cookie ở phía client có thời gian tồn tại mặc định miễn là trình duyệt đang chạy. Vì vậy khi client đóng trình duyệt (tất cả các tab/cửa sổ) thì session sẽ được xoá bỏ ở phía client. Trong một lần mở trình duyệt mới, cookie được liên kết với session sẽ không được gửi nữa. Phương thức request.getSession() sẽ trả về một HttpSession hoàn toàn mới và đặt một cookie với một session ID mới.

Bình luận

avatar
Trịnh Minh Cường 2021-07-27 01:54:17.623089 +0000 UTC

Bài viết rất thú vị. Thanks tác giả

Avatar
* Vui lòng trước khi bình luận.
Ảnh đại diện
  +1 Thích
+1