Báo cáo môn học Lập Trình Hệ Thống với Java Đề tài số 7 Tìm hiểu Lập trình phân tán trong Java

81 607 1
Báo cáo môn học Lập Trình Hệ Thống với Java Đề tài số 7 Tìm hiểu Lập trình phân tán trong Java

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Báo cáo môn học Lập Trình Hệ Thống với Java Đề tài s ố 7 Tìm hiểu Lập trình phân tán trong Java

Đại Học Công Nghệ Thông Tin ĐH Quốc Gia Tp HCM *********** _ Báo cáo mơn học Lập Trình Hệ Thống với Java Đề tài số 7: Tìm hiểu Lập trình phân tán Java (Nguồn Chương Core Java™ Volume II - Advanced Features, Seventh Edition) GVHD: Bùi Thanh Hiếu(Msc) Thành viên nhóm: Huỳnh Thái Bình Hoàng Minh Hải Huỳnh Xuân Tâm Phan Thanh Hưng 08520031 08520105 08520326 08520164 26/04/2011 Trường Đại Học Công Nghệ Thông Tin – Đại Học Quốc Gia Hồ Chí Minh 2011 Lời nói đầu Lập trình đối tượng phân tán vấn đề nóng bỏng cơng nghệ phần mền ngày Java ngôn ngữ tiên phong việc giải vấn đề lập trình phân tán Ngày bạn đến kỹ thuật lập trình thiếu sót lớn Từ NET Microsoft Java Sun tất hướng đến môi trường hợp tác tận dụng nguồn tài nguyên phân tán mạng Chương giới thiệu với bạn khái niệm cách cài đặt đối tượng phân tán kỹ thuật RMI Java Nội dung chính:        The Roles of Client and Server Remote Method Invocations Setup for Remote Method Invocation Parameter Passing in Remote Methods Server Object Activation Java IDL and CORBA Remote Method Calls with SOAP Phân chia cơng việc nhóm:  Bạn Huỳnh Thái Bình phụ trách phần: The Roles of Client and Server Remote Method Invocations  Bạn Hoàng Minh Hải phụ trách phần: Setup for Remote Method Invocation  Bạn Huỳnh Xuân Tâm phụ trách phần: Parameter Passing in Remote Methods Server Object Activation  Bạn Phan Thanh Hưng phụ trách phần cuối: Java IDL and CORBA Remote Method Calls with SOAP Lập Trình Hệ Thống Với Java – Tìm hiểu lập trình phân tán Java Trường Đại Học Công Nghệ Thông Tin – Đại Học Quốc Gia Hồ Chí Minh 2011 I/ The Roles of Client and Server(Vai trò Client Server): - Lấy ý tưởng thu thập thông tin máy tính khách hàng gửi thơng tin qua mạng cho máy chủ Giả sử người sử dụng máy tính cá nhân điền vào mẫu yêu cầu thông tin Dữ liệu gửi đến máy chủ nhà cung cấp Các máy chủ xử lý yêu cầu gửi lại thông tin sản phẩm cho khách hàng Figure 5-1 Transmitting objects between client and server - Trong mơ hình truyền thống client/server, khách hàng u cầu định dạng truyền tải gửi liệu yêu cầu đến máy chủ Các máy chủ phân tích yêu cầu định dạng định dạng phản ứng để truyền cho khách hàng Khách hàng sau phân tích phản ứng hiển thị cho người dùng - Nếu bạn thực tay, có rắc rối lớn: Bạn phải thiết kế định dạng truyền tải, bạn phải viết code cho việc chuyển đổi liệu định dạng truyền Lập Trình Hệ Thống Với Java – Tìm hiểu lập trình phân tán Java Trường Đại Học Công Nghệ Thông Tin – Đại Học Quốc Gia Hồ Chí Minh 2011 Note: Trong ví dụ này, chúng tơi giả định khách hàng máy tính tương tác với người sử dụng Tuy nhiên, khách hàng chạy ứng dụng web yêu cầu dịch vụ từ chương trình chạy máy tính khác Có hai đối tượng giao tiếp, đối tượng khách hàng ứng dụng web đối tượng máy chủ thực dịch vụ Đây mơ hình phổ biến thực tế - Chúng quan tâm vào mơ hình truyền thống client/server làm cho vai trò máy khách máy chủ trực quan - Cơ chế mà lập trình viên làm cho khách hàng phương pháp gọi thường xuyên, mà không lo lắng việc gửi liệu qua mạng hay phân tích phản ứng.đối tượng thực cơng việc khơng nằm máy ảo Nó khơng thực ngơn ngữ lập trình Java - Giải pháp cài đặt proxy(sử uỷ quyền) cho đối tượng server client Proxy phương pháp phổ biến Các proxy client liên lạc với server - Lập trình viên đối tượng máy chủ không muốn phiền phức với giao tiếp khách hàng Giải pháp cài đặt đối tượng proxy thứ hai máy chủ Các máy chủ proxy giao tiếp với proxy khách hàng, làm cho phương pháp phổ biến Figure 5-2 Remote method call with proxies Lập Trình Hệ Thống Với Java – Tìm hiểu lập trình phân tán Java Trường Đại Học Công Nghệ Thông Tin – Đại Học Quốc Gia Hồ Chí Minh 2011 - Vậy làm để proxy giao tiếp với nhau? -> Điều phụ thuộc vào cơng nghệ thực - Có ba lựa chọn phổ biến:  RMI, Java Remote Method Invocation Technology hỗ trợ phương thức gọi phân phối đối tượng Java  CORBA, Common Object Request Broker Architecture hỗ trợ phương thức gọi đối tượng ngôn ngữ lập trình CORBA sử dụng Internet Inter-ORB Protocol, IIOP, để giao tiếp đối tượng  SOAP, Simple Object Access Protocol ngơn ngữ lập trình trung gian Tuy nhiên, SOAP sử dụng định dạng truyền dẫn dựa XML Note: Microsoft sử dụng COM Trong khứ, Microsoft đặt COM đối thủ so với CORBA Tuy nhiên, thời điểm này, Microsoft tập trung vào SOAP - CORBA SOAP hồn tồn ngơn ngữ trung gian Chương trình client server viết C, C + +, Java, ngôn ngữ khác Bạn cung cấp giao diện để xác định tín hiệu phương thức loại liệu đối tượng bạn xử lý Những mô tả định dạng ngôn ngữ đặc biệt, gọi ngôn ngữ định nghĩa giao diện (IDL) cho CORBA ngôn ngữ mô tả dịch vụ Web (WSDL) cho SOAP - Khá người tin CORBA mơ hình đối tượng tương lai Thành thật mà nói CORBA có ích việc triển khai vấn đê phức tạp vấn đề tương thích - SOAP đơn giản, trở nên phức tạp, u cầu nhiều tính mà CORBA có Các giao thức XML có lợi ngơn ngữ gần gũi với người nên giúp ích cho việc gỡ rối Nhìn chung, CORBA hiệu hơn, SOAP phù hợp tốt cho kiến trúc web - Nếu hai đối tượng giao tiếp thực code Java, việc dùng CORBA SOAP không cần thiết Sun phát triển chế đơn giản, phương pháp triệu gọi phương thức từ xa-Remote Method Invocation (RMI), đặc biệt dùng cho giao tiếp ứng dụng Java Lập Trình Hệ Thống Với Java – Tìm hiểu lập trình phân tán Java Trường Đại Học Công Nghệ Thông Tin – Đại Học Quốc Gia Hồ Chí Minh 2011 II./ Remote Method Invocations(Gọi phương thức từ xa): - Nếu bạn có quyền truy cập vào đối tượng máy tính khác, bạn gọi phương thức đối tượng từ xa Tất nhiên, tham số phương thức cách phải gửi đến máy khác, máy chủ phải thông báo để thực phương thức, giá trị trả phải return trở lại RMI xử lý việc - Ví dụ: client tìm kiếm thơng tin sản phẩm truy vấn đối tượng máy chủ Nó gọi phương thức từ xa, tìm kiếm, có tham số: đối tượng khách hàng Việc tìm thấy trả đối tượng cho client: đối tượng sản phẩm Figure 5-3 Invoking a remote method on a server object - Trong thuật ngữ RMI , đối tượng phương thức tạo lời gọi từ xa gọi client object Các đối tượng từ xa gọi server object Điều quan trọng phải nhớ thuật ngữ client/server áp dụng cho lời gọi phương thức Các máy tính chạy code Java mà gọi phương thức từ xa client máy tính lưu trữ đối tượng mà thực lời gọi server Điều hoàn toàn làm cho vai trò đảo ngược lại Server lời gọi trước trở thành client gọi một đối tượng phương thức từ xa máy tính khác Lập Trình Hệ Thống Với Java – Tìm hiểu lập trình phân tán Java Trường Đại Học Công Nghệ Thông Tin – Đại Học Quốc Gia Hồ Chí Minh 2011 1/ Stubs and Parameter Marshalling: - Khi client muốn gọi phương thức từ xa đối tượng từ xa, gọi phương pháp thông thường đối tượng proxy gọi stub Stub nằm máy client, server Ví dụ, giao thức RMI đối tượng mã hố với chế Q trình mã hóa thơng số gọi tham số marshalling(parameter marshalling) Mục đích tham số marshalling chuyển đổi tham số vào định dạng thích hợp cho việc vận chuyển từ máy ảo với - Phương thức stub client xây dựng khối thông tin bao gồm: o Nhận dạng đối tượng từ xa sử dụng; o Một mô tả phương thức gọi ; o Các tham số marshalled - Phương thức stub sau gửi thơng tin tới server Về phía server, đối tượng thực hành động cho lời gọi phương thức từ xa: o Nó khơng có thơng số marshals o Nó định vị đối tượng gọi o Nó gọi phương thức mong muốn o Nó giữ đặt giá trị trả ngoại lệ gọi o Nó gửi gói gồm liệu trả marshalled tới stub client Lập Trình Hệ Thống Với Java – Tìm hiểu lập trình phân tán Java Trường Đại Học Công Nghệ Thông Tin – Đại Học Quốc Gia Hồ Chí Minh 2011 Figure 5-4 Parameter marshalling - Quá trình rõ ràng phức tạp, hồn tồn tự động minh bạch cho lập trình viên Hơn nữa, nhà thiết kế đối tượng Java từ xa cố gắng để cung cấp cho đối tượng từ xa "look and feel(xem cảm thấy)" đối tượng nội 2./ Dynamic Class Loading: - Khi truyền đối tượng từ xa đến chương trình khác, tham số hay giá trị trả phương thức từ xa, chương trình phải có file class cho đối tượng Ví dụ, xem xét phương thức với kiểu trả sản phẩm Tất nhiên, chương trình client cần lớp Product.class để biên dịch Nhưng giả sử server khởi tạo trả đối tượng sách, sách phân nhóm sản phẩm Các client chưa thấy class Book, khơng biết nơi để tìm file lớp Book.class - Do đó, nạp lớp tải từ máy chủ Quá trình tương tự trình nạp lớp applet chạy trình duyệt Bất chương trình tải mã từ vị trí mạng, phát sinh vấn đề an ninh Lập Trình Hệ Thống Với Java – Tìm hiểu lập trình phân tán Java Trường Đại Học Cơng Nghệ Thơng Tin – Đại Học Quốc Gia Hồ Chí Minh 2011 Vì lý đó, bạn cần sử dụng chương trình quản lý bảo mật(security manager) ứng dụng client RMI Đây chế an tồn để bảo vệ chương trình từ virus mã stub Đối với ứng dụng chuyên ngành, lập trình thay tải lớp quản lý an ninh, cung cấp hệ thống RMI đủ cho sử dụng bình thường III/ Setup for Remote Method Invocation(Cài đặt cho phương pháp truyền dẫn liệu từ xa): - Ngay chạy ví dụ đơn giản đối tượng từ xa(remote object) yêu cầu nhiều thiết lập khơng chạy chương trình độc lập applet Bạn phải chạy chương trình máy tính máy chủ máy khách Các thơng tin object cần thiết phải tách vào vào phía giao diện máy khách giao diện máy chủ phía triển khai Ngoài ra, chế đặc biệt cho phép client tra cứu để xác định vị trí object máy chủ - Để bắt đầu, qua yêu cầu, sử dụng ví dụ đơn giản Trong ví dụ tạo vài đối tượng loại sản phẩm máy chủ Sau chạy chương trình máy tính client để xác định vị trí truy vấn đối tượng 1/ Interfaces and Implementations(Giao diện Triển khai): - Chương trình client cần để thao tác đối tượng server khơng thực copy chúng Các đối tượng tự cư trú máy chủ Mã client phải biết làm với đối tượng, khả chúng thể giao diện chia sẻ client server để cư trú đồng thời hai máy interface Product // shared by client and server extends Remote { String getDescription() throws RemoteException; } - Cũng ví dụ tất giao diện cho remote object phải mở rộng giao diện từ xa xác định gói java.rmi Tất phương pháp giao diện phải biểu thị Remote Exception Lý cho việc khai báo gọi phương thức từ xa vốn tin cậy gọi địa phương, ln ln có gọi từ xa thất bại Ví dụ, máy chủ kết nối mạng tạm thời khơng có có vấn đề mạng Code máy client bạn phải chuẩn bị để đối phó với khả Đối với lý Ngơn ngữ lập trình Java buộc bạn phải theo kịp Remote Exception với tất Lập Trình Hệ Thống Với Java – Tìm hiểu lập trình phân tán Java Trường Đại Học Cơng Nghệ Thơng Tin – Đại Học Quốc Gia Hồ Chí Minh 2011 gọi phương thức từ xa để xác định hành động thích hợp để có gọi không thành công Các khách hàng truy cập đối tượng máy chủ thông qua stub để thực giao diện Product p = ; // see below how the client gets a stub reference String d = p.getDescription(); System.out.println(d); - Trong phần tiếp theo, bạn thấy làm client có tham chiếu đến loại đối tượng từ xa - Tiếp theo, phía máy chủ, bạn phải thực lớp mà thực thực phương pháp quảng cáo giao diện từ xa public class ProductImpl // server extends UnicastRemoteObject implements Product { public ProductImpl(String d) throws RemoteException { descr = d; } public String getDescription() throws RemoteException { return "I am a " + descr + " Buy me!"; } private String descr; } NOTE constructor ProductImpl khai báo để dịch chuyển RemoteException UnicastRemoteObject dịch chuyển ngoại lệ kết nối với dịch vụ mạng theo dõi đối tượng máy chủ - Lớp có phương pháp nhất, geTDescription ,có thể gọi từ khách hàng từ xa Lập Trình Hệ Thống Với Java – Tìm hiểu lập trình phân tán Java Trường Đại Học Công Nghệ Thông Tin – Đại Học Quốc Gia Hồ Chí Minh 2011 5/ Locating Objects Through IORs(Định vị đối tượng thông qua IORs): - Nếu bạn khơng thể cấu hình cho server ORB bạn dịch vụ Naming Service bạn định vị đối tượng CORBA cách dùng Interoperable Object Reference IOR chuỗi dài bắt đầu IOR: nhiều số hexadecimal.Ví dụ như: IOR :012020201000000049444c3a4163636f756e743a312e300001000000000000 004e000000010100200f0000003231362e31352e3131322e3137390020350420 202e00000001504d43000000001000000049444c3a4163636f756e743a312e30 000e0000004a61636b20422e20517569636b00 - IOR mô tả đối tượng Thông thường, nhiều lớp server in hết chuỗi IOR tất đối tượng mà chúng lưu giữ, giúp khởi động client để định vị chúng Bạn dán chuỗi IOR server vào chương trình client Cụ thể dùng code sau: String ref = "IOR:012020201000000049444c3a4163636f "; // paste IOR from server org.omg.CORBA.Object object = orb.string_to_object(ref); - Sau đó, thu hẹp đối tượng trả tới phù hợp, chẳng hạn: Env env = EnvHelper.narrow(object); Hoặc dùng: NamingContext context = NamingContextHelper.narrow(object); org.omg.CORBA.ORB 1.2  static ORB init(String[] commandLineArgs, Properties orbConfigurationprops) tạo ORB khởi động  String[] list_initial_services() Trả danh sách dịch vụ tồn lúc đầu chẳng hạn "NameService"  org.omg.CORBA.Object resolve_initial_references(String initialServiceName) trả đối tượng mà thực thi dịch vụ khởi đầu  org.omg.CORBA.Object string_to_object(String ior) định vị đối tượng với IOR cho trước 66 Lập Trình Hệ Thống Với Java – Tìm hiểu lập trình phân tán Java Trường Đại Học Công Nghệ Thông Tin – Đại Học Quốc Gia Hồ Chí Minh 2011 org.omg.CosNaming.NamingContext 1.2  org.omg.CORBA.Object resolve(NameComponent[] name) trả đối tượng với tên cho trước org.omg.CosNaming.NameComponent  1.2 NameComponent(String componentId, String componentType) Khởi tạo name component 6/ Implementing CORBA Servers(Thực thi Server CORBA): - Nếu bạn phát triển sở hạ tầng CORBA, bạn nhận thấy Java ngôn ngữ thực thi tốt đối tượng CORBA server Phần mô tả cách thức thực thi server CORBA ngơn ngữ lập trình Java - Chương trình ví dụ phần đơn giản phần trước Giả sử ta cung cấp dịch vụ cho phép tìm kiếm thuộc tính hệ thống máy ảo Java Sau mô tả IDL: interface SysProp { string getProperty(in string name); }; - Ví dụ, chương trình kiểm nghiệm client ta gọi tới server lệnh: CORBA::String_var key = "java.vendor"; CORBA::String_var value = sysProp->getProperty(key); ->Kết chuỗi mô tả nhà cung cấp máy ảo Java thực chương trình server Code trình bày Ví dụ: 5-21 - Để thực thi server, bạn chạy lệnh idlj với lựa chọn -fall (mặc định lệnh idlj tạo client-side stubs): idlj -fall SysProp.idl - Sau bạn mở rộng lớp SysPropPOA mà biên dịch idlj tạo từ file IDL Code sau: class SysPropImpl extends SysPropPOA { public String getProperty(String key) { return System.getProperty(key); } 67 Lập Trình Hệ Thống Với Java – Tìm hiểu lập trình phân tán Java Trường Đại Học Cơng Nghệ Thơng Tin – Đại Học Quốc Gia Hồ Chí Minh 2011 } - Tiếp theo, viết chương trình server thực nhiệm vụ sau: Khởi động ORB Định vị kích hoạt Portable Object Adaptor (POA) Tạo lớp server thực thi Sử dụng POA để chuyển tham chiếu tạm thời sang tham chiếu đối tượng CORBA In IOR Ràng buộc lớp server thực thi với Naming service Chờ lời gọi từ client - Bạn hiểu rõ Ví dụ:5-20 với code đầy đủ, sau điểm lưu ý: +Khởi động ORB: ORB orb = ORB.init(args, null); +Kích hoạt POA: POA rootpoa = (POA) orb.resolve_initial_references("RootPOA"); rootpoa.the_POAManager().activate(); + Khởi tạo đối tượng server chuyển sang đối tượng CORBA: SysPropImpl impl = new SysPropImpl(); org.omg.CORBA.Object ref = rootpoa.servant_to_reference(impl); + Từ phương thức object_to_string ta thu IOR in ra: System.out.println(orb.object_to_string(impl)); + Bạn tham chiếu tới Naming Service : org.omg.CORBA.Object namingContextObj = orb.resolve_initial_references("NameService"); NamingContext namingContext = NamingContextHelper.narrow(namingContextObj); + Sau bạn tạo tên mong muốn cho đối tượng, ta gọi đối tượng SysProp NameComponent[] path = { new NameComponent("SysProp", "Object") }; + Bạn dùng phương thức rebind để ràng buộc đối tượng với tên để gọi: namingContext.rebind(path, impl); + Cuối cùng, bạn chờ lời gọi từ client: orb.run(); - Để kiểm tra chương trình chạy, ta làm sau: Biên dịch file IDL, sử dụng trình biên dịch C++ Java: 68 Lập Trình Hệ Thống Với Java – Tìm hiểu lập trình phân tán Java Trường Đại Học Công Nghệ Thông Tin – Đại Học Quốc Gia Hồ Chí Minh 2011 omniidl -bcxx SysProp.idl idlj -fall SysProp.idl Biên dịch chương trình server: javac SysPropServer.java Biên dịch chương trình client C++ Trên Linux dùng lệnh: g++ -o SysPropClient -D x86 -D linux D OSVERSION =2 -I /usr/local/include/omniORB4/ SysPropClient.cpp SysPropSK.cc -lomniORB4 -lomnithread – lpthread Khởi động dịch vụ Naming Server orbd server Chương trình phần JDK: orbd -ORBInitialPort 2809 & Khởi động server, server chạy bạn dừng thơi java SysPropServer -ORBInitialPort 2809 & Chạy client, in nhà cung cấp JVM server: /SysPropClient -ORBInitRef NameService=corbaname::localhost - Bây bạn biết cách dùng CORBA để kết nối client server mà viết ngôn ngữ lập trình khác Ví dụ:5-20 SysPropServer.java import org.omg.CosNaming.*; import org.omg.CORBA.*; import org.omg.PortableServer.*; class SysPropImpl extends SysPropPOA { public String getProperty(String key) { return System.getProperty(key); 10 } 11 } 12 13 public class SysPropServer 14 { 15 public static void main(String args[]) 16 { 17 try 18 { 19 System.out.println("Creating and initializing the ORB "); 20 21 ORB orb = ORB.init(args, null); 22 69 Lập Trình Hệ Thống Với Java – Tìm hiểu lập trình phân tán Java Trường Đại Học Công Nghệ Thông Tin – Đại Học Quốc Gia Hồ Chí Minh 2011 23 System.out.println("Registering server implementation with the ORB "); 24 25 POA rootpoa = (POA) orb.resolve_initial_references("RootPOA"); 26 rootpoa.the_POAManager().activate(); 27 28 SysPropImpl impl = new SysPropImpl(); 29 org.omg.CORBA.Object ref = rootpoa.servant_to_reference(impl); 30 31 System.out.println(orb.object_to_string(ref)); 32 33 org.omg.CORBA.Object namingContextObj = orb.resolve_initial_references ("NameService"); 34 NamingContext namingContext = NamingContextHelper.narrow(namingContextObj); 35 NameComponent[] path = 36 { 37 new NameComponent("SysProp", "Object") 38 }; 39 40 System.out.println("Binding server implemenation to name service "); 41 namingContext.rebind(path, ref); 42 43 System.out.println("Waiting for invocations from clients "); 44 orb.run(); 45 } 46 catch (Exception e) 47 { 48 e.printStackTrace(System.out); 49 } 50 } 51 } Ví dụ:5-21 SysPropClient.cpp #include #include "SysProp.hh" using namespace std; 70 Lập Trình Hệ Thống Với Java – Tìm hiểu lập trình phân tán Java Trường Đại Học Công Nghệ Thông Tin – Đại Học Quốc Gia Hồ Chí Minh 2011 CORBA::Object_ptr getObjectReference(CORBA::ORB_ptr orb, const char serviceName[]) { CosNaming::NamingContext_var rootContext; 10 11 try 12 { 13 // Obtain a reference to the root context of the name service: 14 CORBA::Object_var initServ; 15 initServ = orb>resolve_initial_references("NameService"); 16 17 // Narrow the object returned by resolve_initial_references() to a CosNaming: :NamingContext 18 // object 19 rootContext = CosNaming::NamingContext::_narrow(initServ); 20 if (CORBA::is_nil(rootContext)) 21 { 22 cerr

Ngày đăng: 15/07/2015, 15:13

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan