Hỗ trợ gọi phương thức từ xa trên các đối tượng trong các máy ảo (JVM) khác nhau Tích hợp mô hình đối tượng phân tán vào ngôn ngữ lập trình Java theo một cách tự nhiên, có tin cậy trong khi vẫn duy trì các ngữ cảnh đối tượng của ngôn ngữ lập trình Java Làm cho mô hình đối tượng phân tán và mô hình đối tượng cục bộ không có sự khác biệt
Trang 1Chapter 9 RMI
Remote Method Invocation
GV: Nguyễn Thị Thanh Vân
1
Trang 2 Giới thiệu
Hoạt động của RMI
Hoạt động của lớp trung gian
Thiết kế và cài đặt một chương trình RMI
Thực thi hệ chương trình RMI, ex
Chuyển tham số trong RMI, ex
Trang 3Java Simplified / Session 22 / 3 of 45
Lập trình HĐT phân tán:
◦ Môi trường hợp tác
◦ Tận dụng nguồn tài nguyên phân tán trên mạng
Java: giải quyết vấn đề lập trình phân tán
◦ Có NET của Microsoft
Trong Java, sử dụng kỹ thuật RMI để cài đặt các đối tượng phân tán.
◦ KT xuyên suốt trong toàn bộ kiến trúc của Java
Giới thiệu
3
Trang 4 Local method Invocation : mã lệnh của hàm (hay thủ tục) được nạp thẳng vào bộ nhớ và thực thi ngay trên máy cục bộ
Muốn nạp nội dung hàm hay đối tượng ở 1 máy nào đó gọi chúng từ một máy khác?
thức giao tiếp giữa các đối tượng Java có mã lệnh cài đặt nằm trên máy khác nhau có thể gọi lẫn nhau.
Giới thiệu
4
Trang 5Java Simplified / Session 22 / 5 of 45
Mô hình tri u g i các đ i tư ng t xa ệ ọ ố ợ ừ
Computer C
C1
Computer A
A2 A1
Computer B
B3
B2 B2
5
Trang 6 Like RPC ,RMI has the following similarities
◦ Remote calls can be made
◦ Client/server contract based on interface
◦ RMI: chỉ hỗ trợ các ứng dụng được viết bằng Java
RMI và RPC (Remote Procedure Calling)
6
Trang 7Java Simplified / Session 22 / 7 of 45
RMI – Client/Server
Client (nơi gọi phương thức của các đối tượng ở xa) Server (nơi đối tượng thật sự được cài đặt để thực thi mã lệnh của phương thức).
7
Trang 8 Hỗ trợ gọi phương thức từ xa trên các đối tượng trong các máy ảo (JVM) khác nhau
◦ Tích hợp mô hình đối tượng phân tán vào ngôn ngữ lập trình Java theo một cách tự nhiên, có tin cậy trong khi vẫn duy trì các ngữ cảnh đối tượng của ngôn ngữ lập trình Java
◦ Làm cho mô hình đối tượng phân tán và mô hình đối tượng cục bộ không có sự khác biệt
Mục đích của RMI
8
Trang 9Java Simplified / Session 22 / 9 of 45
luôn phức tạp hơn gọi phương thức cục bộ:
◦ Việc tham chiếu đến biến, địa chỉ của đối tượng khác nhau ở các máy khác nhau
◦ Các tham số truyền cho phương thức của đối tượng ở xa phải được đóng gói và chuyển qua mạng đến phương thức thực sự (local-stack)
◦ Lời gọi phương thức từ xa phải thông qua mạng
và có thể bị ngắt ngang do mạng gặp sự cố
Phụ thuộc vào kết nối mạng
Vấn đề phát sinh
9
Trang 10 Đối tượng trên hai máy khác nhau không gọi trực tiếp mà thông qua lớp trung gian
Lớp trung gian tồn tại ở cả hai phía Client và Server
◦ Lớp ở máy Client gọi là Stub,
◦ Lớp ở máy Server gọi là Skel(Skeletion)
Lớp trung gian Stub sẽ biết cách thông báo lỗi khi có các sự cố về mạng cho Client
Giải pháp
10
Trang 11Java Simplified / Session 22 / 11 of 45
Lớp trung gian Stub và Skeletion
Computer C
C1
Computer A
A2 A1
Trang 12 Trình biên dịch Java (rmic.exe) sẽ tạo ra 2 lớp trung gian:
◦ Lớp Stub (lớp móc): chuyển về cho client
◦ Lớp Skeleton (lớp nối): Phía Server
Stub và Skeletion sẽ giúp các đối tượng ở xa giao dịch với nhau ?
◦ Đối tượng Server (trên máy Server) cần cung cấp một giao diện tương ứng với các phương thức của nó (Server Object) cho
phép đối tượng Client gọi nó trên máy Client dễ dàng.
◦ Đối tượng client sẽ luôn nghĩ rằng nó đang hoạt động trực tiếp với đối tượng server trên máy cục bộ.
Lớp trung gian Stub và Skeletion
12
Trang 13Java Simplified / Session 22 / 13 of 45
Ví dụ:
Phương thức A truyền cho phương thức B hai số a,b Phương thức B sẽ cộng hai số a,b cho ra kết quả c
và trả về phương thức A
Quá trình diễn ra như sau:
Lớp trung gian Stub và Skeletion
a,b c 13
Trang 14Kiến trúc của RMI
The Stub and Skeleton layer, which intercepts method calls made
by the client to the interface reference variable and redirects these calls to a remote RMI service.
The Remote Reference layer understands how to interpret and
manage references made from clients to the remote service objects.
The Transport layer, which is based on TCP/IP connections between
machines in a network It provides basic connectivity, as well as some firewall penetration strategies
14
Trang 15Java Simplified / Session 22 / 15 of 45
Kiến trúc của RMI
15
Trang 16Quá trình hoạt động của RMI
Registry
RMI Server Skeleton
Remote Machine (Server)
Stub RMI Client
Local Machine (Client)
Trang 17Java Simplified / Session 22 / 17 of 45
B1: RMI-server đăng ký tên của đối tượng với bộ q.lý Registry B2: Bộ quản lý Registry trả về tham chiếu đến đối tượng ở xa (RMI Server) thông qua lớp giao tiếp
B3-4: RMI-client liên lạc với bộ Registry để lấy về tham chiếu đến đối tượng trên Server
Các quá trình đăng ký và truy tìm tên đối tượng được Java quản lý bằng các hàm giao tiếp API JNDI
B5-7: Client sẽ gọi các phương thức của đối tượng trên Server
Khi một phương thức được gọi, sẽ được chuyển tiếp đến lớp trung gian Stub, rồi gọi đến lớp Skeleton (hđ Stub).
B8-10: Lớp Skeleton sẽ trực tiếp yêu cầu đối tượng thực thi phương thức và trả kết quả cho Client (hđ Skeletion)
Quá trình hoạt động của RMI
17
Trang 18 là một chương trình dịch vụ chạy ở hậu trường (rmiregistry.exe), thực hiện mở ổ cắm socket và lắng nghe các yêu cầu gởi đến
cổng mặc định 1099, có thể chỉ định một cổng khác với cổng 1099.
◦ Ví dụ: C:\j2sdk1.4.0\bin\ rmiregistry.exe 9999
tượng từ xa thực hiện tìm kiếm dịch vụ,
Trình (bộ quản lý)đăng ký Registry
Client
Server Registry
18
Trang 19Java Simplified / Session 22 / 19 of 45
Hoạt động của Stub, Skeleton
Client gọi một phương thức từ xa, lời gọi
này được chuyển tiếp đến Stub.
Stub có nhiệm vụ gửi tiếp lời yêu cầu
này đến Skeleton phía server bằng cách
Stub mở một socket đến server,
đóng gói các tham số:
• Gói nhận dạng đối tượng từ xa
• Gói phương pháp nhận dạng
truyền luồng dữ liệu này đến Skeleton.
Skeleton chứa đựng một phương thức
nhận các lời yêu cầu từ xa,
mở gói tham số,
gọi hàm thực sự trên server để tính toán
trả kết quả về Stub phía client.
19
Trang 20 Giao tiếp Remote
Giao tiếp này không khai báo bất kỳ phương thức nào Các phương thức được khai báo trong phương thức này là các giao tiếp có thể được gọi từ xa.
Lớp Naming
Lớp java.rmi.Naming truyền tin trực tiếp với một trình đăng ký đang chạy trên server để ánh xạ các URL rmi://hostname/Objectname thành các đối tượng
từ xa cụ thể trên host xác định:
◦ Rmi là giao thức dùng để đăng kí
◦ Hostname và port là đ/c IP và số hiêu cổng của Server nơi bộ Registry đang chạy
◦ Objectname là tên tự đặt, các ct phía client sẽ dựa vào tên này để truy tìm tham chiếu đến đối tượng cần dùng.
URL rmi vs URL http.
Các lớp và các giao tiếp trong gói java.rmi
20
Trang 21Java Simplified / Session 22 / 21 of 45
Lớp Naming cung cấp các phương thức sau:
RemotException trả về một mảng các xâu ký tự, mỗi xâu là một URL đã được gắn với một tham chiếu url là URL của trình đăng ký Naming
RemotException, NotBoundException, AccessException, MalformedURLException Client lookup để tìm kiếm một đối tượng từ xa gắn liền với tên đối tượng
NotBoundException : server ở xa không nhận ra tên của nó.
Naming class - methods
21
Trang 22 Public static void bind(String url, Remote object) throws RemotException, AlreadyBoundException,
MalformedURLException, AccessException
để liên kết một tên với một đối tượng ở xa Nếu thành công thì client có thể tìm kiếm đối tượng stub từ trình đăng ký
Có rất nhiều tình huống có thể xảy ra khi gán tên.
◦ MalformedURLException: url không đúng cú pháp
◦ RemoteException : không thể liên lạc được với trình đ.ký
◦ AccessException : client không được phép gán các đối tượng trong trình đăng ký
◦ AlreadyBoundException : nếu đối tượng URL đã gắn với một đối tượng cục bộ
Naming class - methods
22
Trang 23Java Simplified / Session 22 / 23 of 45
public static void rebind(String url, Remote obj)throws RemoteException,
AccessException, MalformedURLException
Phương thức này giống như phương thức bind() ngoại trừ việc là nó gán URL cho đối tượng ngay cả khi URL đã được gán.
Naming class - methods
23
Trang 24 là lớp con của lớp RemoteObject;
là lớp cha của lớp UnicastRemoteObject.
UnicastRemoteObject class
là một lớp con cụ thể của lớp RemoteServer
Để tạo ra một đối tượng ở xa:
ta phải thừa kế lớp UnicastRemoteServer
khai báo lớp này thực thi giao tiếp Remote
Phương thức exportObject(Object): làm cho máy
ảo Java nhận diện được đối tượng Object.
24
Trang 25Java Simplified / Session 22 / 25 of 45
cho phép các client tìm kiếm các đối tượng ở xa trên một server theo tên
Các phương thức
◦ List() liệt kê tất cả các tên đã được đăng ký với trình đăng ký
trị mặc định là 1099.
Giao tiếp Registry
25
Trang 261 Đặc tả một giao tiếp từ xa (remote interface) trên server.
2 Hiện thực giao tiếp từ xa (remote interface) để Xây dựng một đối tượng từ xa (remote object)
3 Sinh ra các Stub phía client và Skeleton phía server.
4 Xây dựng chương trình phía Server
5 Xây dựng chương trình phía Client.
6 Khởi động bộ đăng ký RMI (RMI registry)
7 Khởi động các đối tượng từ xa phía server
8 Chạy chương trình phía client.
Các bước thiết kế và cài đặt RMI
26
Trang 27Java Simplified / Session 22 / 27 of 45
Triệu gọi đối tượng RMI giữa trình khách và đối tượng chủ ở xa
Ex, Cài đặt chương trinhg cộng 2 số nguyên
27
Trang 28 Các đối tượng trong Remote Inteface phải có khả năng giao tiếp với các đối tượng ở xa (Kế thừa
Trang 29Java Simplified / Session 22 / 29 of 45
Từ giao tiếp RI đã định nghĩa, đối tượng thực sự phải được cài đặt:
/* CalculatorImpl.java*/
import java.rmi.*;
public class CalculatorImpl implements Calculator {
public int addNum( int x, int y) throws RemoteException {
System out println( "Client request to calculate" );
return (x+y);
} }
Biên dịch
2 Hiện thực Remote Interface
29
Trang 30 Dựa vào lớp cài đặt CalImpl.class, trình biên dịch rmic.exe của Java sẽ cung cấp hai lớp trung gian
Trang 31Java Simplified / Session 22 / 31 of 45
/* CalServer.java*/
public class CalculatorServer{
public static void main(String[] args) throws AlreadyBoundException {
try {
//tao doi tuong Calculator thuc su
CalculatorImpl c= new CalculatorImpl();
System out.println( "Exporting Calculator ! " );
//thông báo sự hiện diện c là đối tượng có khả năng Remote cho JVM
Biên dịch
4 Xây dựng chương trình trên Server
31
Trang 32 Chương trình phía bên máy client có khả năng gọi và sử dụng đối tượng Cal trên máy server:
/* CalculatorClient.java*/
import java.rmi.*;
public class CalculatorClient {
public static void main(String[] args){
try {
System out println( "Finding Object … " );
// tìm đối tượng cần truy xuất theo tên
Calculator c= (Calculator) Naming.lookup ( "rmi://localhost/Van" );
// goi phuong thuc cua doi tuong
System out println(c.addNum(5,10));
} catch (Exception e) { System. out.println(e); }
} } Biên dịch
5 Xây dựng chương trình trên Client
32
Trang 33Java Simplified / Session 22 / 33 of 45
C:\RMI>rmiregistry.exe
Nó có nhiệm vụ đón nhận (luôn trong trạng thái sẵn sàng phục vụ) các kết nối chứa thông tin về đối tượng
do phương thức Naming.bind() gửi đến
Mặc định rmiregistry.exe lắng nghe các kết nối gửi đến cổng 1099, có thể chỉ định lại:
◦ C:\RMI>rmiregistry.exe 2012
◦ rmiregistry.exe có trong \Java\jdk1.7.0_05\bin
Không cần chạy service trên nếu có:
LocateRegistry.createRegistry(1099);
trong main của trình Server
6 Kích hoạt bộ đăng ký
33
Trang 34C:\RMI>java CalculatorServer Exporting Calculator…
Register Calculator!
Cũng như rmiregistry.exe, sau khi Calculator
đi vào vòng lặp vô tận để chờ nhận yêu cầu
từ client đến
7 K.động các đối tượng phía Server
34
Trang 35Java Simplified / Session 22 / 35 of 45
C:\RMI>java CalculatorClient Finding Object…
15 -> kết quả trả về là lời gọi đến phương thức addNum() của đối tượng CalculatorImpl
Quay lại cửa sổ DOS trên Server thấy:
Client request to calculate -> hàm addNum() đã được gọi thực hiện
8 Chạy chương trình phía Client
35
Trang 3636
Trang 37Java Simplified / Session 22 / 37 of 45
Review
37
Trang 38 Dựa vào JVM ta có thể tạo tùy ý các máy tính ảo (cho các ct chạy trên các cửa sổ DOS khác nhau) giao tiếp với nhau giả lập mạng.
Java, cùng 1 chính sách bảo mật -> dễ vận hành.
Khi vận hành trên các máy tính vật lý khác nhau cần chú ý về thư viện, security policy
Lưu ý cách vận hành
38
Trang 39Java Simplified / Session 22 / 39 of 45
RMI trên JVM
39
Trang 40RMI trên máy thực
40
cài đặt của đối tượng
Trang 41Java Simplified / Session 22 / 41 of 45
Tự tạo bộ đăng kí và tự đăng kí đối tượng:
Calculator cal = new CalculatorImpl();
System out println( "Exporting Calculator ! " );
UnicastRemoteObject.exportObject(cal);
System out println( "Registering object …" );
Naming.bind( "rmi://localhost/myCal" , cal);
System out println( “Register Calculator" );
System out println( "Waiting for client request…" );
Trang 42 Các lớp và phạm vi sử dụng
Các lớp được tạo ra trong RMI
Cal.class CalImpl.class CalServer.class CalImpl_Stub.class CalImpl_Skel.class
Cal.class CalClient.class CalImpl_Stub.class
42
Trang 43Java Simplified / Session 22 / 43 of 45
Trang 44 Codebase (HTML)
◦ [CODEBASE = URLDirectory] //xác định vị trí tệp từ xa
◦ Codebase cho phép nạp tự động các lớp _Stub.class từ
xa (khi đăng ký đối tượng với rmiregistry trên máy chủ)
Trang 45Java Simplified / Session 22 / 45 of 45
Nạp stub từ xa xuống client thông qua web server
3 Client yêu cầu rmi registry trả về tham chiếu đối tượng, nhưng client chưa có stub, rmi registry cho nó biết địa chỉ webserver để
nó lên download stub về
4 Client yêu cầu webserver cung cấp stub
5 Client sử dụng stub đó để giao tiếp với server rmiregistry sẽ hướng dẫn máy khách tự động nạp lớp _Stub từ địa chỉ codebase: http://172.16.11.12/myclass/
Trang 46 Với Java tất cả các thao tác kết nối và chép tập tin lạ từ một máy khác về một máy đều phải thông qua lớp bảo vệ:
SecurityManager
client cần bổ sung thiết lập lớp phòng vệ:
System.setSecurityManager(new RMISecurityManager()); //sau try{
Nạp file từ xa và security policy phía client
46
Trang 47Java Simplified / Session 22 / 47 of 45
Nạp file từ xa và security policy phía client
47
/* CalculatorClient.java*/
import java.rmi.*;
public class CalculatorClient {
public static void main(String[] args){
try {
System.setSecurityManager( new RMISecurityManager());
System out println( "Finding Object … " );
// tìm đối tượng cần truy xuất theo tên
Calculator c= (Calculator)Naming.lookup
( "rmi://localhost/Van" );
// goi phuong thuc cua doi tuong
System out println(c.addNum(5,10));
} catch (Exception e) { System. out println(e); }
} }
Trang 48 Hệ thống phòng vệ RMISecurityManager sẽ cho phép hoặc cấm các kết nối từ xa dựa trên thiết lập trong file:
\java\jdk1.7.0_05\jre\lib\security\java.policy
Mở tập tin java.policy, edit:
grant { permission java.security.AllPermission;
// ko phòng vệ
permission java.net.SocketPermission
"*:1099", "connect, accept, resolve";
// This allows RMI clients to contact the RMIRegistry of any host
};
Nạp file từ xa và security policy phía client
48
Trang 49Java Simplified / Session 22 / 49 of 45
Đối với việc truyền tham số qua mạng theo cơ chế RMI thì có hai nguyên tắc sau:
Tất cả các kiểu dữ liệu đơn giản như int, char,… đều được truyền theo tham trị
Tất cả các dữ liệu kiểu đối tượng muốn truyền qua mạng đều buộc phải cài đặt một trong hai tiếp là
Remote hoặc Serializable
Các đối tượng cài giao tiếp Remote sẽ được truyền theo tham chiếu
Các đối tượng cài đặt giao tiếp Serializable sẽ được truyền theo tham trị
Các đối tượng ko được cài đặt giao tiếp Serializable hay Remote thì ko thể dùng làm tham số truyền qua mạng được
Chuyển tham số trong RMI
49