Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 26 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
26
Dung lượng
220,33 KB
Nội dung
Lập trình phân tán: RMI Remote Invoke Method • RMI là một cơ chế cho phép một đối tượng chạy trên một máy ảo Java này ( Java Virtual Machine) gọi các phương thức của một đối tượng đang tồn tại trên một máy ảo Java khác (JVM) • RMI tạo ra các ứng dụng phân tán có độ Sn cậy một cách dễ dàng RMI • Server: Cung cấp dịch vụ RMI (phương thức từ xa) • Client: Gọi các phương thức từ xa được cung cấp bởi server RMI -‐ Ví dụ Local Machine (Client) Remote Machine (Server) SampleServer remoteObject; int s; … s = remoteObject.sum(1,2); System.out.println(s); 1,2 public int sum(int a,int b) { return a + b; } Kiến trúc RMI Remote Machine bind RMI Server Registry skeleton return call stub RMI Client Local Machine lookup Truyền Sn trong RMI • RMI sử dụng các lớp trung gian để truyền Sn: Skeleton và Stub • Lớp Stub dùng ở client • Lớp Skeleton dùng phía server • Java sử dụng rmic.exe để tạo các lớp trung gian • TCP Socket Hoạt động của RMI • Server RMI phải đăng ký với một dịch vụ tra rm và đăng ký tên (rmiregistry) • Sau khi server đựơc đăng ký, nó sẽ chờ các yêu cầu RMI từ các client • Nếu một dịch vụ chuyển từ server này sang server khác, client chỉ cần tra rm trình đăng ký để rm ra vị trí mới • Các client RMI sẽ gửi các thông điệp RMI để gọi một phương thức trên một đối tượng từ xa Hoạt động của RMI • Ứng dụng client yêu cầu một tên dịch vụ cụ thể, và nhận một URL trỏ tới tài nguyên từ xa • rmi://hostname:port/servicename Stub Stub RMI Client return skeleton call RMI Server • Stub: một đối tượng ủy quyền, truyền tải yêu cầu đối tượng tới server RMI • Người phát triển ứng dụng không cần quan tâm đến tài nguyên RMI nằm ở đâu, nó đang chạy trên nền nào, nó đáp ứng đầy đủ yêu cầu thế nào -‐> Client RMI gọi một phương thức trên đối tượng ủy quyền Computer A A1 C1-‐ stub Computer C C1– Skel A2 C1 B1_stub B1—Skel B1 Computer B • java.rmi.server.* • java.rmi.* Java classes • java.rmi.Remote – public interface Remote: 1. public interface BankAccount extends java.rmi.Remote { 2. public void deposit(float amount) 3. throws java.rmi.RemoteExcepSon; 4. public void withdraw(float amount) 5. throws OverdrawnExcepSon, java.rmi.RemoteExcepSon; 6. public float getBalance() 7. throws java.rmi.RemoteExcepSon; 8. } Các bước phát triển một hệ thống RMI Định nghĩa một giao diện remote Phát triển đối tượng remote, đối tượng này thực thi giao diện remote Phát triển chương trình client Biên dịch source codes Tạo các client stubs và server skeletons Khởi động RMI registry Khởi động các đối tượng server remote Chạy chương trình client Bước 1 Xác định giao diện Remote • Để tạo ứng dụng RMI, bước 1 là định nghĩa một giao diện remote giữa các đối tượng client và server /* SampleServer.java */ import java.rmi.*; public interface SampleServer extends Remote { public int sum(int a,int b) throws RemoteException; } Bước 2 Phát triển đối tượng remote và giao diện • Server là một server unicast remote đơn giản • Tạo server kế thừa bằng việc kế thừa java.rmi.server.UnicastRemoteObject • Server sử dụng RMISecurityManager để bảo vệ tài nguyên trong truyền thông từ xa /* SampleServerImpl.java */ import java.rmi.*; import java.rmi.server.*; import java.rmi.registry.*; public class SampleServerImpl extends UnicastRemoteObject implements SampleServer { SampleServerImpl() throws RemoteException { super(); } Bước 2 Phát triển đối tượng remote và giao diện • Thực thi các phương thức remote /* SampleServerImpl.java */ public int sum(int a,int b) throws RemoteException { return a + b; } } • Server phải đăng ký tên với registry, client sẽ rm kiếm tên server • Sử dụng lớp Use java.rmi.Namingclass để đăng ký tên server với registry Trong ví dụ này, tên server là “SAMPLE-‐SERVER” • Trong phương thức main của đối tượng server, RMI security manager được tạo và cài đặt Bước 2 Phát triển đối tượng remote và giao diện /* SampleServerImpl.java */ public static void main(String args[]) { try { System.setSecurityManager(new RMISecurityManager()); //set the security manager //create a local instance of the object SampleServerImpl Server = new SampleServerImpl(); //put the local instance in the registry Naming.rebind("SAMPLE-SERVER" , Server); System.out.println("Server waiting "); } catch (java.net.MalformedURLException me) { System.out.println("Malformed URL: " + me.toString()); } catch (RemoteException re) { System.out.println("Remote exception: " + re.toString()); } } Bước 3 Phát triển chương trình client • Để tạo đối tượng client để gọi các phương thức trên server, client phải rm kiếm tên của server trong registry Sử dụng lớpjava.rmi.Naming để tra cứu tên server • Tên server được xác định như một URL với định dạng ( rmi://host:port/name ) • Cổng RMI mặc định 1099 • Tên xác định trong URL phải giống tên đã được server đăng ký với registry Trong ví dụ này, tên server là: “SAMPLE-‐SERVER” • Gọi phương thức từ xa: remoteObject.sum Bước 3 Phát triển chương trình client import java.rmi.*; import java.rmi.server.*; public class SampleClient { public static void main(String[] args) { // set the security manager for the client System.setSecurityManager(new RMISecurityManager()); //get the remote object from the registry try { System.out.println("Security Manager loaded"); String url = "//localhost/SAMPLE-SERVER"; SampleServer remoteObject = (SampleServer)Naming.lookup(url); System.out.println("Got remote object"); System.out.println(" + = " + remoteObject.sum(1,2) ); } catch (RemoteException exc) { System.out.println("Error in lookup: " + exc.toString()); } catch (java.net.MalformedURLException exc) { System.out.println("Malformed URL: " + exc.toString()); } catch (java.rmi.NotBoundException exc) { System.out.println("NotBound: " + exc.toString()); } } } Bước 4 và 5: Biên dịch file mã nguồn Java & tạo ra client stubs và server skeletons elpis:~/rmi> elpis:~/rmi> elpis:~/rmi> elpis:~/rmi> set CLASSPATH=”~/rmi” javac SampleServer.java javac SampleServerImpl.java rmic SampleServerImpl elpis:~/rmi> javac SampleClient.java Bước 6 Khởi động RMI registry • Các ứng dụng RMI cần cài đặt với Registry Registry được khởi động bằng lệnh: rmiregisty • rmiregistry sử dụng cổng mặc định 1099 Có thể gắn rmiregistry tới các cổng khắc bằng lệnh: rmiregistry elpis:~/rmi> rmiregistry • Windows: • > start rmiregistry Steps 7 & 8: Start the remote server objects & Run the client • Khi Registry đã được chạy, server có thể được khởi động sẽ có thể được lưu trữ trong Registry • Vì nh bảo mật của Java, cần phải thiết lập một chính sách bảo mật cho RMI bằng thiết lập java.security.policy to the file policy.all elpis:~/rmi> java –Djava.security.policy=policy.all SampleServerImpl elpis:~/rmi> java –Djava.security.policy=policy.all SampleClient Java Policy File • Trong ví dụ này, thiết lập file policy.all để mã Java có toàn quyền: grant { permission java.security.AllPermission; }; • Một ví dụ khác về gán quyền truy cập: grant { permission java.io.filePermission “/tmp/*”, “read”, “write”; permission java.net.SocketPermission “somehost.somedomain.com:999”,”connect”; permission java.net.SocketPermission “*: 1024-65535”,”connect,request”; permission java.net.SocketPermission “*:80”,”connect”; }; Comment for the Java Policy File allow the Java code to read/write any files only under the /tmp directory, includes any subdirectories allow all java classes to establish a network connecSon with the host “somehost.somedomain.com” on port 999 allows classes to connecSon to or accept connecSons on unprivileged ports greater than 1024 , on any host allows all classes to connect to the HTTP port 80 on any host • You can obtain complete details by following links: http://java.sun.com/products//jdk/1.2/docs/guide/security/ spec/security-spec.doc3.html [...]... javac SampleClient.java Bước 6 Khởi động RMI registry • Các ứng dụng RMI cần cài đặt với Registry Registry được khởi động bằng lệnh: rmiregisty • rmiregistry sử dụng cổng mặc định 1099 Có thể gắn rmiregistry tới các cổng khắc bằng lệnh: rmiregistry elpis:~ /rmi> rmiregistry • Windows: • > start rmiregistry Steps 7 & 8: Start the... exc.toString()); } catch (java .rmi. NotBoundException exc) { System.out.println("NotBound: " + exc.toString()); } } } Bước 4 và 5: Biên dịch file mã nguồn Java & tạo ra client stubs và server skeletons elpis:~ /rmi> elpis:~ /rmi> elpis:~ /rmi> elpis:~ /rmi> set CLASSPATH=”~ /rmi javac SampleServer.java javac SampleServerImpl.java rmic SampleServerImpl elpis:~ /rmi> javac SampleClient.java... thiết lập một chính sách bảo mật cho RMI bằng thiết lập java.security.policy to the file policy.all elpis:~ /rmi> java –Djava.security.policy=policy.all SampleServerImpl elpis:~ /rmi> java –Djava.security.policy=policy.all SampleClient Java Policy File • Trong ví dụ này, thiết lập file policy.all để mã Java có toàn quyền: grant { permission java.security.AllPermission;... java.security.AllPermission; }; • Một ví dụ khác về gán quyền truy cập: grant { permission java.io.filePermission “/tmp/*”, “read”, “write”; permission java.net.SocketPermission “somehost.somedomain.com:999”,”connect”; permission java.net.SocketPermission “*: 1024-65535”,”connect,request”; permission java.net.SocketPermission “*:80”,”connect”; }; Comment for the Java Policy File 1 allow ...Skeleton Stub RMI Client return skeleton call RMI Server • Skeleton có nhiệm vụ lắng nghe các yêu cầu RMI đến và truyền các yêu cầu này tới dịch vụ RMI • Skeleton không cung cấp bản cài đặt của dịch vụ RMI Nó chỉ đóng vai trò như là chương trình nhận các yêu cầu, và truyền các yêu cầu Computer... B1—Skel B1 Computer B • java .rmi. server.* • java .rmi. * Java classes • java .rmi. Remote – public interface Remote: 1. public interface BankAccount extends java .rmi. Remote { 2. public void deposit(float amount) 3. throws java .rmi. RemoteExcepSon; 4. public void withdraw(float amount) 5. throws OverdrawnExcepSon, java .rmi. RemoteExcepSon; 6. public... server unicast remote đơn giản • Tạo server kế thừa bằng việc kế thừa java .rmi. server.UnicastRemoteObject • Server sử dụng RMISecurityManager để bảo vệ tài nguyên trong truyền thông từ xa /* SampleServerImpl.java */ import java .rmi. *; import java .rmi. server.*; import java .rmi. registry.*; public class SampleServerImpl extends UnicastRemoteObject implements SampleServer... } Bước 3 Phát triển chương trình client • Để tạo đối tượng client để gọi các phương thức trên server, client phải rm kiếm tên của server trong registry Sử dụng lớpjava .rmi. Naming để tra cứu tên server • Tên server được xác định như một URL với định dạng ( rmi: //host:port/name ) • Cổng RMI mặc định 1099 • Tên xác... “SAMPLE-‐SERVER” • Gọi phương thức từ xa: remoteObject.sum Bước 3 Phát triển chương trình client import java .rmi. *; import java .rmi. server.*; public class SampleClient { public static void main(String[] args) { // set the security manager for the client System.setSecurityManager(new RMISecurityManager()); //get the remote object from the registry try { System.out.println("Security... 7. throws java .rmi. RemoteExcepSon; 8. } Các bước phát triển một hệ thống RMI 1 Định nghĩa một giao diện remote 2 Phát triển đối tượng remote, đối tượng này thực thi giao diện remote 3 Phát triển chương trình client 4 Biên dịch source codes 5 Tạo các client stubs và server skeletons 6 Khởi động RMI registry 7 Khởi