EJB - khi nào nên sử dụng Remote và / hoặc giao diện cục bộ?


180

Tôi rất mới với Java EE và tôi đang cố gắng hiểu khái niệm về giao diện cục bộ và giao diện từ xa. Tôi đã được thông báo rằng một trong những lợi thế lớn của Java EE là dễ dàng mở rộng quy mô (mà tôi tin rằng bạn có thể triển khai các thành phần khác nhau trên các máy chủ khác nhau). Có phải đó là nơi giao diện Remote và Local xuất hiện? Bạn có nên sử dụng giao diện Remote nếu bạn muốn ứng dụng của mình có các thành phần khác nhau trên các máy chủ khác nhau? Và sử dụng giao diện cục bộ nếu ứng dụng của bạn chỉ nằm trên một máy chủ?

Nếu các giả định của tôi ở trên là chính xác, bạn sẽ chọn cách sử dụng giao diện Cục bộ hoặc Từ xa cho một ứng dụng mới, trong đó bạn không chắc chắn về lưu lượng giao thông sẽ là bao nhiêu? Bắt đầu bằng cách sử dụng Giao diện cục bộ và nâng cấp dần lên Giao diện từ xa khi áp dụng?

Cảm ơn cho bất kỳ làm rõ và đề nghị.

Câu trả lời:


186

Tôi rất mới với Java EE và tôi đang cố gắng hiểu khái niệm về giao diện cục bộ và giao diện từ xa.

Trong các phiên bản ban đầu của đặc tả EJB, các EJB được "giả định" là các thành phần từ xa và cách duy nhất để gọi chúng là thực hiện một cuộc gọi từ xa, sử dụng ngữ nghĩa RMI và tất cả các chi phí mà nó ngụ ý (một cuộc gọi mạng và tuần tự hóa đối tượng cho mọi gọi phương thức). Các khách hàng của EJB đã phải trả tiền phạt hiệu suất này ngay cả khi được đặt chung trong cùng một máy ảo với bộ chứa EJB.

Sau đó, Sun nhận ra hầu hết các ứng dụng kinh doanh thực sự không phân phối EJB trên một tầng khác và họ đã sửa lỗi thông số kỹ thuật (trong EJB 2.0) bằng cách đưa ra khái niệm giao diện cục bộ để khách hàng được kết hợp trong cùng một máy ảo với bộ chứa EJB có thể gọi EJB bằng cách sử dụng gọi phương thức trực tiếp, bỏ qua hoàn toàn ngữ nghĩa RMI (và chi phí liên quan).

Tôi đã được thông báo rằng một trong những lợi thế lớn của Java EE là dễ dàng mở rộng quy mô (mà tôi tin rằng bạn có thể triển khai các thành phần khác nhau trên các máy chủ khác nhau)

Java EE có thể mở rộng quy mô, nhưng điều này không nhất thiết có nghĩa là phân phối các thành phần. Bạn có thể chạy ứng dụng Web + EJB trên một cụm mà không tách rời tầng Web và tầng EJB.

Bạn có nên sử dụng giao diện Remote nếu bạn muốn ứng dụng của mình có các thành phần khác nhau trên các máy chủ khác nhau? Và sử dụng giao diện cục bộ nếu ứng dụng của bạn chỉ nằm trên một máy chủ?

Tôi sẽ diễn đạt nó như thế này: sử dụng các giao diện từ xa nếu máy khách không ở cùng một JVM (điều này không có nghĩa là chỉ sử dụng một máy chủ / JVM).

(...) Bắt đầu bằng cách sử dụng Giao diện cục bộ và nâng cấp dần lên Giao diện từ xa khi áp dụng?

Tôi có thể sẽ bắt đầu bằng cách sử dụng giao diện địa phương. Và như đã gợi ý, chuyển sang giao diện từ xa không phải lúc nào cũng bắt buộc (bạn có thể cụm một collocated cấu trúc).

Tôi đề nghị kiểm tra các tài nguyên được đề cập dưới đây (2 cái đầu tiên khá cũ nhưng vẫn có liên quan, 2 cái khác gần đây hơn).

Tài nguyên


2
Tôi thấy câu hỏi này thú vị. Ý bạn là gì khi "chuyển sang giao diện từ xa không hoàn toàn bắt buộc"? Điều đó có nghĩa là khi bạn thêm một máy khách mới bên ngoài cùng một JVM, bạn không phải tạo một giao diện từ xa?
mohamida

2
@Josek Cảm ơn, rất vui vì bạn thích nó @mohamida Tôi đã thay đổi một chút về từ ngữ. Ý tôi là bạn có thể gom một cấu trúc đối chiếu.
Pascal Thivent

1
Cảm ơn câu trả lời và các tài nguyên bổ sung, chúng đã rất hữu ích. Có vẻ như có một vài cách để nhân rộng một ứng dụng web ... tức là phân phối các thành phần (mà tôi coi đó là phá vỡ các tầng khác nhau trên các JVM khác nhau?) Hoặc sử dụng cân bằng tải (sẽ có toàn bộ ứng dụng trên nhiều máy chủ?) và tôi cho rằng bạn có thể sử dụng kết hợp cả hai? Bạn, tình cờ biết những cuốn sách hay về chủ đề này? Cảm ơn một lần nữa!
Brian DiCasa

