RMI (Remote Method Invocation) là một công nghệ trong Java cho phép một đối tượng ở một máy tính (client) gọi phương thức của một đối tượng trên một máy tính khác (server) như thể nó đang gọi phương thức của một đối tượng cục bộ. Điều này làm cho việc phát triển các ứng dụng phân tán trở nên dễ dàng hơn và cho phép các hệ thống hoạt động với nhau trên mạng.
1. Tổng quan về RMI
1.1. Khái niệm
- Remote Method Invocation (RMI) cho phép các đối tượng Java trên một máy chủ (server) được truy cập từ một client, bất kể vị trí vật lý của chúng. Bằng cách sử dụng RMI, lập trình viên có thể tạo ra các ứng dụng phân tán, nơi mà client có thể gọi các phương thức trên các đối tượng nằm ở xa mà không cần phải biết đến vị trí hoặc cách thức cụ thể của chúng.
1.2. Cấu trúc RMI
RMI bao gồm các thành phần chính sau:
- Client: Phần mềm thực hiện các cuộc gọi đến các phương thức của đối tượng trên server.
- Server: Chứa đối tượng mà client muốn gọi. Server đăng ký đối tượng này với RMI Registry.
- RMI Registry: Là một dịch vụ cung cấp khả năng tìm kiếm các đối tượng RMI. Client sử dụng RMI Registry để tìm các đối tượng mà nó muốn truy cập.
- Stub: Là một đại diện cho đối tượng từ xa trên client. Stub nhận các cuộc gọi từ client và chuyển chúng đến đối tượng thực sự trên server.
- Skeleton: Là phần thực thi của đối tượng từ xa trên server, nhận các cuộc gọi từ stub và gọi phương thức tương ứng trên đối tượng.
2. Cách hoạt động của RMI
Quá trình hoạt động của RMI có thể được mô tả như sau:
- Server tạo đối tượng và đăng ký nó với RMI Registry.
- Client tìm kiếm đối tượng trên RMI Registry bằng tên của nó.
- Stub được trả về cho client, cho phép client thực hiện cuộc gọi phương thức.
- Stub chuyển cuộc gọi đến Skeleton trên server.
- Skeleton thực hiện cuộc gọi đến đối tượng thực sự và trả kết quả trở lại client thông qua stub.
3. Ví dụ về RMI
Dưới đây là một ví dụ đơn giản về cách sử dụng RMI trong Java.
3.1. Tạo Interface RMI
Trước tiên, ta cần định nghĩa một interface mà client sẽ sử dụng để gọi các phương thức từ server.
import java.rmi.Remote;
import java.rmi.RemoteException;
// Interface RMI
public interface Hello extends Remote {
String sayHello() throws RemoteException;
}
3.2. Cài đặt Interface RMI
Tiếp theo, ta cần cài đặt interface này trong lớp server.
import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;
// Cài đặt interface RMI
public class HelloImpl extends UnicastRemoteObject implements Hello {
public HelloImpl() throws RemoteException {
super();
}
public String sayHello() {
return "Hello, World!";
}
}
3.3. Tạo Server
Bây giờ, ta tạo server để đăng ký đối tượng của mình với RMI Registry.
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class Server {
public static void main(String[] args) {
try {
// Tạo đối tượng
HelloImpl hello = new HelloImpl();
// Đăng ký đối tượng với RMI Registry
Registry registry = LocateRegistry.createRegistry(1099);
registry.rebind("Hello", hello);
System.out.println("Server ready");
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.4. Tạo Client
Cuối cùng, ta tạo client để gọi phương thức trên server.
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class Client {
public static void main(String[] args) {
try {
// Tìm RMI Registry
Registry registry = LocateRegistry.getRegistry("localhost", 1099);
// Tìm đối tượng từ xa
Hello stub = (Hello) registry.lookup("Hello");
// Gọi phương thức
String response = stub.sayHello();
System.out.println("Response: " + response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
4. Kết luận
RMI là một công nghệ mạnh mẽ trong Java giúp lập trình viên phát triển các ứng dụng phân tán dễ dàng hơn. Bằng cách sử dụng RMI, bạn có thể gọi phương thức từ các đối tượng trên máy chủ từ xa, mở ra nhiều khả năng cho các ứng dụng Java. Công nghệ này rất hữu ích trong các ứng dụng yêu cầu giao tiếp giữa các thành phần khác nhau qua mạng, chẳng hạn như ứng dụng web hoặc dịch vụ phân tán.