2011-01-03 30 views
28

Ưu điểm của việc xây dựng một ứng dụng web Java nhỏ để chạy trong một thùng chứa Servlet (như Tomcat) so với việc xây dựng một ứng dụng Java độc lập với một máy chủ web tích hợp và chạy nó đằng sau một proxy ngược lại?Ứng dụng web Java trong vùng chứa Servlet so với độc lập

Tôi đã chơi với Java trong khoảng một năm. Tôi đã nhận thấy rằng để khởi chạy Tomcat cần có thời gian, và không phải lúc nào cũng có thể thực hiện một redeploy do các vấn đề của trình nạp lớp. Servlet API có vẻ hơi phức tạp với tôi, đặc biệt là từ quan điểm của cấu hình và thiết kế RESTful (mà nó không thực sự hỗ trợ đầy đủ).

Mặt khác, tôi đã nhận thấy rằng IDE của tôi có thể biên dịch và chạy một ứng dụng độc lập với tốc độ cực nhanh. Cấu hình Apache để đảo ngược proxy là một mẩu bánh, và Jetty được nhúng dường như xử lý bất cứ thứ gì tôi có thể ném vào nó. Tôi không cần Servlets khi tôi có thể sử dụng Restlet, Wicket, v.v. Có thể biết rõ hơn cách hoạt động của ứng dụng của tôi (vì nó không được tích hợp với một máy chủ ứng dụng lớn) cảm thấy có sức mạnh. Các dấu vết ngăn xếp ngắn hơn. Kích thước tải xuống nhỏ hơn. Cấu hình người dùng cuối dễ dàng hơn. Tôi đoán hiệu suất có thể tốt hơn vì có ít lớp phần mềm hơn.

Tuy nhiên, tôi được nhắc nhở về câu nói rằng âm thanh quá hay để trở thành sự thật thường là. Vì vậy, câu hỏi của tôi là, tại sao tôi không muốn làm cho các ứng dụng web của tôi độc lập? Thùng chứa Servlet cung cấp cho tôi và/hoặc người dùng cuối của tôi mà chúng tôi thực sự cần nhưng không biết gì?

Trả lời

13

Có 2 câu hỏi riêng biệt ở đây:

  1. Tôi có nên sử dụng một nhúng máy chủ, hoặc triển khai vào một container?

    Tôi không nghĩ bạn nên nhìn thấy một sự khác biệt lớn theo cách này hay cách khác là . Có thêm một chút mã để khởi động máy chủ Cầu cảng theo lập trình và cấu hình dễ dàng hơn khi lập trình. Mặc dù IDE hỗ trợ cho các ứng dụng web cấu hình và triển khai là nhận được tốt hơn, nó vẫn còn tồi tệ hơn hơn cho các ứng dụng độc lập (đây là kinda bởi định nghĩa, kể từ có một superset của điều cần hỗ trợ).

    Mặt khác, máy chủ ứng dụng cung cấp cho bạn một số lợi ích đẹp như built-in quản lý, tích hợp khả năng chạy như một dịch vụ, vv

    Bạn thậm chí có thể sử dụng một cách tiếp cận lai: sử dụng máy chủ được nhúng để phát triển cục bộ, sau đó triển khai vào vùng chứa trong quá trình sản xuất.Nhưng đó là có chút lạ: nếu bạn gặp phải sự cố khi tạo tệp WAR thích hợp, IDE thực sự có thể xử lý việc triển khai vào một vùng chứa đầy đủ.

    BTW, thật lạ khi bạn gặp sự cố với quá trình triển khai lại; Tomcat không nên có vấn đề với nó trừ khi bạn đang gặp phải một số trường hợp góc lạ góc ...

  2. Tôi có nên sử dụng API Servlet không?

    Đây là trực giao từ # 1. Bạn có thể nhúng Cầu cảng và triển khai Servlets. Bạn cũng có thể sử dụng API Restlet bên trong Tomcat thông qua một ServerServlet http://www.restlet.org/documentation/1.0/faq#02.

    Cá nhân tôi tìm thấy API Servlet để khá đơn giản.You nhận được những điều thú vị như đồng thời và quản lý nhà nước. Tôi hoàn toàn không biết điều đó có nghĩa rằng RESTful thiết kế không được hỗ trợ, nhưng nếu Restlets giải quyết yêu cầu của bạn tốt hơn, sau đó sử dụng ...

0

Vùng chứa Servlet thường cung cấp một loạt các công cụ hữu ích như quản lý phiên tự động, triển khai nóng, khuôn khổ cho chuyển đổi dự phòng và phân cụm, v.v. Nó phụ thuộc vào container, tất nhiên, nhưng đôi khi đây là những công cụ rất hữu ích. Đôi khi họ không.

