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	
  	
  
...
                
              
                                            
                                
            
 
            
                 26 trang
26 trang | 
Chia sẻ: Khủng Long | Lượt xem: 1758 | Lượt tải: 0 
              
            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:
 tailieu.pdf tailieu.pdf