2
@Brian It seems like there are a couple ways of scaling a web application (...) and I suppose you could use a combination of both?Vâng, chính xác là như vậy. Do you, by chance know of good books on this topic?Đáng buồn thay, không, tôi không biết tài nguyên tuyệt đối "ZE", nếu có. Tôi đã thêm nhiều tài nguyên hơn với một số tài liệu tham khảo.
Pascal Thivent

liên kết tài nguyên đầu tiên đã chết
Viacheslav Dobromyslov

48

Mặc dù tôi đồng ý với hầu hết những gì được viết ở trên, tôi muốn tinh chỉnh ý tưởng "làm thế nào để bắt đầu" một chút.

Tôi đề nghị với bạn là đừng bao giờ lập trình trực tiếp tới các giao diện EJB trong mã của bạn. Luôn sử dụng giao diện định hướng kinh doanh thông thường, theo chương trình (có nghĩa là có các phương thức gọi mã của bạn trên giao diện hướng kinh doanh) và cung cấp mã "keo" EJB dưới dạng triển khai có thể cắm được. Chương trình của bạn nên tập trung vào logic kinh doanh và không tập trung vào các chi tiết triển khai như EJB.

Bằng cách đó, bạn có thể dễ dàng chuyển đổi giữa các triển khai từ xa và cục bộ - và nếu bạn sử dụng bộ chứa IoC như Spring, bạn chỉ có thể thực hiện bằng phương thức cấu hình.

Một lưu ý đặc biệt về việc chuyển đổi từ cục bộ sang từ xa: lưu ý rằng có một vài khác biệt về ngữ nghĩa giữa hai loại. Ví dụ: gọi một phương thức EJB thông qua "giao diện từ xa" dẫn đến các đối số được truyền theo giá trị, trong khi gọi qua "giao diện cục bộ" dẫn đến các đối số được truyền qua tham chiếu. Đây là một sự khác biệt lớn ; vì vậy nếu bạn "bắt đầu với cục bộ", hãy đảm bảo rằng bạn thiết kế hệ thống của mình theo cách nó cũng xem xét ngữ nghĩa "từ xa".

Nếu thiết kế của bạn phụ thuộc vào các phương thức EJB thay đổi các đối tượng truyền vào, thì sẽ rất khó để bạn "chuyển sang điều khiển từ xa" sau này; thậm chí có thể là không thể

Chúc may mắn.


2
Nghe có vẻ như là một lý do khác để giảm thiểu khả năng biến đổi trên mỗi java hiệu quả. Điều này có giúp linh hoạt "chuyển sang điều khiển từ xa" cho giao diện loại RMI với EJB không?
Thufir

19

Theo EJB Spec 3.2, EJB có thể là cục bộ hoặc từ xa . Một giao diện kinh doanh không thể là cả cục bộ và từ xa cùng một lúc.

@Local đậu chú thích chỉ có thể được truy cập nếu chúng trong cùng một ứng dụng.

@Remote đậu chú thích có thể được truy cập trên các ứng dụng khác nhau, nằm trong các jvms khác nhau hoặc trên các máy chủ ứng dụng.

Vì vậy, những điều quan trọng cần ghi nhớ là:

  1. Nếu một lớp bean chứa @Remotechú thích, thì tất cả các giao diện được triển khai sẽ ở xa.
  2. Nếu một lớp bean không chứa chú thích hoặc nếu @Localchú thích được chỉ định, thì tất cả giao diện được triển khai được coi là cục bộ.
  3. Bất kỳ giao diện nào được xác định rõ ràng cho một bean không chứa giao diện phải được khai báo là @Local.
  4. Bản phát hành EJB 3.2 có xu hướng cung cấp độ chi tiết cao hơn cho các tình huống trong đó các giao diện cục bộ và từ xa cần được xác định rõ ràng.

1
Câu hỏi: Bạn có thể sử dụng @Localđể gọi EJB trong một ứng dụng khác (JAR, WAR, EAR), nhưng cùng một JVM không?
Đường Carlitos

@PritamBanerjee Bất kỳ ý tưởng nào về Carlitos Wa, tôi cũng đang đối mặt với vấn đề tương tự. EJB nằm trong cụm khác nhau và ứng dụng servlet khách hàng nằm trong một ứng dụng khác nhau.
Govi S

@GovindaSakhare Tôi không chắc lắm về điều đó. Xin lỗi :(
Pritam Banerjee

7

Điều này có thể trả lời mối quan tâm của bạn:

Nói chung, Enterprise Java Bean của bạn sẽ cần một khung nhìn máy khách từ xa trong các trường hợp khi bạn có kế hoạch sử dụng bean trong các môi trường phân tán. Cụ thể, đây là những trường hợp khi máy khách sẽ làm việc với nó sẽ ở trong Máy ảo Java (JVM) khác. Trong trường hợp chế độ xem máy khách từ xa, việc gọi bất kỳ phương thức nào từ giao diện nhà từ xa và / hoặc giao diện thành phần từ xa sẽ được xử lý thông qua việc gọi phương thức từ xa (RMI).

EJB chỉ có thể sử dụng chế độ xem máy khách cục bộ nếu thực sự được đảm bảo rằng các bean doanh nghiệp hoặc máy khách khác sẽ chỉ giải quyết bean trong một JVM duy nhất. Nếu đây là trường hợp, truy cập như vậy sẽ được thực hiện với các cuộc gọi phương thức trực tiếp, thay vì RMI.

Nguồn: http://www.onjava.com/pub/a/onjava/2004/11/03/localremote.html?page=last&x-showcontent=text

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.