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

Rmi

Embed Size (px)

Citation preview

Page 1: Rmi

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

Page 2: 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  

Page 3: Rmi

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.  

Page 4: Rmi

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  

Page 5: Rmi
Page 6: Rmi

Kiến  trúc  RMI    

RMI Server

skeleton

stub

RMI Client

Registry

bind

lookupreturn call

Local Machine

Remote Machine

Page 7: Rmi

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  

Page 8: Rmi

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  

Page 9: Rmi

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  

Page 10: Rmi

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    

StubRMI Client RMI Server

skeleton

return

call

Page 11: Rmi

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    

StubRMI Client RMI Server

skeleton

return

call

Page 12: Rmi

Computer B  

Computer A  A1  

A2  

C1-­‐  stub  

 

B1_stub  

Computer C  

C1–Skel  

C1  

B1  

 

B1—Skel  

Page 13: Rmi

•  java.rmi.server.*  •  java.rmi.*  

Page 14: 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.  }  

 

Page 15: Rmi

 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  

Page 16: Rmi

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;

}

Page 17: Rmi

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();

}

Page 18: Rmi

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.

Page 19: Rmi

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()); } }

Page 20: Rmi

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  

Page 21: Rmi

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()); } }

}

Page 22: Rmi

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

Page 23: Rmi

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 <new port>

elpis:~/rmi> rmiregistry

•  Windows:      •  > start rmiregistry  

Page 24: Rmi

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

Page 25: Rmi

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”;

};

Page 26: Rmi

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:  http://java.sun.com/products//jdk/1.2/docs/guide/security/

spec/security-spec.doc3.html