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 |
Chia sẻ: Khủng Long | Lượt xem: 1477 | 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