Lập trình phân tán: RMI

Tài liệu Lập trình phân tán: RMI: 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   đang  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)   SampleServer remoteObject; int s; s = remoteObject.sum(1,2); System.out.println(s); Remote  Machine  (Server)   public int sum(int a,int b) { return a + b; } 1,2   3   Kiến  trúc  RMI     ...

pdf26 trang | Chia sẻ: Khủng Long | Lượt xem: 1477 | Lượt tải: 0download
Bạn đang xem trước 20 trang mẫu tài liệu Lập trình phân tán: RMI, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
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   đang  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)   SampleServer remoteObject; int s; s = remoteObject.sum(1,2); System.out.println(s); Remote  Machine  (Server)   public int sum(int a,int b) { return a + b; } 1,2   3   Kiến  trúc  RMI     RMI Server skeleton stub RMI Client Registry bind lookupreturn call Local Machine Remote Machine 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   một  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:  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   như  thế  nào        -­‐>  Client  RMI  gọi  một  phương  thức  trên  đối   tượng  ủy  quyền     St ubRMI Client RMI Server skeleton return call Skeleton   •  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     St ubRMI Client RMI Server skeleton return call Computer B   Computer A   A1   A2   C1-­‐   stub   B1_stub   Computer C   C1– Skel   C1   B1   B1—Skel   •  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   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  động  các  đối  tượng  server  remote   8.  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(" 1 + 2 = " + 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> set CLASSPATH=”~/rmi” elpis:~/rmi> javac SampleServer.java elpis:~/rmi> javac SampleServerImpl.java elpis:~/rmi> 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   và  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   1.   allow   the   Java   code   to   read/write   any   files   only   under   the  /tmp  directory,  includes  any  subdirectories   2.     allow  all   java   classes   to  establish  a  network   connecSon   with  the  host  “somehost.somedomain.com”  on  port  999   3.    allows  classes  to  connecSon  to  or  accept  connecSons  on   unprivileged  ports  greater  than  1024  ,  on  any  host   4.    allows  all  classes  to  connect  to  the  HTTP  port  80  on  any   host.   •  You  can  obtain  complete  details  by  following  links:   spec/security-spec.doc3.html

Các file đính kèm theo tài liệu này:

  • pdftailieu.pdf