CHỈNH SỬA: Chỉ cần nhận thấy nhận xét của bạn về việc triển khai lại. Có, đôi khi các thùng chứa là lỗi và một nỗi đau để làm việc với, và tất cả họ có xu hướng có những điều kỳ quặc của riêng họ. Tuy nhiên, đôi khi họ cung cấp một số công cụ thực sự tốt.

3

Một nhúng Jetty cũng là một container servlet. Tôi cho rằng ứng dụng của bạn bao gồm một tệp web.xml nơi bạn định nghĩa một bộ lọc/servlet wicket, servlet RESTlet và các ánh xạ của chúng (ít nhất). Vì vậy, bạn không thể loại bỏ API Servlet (hoặc của một thùng chứa servlet, ngay cả khi bạn nhúng nó), nhưng bạn có thể ẩn nó cũng như có thể bên dưới khung công tác của bạn và vào một số phương thức main() của riêng bạn. RESTlet (hoặc Jersey hoặc bất kỳ triển khai JAX-RS nào) cũng như Spring MVC đều dựa trên các servlet, vì vậy Servlet API hỗ trợ REST khá tốt, tôi muốn nói.

P.S. Hai cách tiếp cận không loại trừ lẫn nhau. Bạn có thể làm việc rất tốt với Jetty trong quá trình phát triển và sau đó triển khai chiến tranh của bạn vào một số container (không được nhúng) cho QA/production. Hoặc ... gắn bó với Jetty để sản xuất, nếu điều đó thực sự phù hợp với nhu cầu của bạn.

4

Cầu nối được nhúng có thể là lựa chọn tốt nếu bạn không cần ngăn xếp đầy đủ của Servlet. Không giống như Tomcat, Jetty giúp bạn dễ dàng loại bỏ các phần bạn không sử dụng (JSP, JNDI, bất kỳ thứ gì).

Viết máy chủ HTTP của riêng bạn, mặt khác, là một ý tưởng khủng khiếp. Chắc chắn, thật dễ dàng để viết một cái gì đó xử lý các yêu cầu cơ bản. Nhưng chẳng mấy chốc bạn sẽ thấy rằng một số khách hàng đang gặp rắc rối với nó bởi vì nó không hỗ trợ các thông số giao thức đầy đủ; hoặc nó đổ vỡ khi có hơn một trăm người dùng; hoặc có một lỗ hổng cho phép một số trẻ ở Malaysia phát tán máy in của bạn. Vì vậy, không tái phát minh ra bánh xe.

Đối với khiếu nại của bạn rằng API Servlet không hỗ trợ thiết kế RESTful - bạn thiếu điểm, nó không bao giờ có ý định làm điều đó. Nhưng có rất nhiều thư viện REST chạy trên đầu trang của API Servlet.

0

Các thùng chứa Servlet trong quá trình là các thùng chứa hoạt động bên trong JVM của máy chủ Web, chúng cung cấp hiệu suất tốt nhưng kém khả năng mở rộng.

Vùng chứa ngoài quy trình là các vùng chứa hoạt động trong JVM bên ngoài máy chủ web.kém hiệu quả nhưng tốt hơn trong khả năng mở rộng Trong trường hợp các thùng chứa ngoài quy trình, máy chủ web và các cuộc đàm phán container với nhau bằng cách sử dụng một số cơ chế tiêu chuẩn như IPC.

Ngoài các loại thùng chứa này, còn có loại thứ 3 là các thùng chứa servlet độc lập. Đây là một phần không thể tách rời của máy chủ web.

-1

nếu bạn gặp sự cố với việc triển khai nóng của mình, rất có thể bạn không dọn dẹp kết nối bên ngoài hoặc các tài nguyên khác. Để xử lý điều này, thông thường bạn muốn thực hiện một trình lắng nghe sẽ cho bạn biết khi nào một cái gì đó được bắt đầu hoặc dừng lại.

bạn nên có lẽ trong cuộc chiến tranh của bạn thực hiện một cái gì đó như thế này (tomcat 6):

public class MyTomcatInitCleanupListener implements ServletContextListener 
{ 
    @Override 
    public void contextInitialized(ServletContextEvent arg0) 
    { 
     super.contextInitialized(arg0); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent arg0) 
    { 
     super.contextDestroyed(arg0); 
    } 
} 

cho tomcat 7+, bạn có thể google "tomcat vòng đời người nghe"

Các vấn đề liên quan