Tải bản đầy đủ (.pdf) (26 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (220.33 KB, 26 trang )

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)
 

 


Remote
 Machine
 (Server)
 

 

SampleServer remoteObject;
int s;

s = remoteObject.sum(1,2);

System.out.println(s);

 

1,2
 

3
 

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

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
 
như
 thế

 nào
 
 

 
 -­‐>
 Client
 RMI
 gọi
 một
 phương
 thức
 trên
 đối
 
tượng
 ủy
 quyền
 
 


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 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
 
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>
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
<new port>
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”;
};


×