Bài Giảng Lập Trình Phân Tán RMI

26 417 0
Bài Giảng Lập Trình Phân Tán RMI

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

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

Ngày đăng: 09/11/2015, 17:56

Tài liệu cùng người dùng

Tài liệu liên quan