NỘI DUNG BÀI VIẾT
Lập trình đối tượng phân tán là một vấn đề nóng bỏng của công nghệ phân tán phần mềm ngày này. Java là ngôn ngữ đi tiên phong với RMI(Remote Method Invocation), một kỹ thuật cài đặt các đối tượng phân tán vô cùng hiệu vô cùng hiệu quả và linh động
Thông thường các chương trình của chúng ta được viết dưới dạng thủ tục hàm và việc các hàm gọi lẫn nhau và truyền tham số chỉ xảy ra ở máy cục bộ. Kỹ thuật RMI – mang ý nghĩa là triệu gọi phương thức từ xa là cách thức giao tiếp giữa các đối tượng trong Java có mã lệnh cài đặt nằm ở trên các máy khác nhau có thể triệu gọi lẫn nhau.
Để giải quyết một số vấn đề trong việc truyền thông giữa client <-> Server. RMI không gọi trực tiếp mà thông qua lớp trung gian. Lớp này tồn tại ở cả 2 phía client và server.
-> Lớp Client gọi là Stub
-> Lớp ở máy Server gọi là Skel(Skeleton)
Các đặc tính của RMI
- RMI là mô hình đối tượng phân tán của Java, nó giúp cho việc truyền thông giữa các đối tượng phân tán được dễ dàng hơn
- RMI là API bậc cao được xây dựng dựa trên việc lập trình socket
- RMI không những cho phép chúng ta truyền dữ liệu giữa các đối tượng trên các hệ thống máy tính khác nhau và còn gọi được các phương thức trong các đối tượng ở xa.
- Việc truyền dữ liệu giữa các máy khác nhau được sử lý một cách trong suốt bởi máy ảo Java(Java virtual machine)
- RMI cung cấp cơ chế callback, nó cho phép Server triệu gọi các phương thức ở Client
Kiến trúc cơ bản của RMI
Truyền tin trong RMI
- RMI sử dụng lớp trung gian để truyền tin Skeleton và Stub
- Lớp Stub dùng ở client
- Lớp Skeleton dùng ở Server
- Java sử dụng rmic.exe để tạo ra các lớp trung gian
- TCP Socket
Các thức hoạt động của RMI
- Server RMI phải đăng ký với 1 dịch vụ tra tìm và đăng ký tên miền.
- Sau khi server được đăng ký, nó sẽ chờ các yêu cầu của RMI client.
- Các client RMI sẽ gửi thông điệp RMI để gọi một phương thức trên một đối tượng từ xa.
- Ứng dụng client yêu cần một tên dịch vụ cụ thể và nhận một URL trỏ tới tài nguyên từ xa.
Hướng dẫn cài đặt một ứng dụng RMI
- Định nghĩa một Interface dùng chung Interface này như là một thông điệp cho cả Server và Client, cả client và server đều phải tuân thủ nó, chỉ được triển khai và gọi các phương thức cho phép. Các phương thức đều kèm theo throws RemoteException
IAccount.java
- Tạo một lớp thực thi Implement cho Interface
AccountServiceImpl.java
package com.sept.server.impl; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; import com.bean.User; import com.rmi.IAccount; /** * * @author framgiavn * */ public class AccountServiceImpl extends UnicastRemoteObject implements IAccount { private static final long serialVersionUID = 1L; public AccountServiceImpl() throws RemoteException { } public User getUser() { User u = new User(); u.setId(23); u.setUname("framgia"); u.setPasswd("222"); return u; } }
Cài đặt cho đối tượng trên Server: RMIServer.java
package com.sept.server.impl; import java.net.MalformedURLException; import java.rmi.AlreadyBoundException; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import com.rmi.IAccount; /** * @author framgiavn */ public class RMIServer { public static void main(String args[]) { try { IAccount rAccount = new AccountServiceImpl(); LocateRegistry.createRegistry(6789); // Đăng ký đối tượng này với rmiregistry Naming.bind("rmi://192.168.1.230:6789/SeptemberRMI", rAccount); System.out.println(">>>>>INFO: RMI Server started!!!!!!!!"); } catch (RemoteException e) { e.printStackTrace(); } catch (AlreadyBoundException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } } }
- Cài đặt đối tượng trên client:
RMIClient.java
package com.sept.client.impl; import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RemoteException; import com.rmi.IAccount; /** * * @author framgiavn * */ public class RMIClient { public static void main(String args[]) { try { //Xác định RMI máy chủ. IAccount iAccount = (IAccount) Naming.lookup("rmi://192.168.1.230:6789/SeptemberRMI"); System.out.println("Name: " + iAccount.getUser().getUname()); } catch (NotBoundException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } } }
Thực thi ứng dụng
Khởi động server
Thực thi client, gọi hàm từ server RMI
Trên là giới thiệu cơ bản về Java RMI hy vọng các bạn hứng thú với việc lập trình ứng dụng phân tán
Thông tin thêm về Java RMI các bạn có thể tham khảo ở đây RMI
Source code ví dụ các bạn có thể tham khảo tại đây Code
Nguồn: https://viblo.asia/p/gioi-thieu-ve-java-rmiremote-method-invocation-XogBG2xrRxnL