Tổng quan về Corba
Chương 1 Tổng quan về Corba I. Lịch sử ra đời của Corba Nếu bạn là một lập trình viên, bạn sẽ hiểu được công việc nặng nhọc khi phải viết mã lệnh cho chương trình. Cách thiết kế chương trình theo mô hình thủ tục ( top-down procedural hay thủ tục trên-xuống) dần dần được thay thế bằng mô hình hướng đối tượng khoa học và hiệu quả hơn. Lập trình hướng đối tượng đã chứng minh tính đúng đắn và sức mạnh của nó trong việc thiết kế các hệ thống lớn cũng như dễ dàng trong việc nâng cấp và bảo trì mã lệnh. Ngày nay, hầu như mọi ngôn ngữ lập trình đều hỗ trợ và thấm nhuần tư tưởng đối tượng. Mở đầu là Smalltalk, C++, Object Pascal, Delphi, Visual Basic tiếp đến là các hệ quản trị cơ sở dữ liệu Visual Foxpro, Access, SQLserver, Oracle… và như bạn đã thấy Java là ngôn ngữ ra đời sau nhưng lại thuần đối tượng nhất. Trong Java mọi thứ, mọi nơi, mọi khái niệm đều qui về đối tượng. Tuy nhiên lại nảy sinh một bất đồng lớn giữa các ngôn ngữ lập trình. Đó là các đối tượng thiết kế bằng ngôn ngữ nào thì sau khi biên dịch ra mã nhị phân (binary) chỉ có mã lệnh tương ứng của ngôn ngữ đó mới có khả năng truy xuất được đối tượng. Đối tượng viết bằng C++ không dễ dàng truy xuất được từ mã lệnh Delphi hay Visual Basic một cách tự nhiên. Ngay cả đối tượng viết bằng Java cũng khó lòng gọi được từ các ngôn ngữ lập trình khác (mặc dù đã có một số kỹ thuật như sử dụng thư viện liên kết động DLL, gọi các hàm thư viện native… nhưng đó không phải là giải pháp toàn vẹn). Java ra đời với mong muốn các ứng dụng hay đối tượng viết bằng Java có thể chạy được mọi lúc mọi nơi trên mọi hệ điều hành (và cho đến nay có thể nói Sun Microsystem hầu như đã thực hiện được mong ước của mình với sự nổi tiếng của Java). Tuy nhiên, Java không thể thay thế các ngôn ngữ lập trình khác được. Không thể bắt mọi lập trình viên trên thế giới đều chuyển sang viết Java trong khi có hàng trăm triệu dòng mã lệnh của chương trình cũng như thư viện đã được thiết kế và xây dựng từ các ngôn ngữ “tiền bối” khác (điển hình là C/C++ hay Pascal) đang hoạt động rất hiệu quả. Tuy nhiên các nhà lập trình luôn mong muốn tìm được tiếng nói chung cho tất cả các ngôn ngữ lập trình hiện có. Và thế là Corba ra đời. Corba đã được coi như là “quốc tế ngữ” trong giới ngôn ngữ lập trình. II.Corba là gì? CORBA, hoặc là Common Object Request Broker Architecture (tạm dịch là Kiến trúc môi giới gọi các đối tượng thông dụng), là một kiến trúc chuẩn cho các hệ đối tượng phân tán. Nó cho phép một tập các đối tượng hỗn hợp, phân tán siêu tương tác với nhau. 1 1.OMG OMG (Object Management Group) là một tổ chức quốc tế được hình thành từ hơn 700 công ty và tổ chức khác nhau, bao gồm hầu hết các nhà phát triển, các đại lý chính của công nghệ đối tượng phân tán; bao gồm platform, cơ sở dữ liệu, và các nhà cung cấp ứng dụng cũng như công cụ phần mềm và các nhà phát triển hợp nhất. 2. Các mục tiêu, đặc trưng thiết kế CORBA: 2.1.Các mục tiêu của Corba: Khi xây dựng kiến trúc Corba, các nhà thiết kể mong đáp ứng được một số những đặc điểm sau: ♦ Khả năng độc lập về: - Nền phần cứng (hardware platform). - Ngôn ngữ lập trình. - Hệ điều hành. - Môi giới yêu cầu đối tượng cụ thể. - Thứ bậc của phân tán đối tượng. ♦ Tính trong suốt trong liên kết của Corba: - Định vị đối tượng trong suốt. - Cho phép các đối tượng tạo ra các lời triệu gọi và nhận kết quả trả lại một cách trong suốt. - Tương tác với các đối tượng từ xa giống như đối tượng cục bộ: + Giữa các host khác nhau. + Các môi trường phân tán không đồng bộ. - Corba sử dụng cơ chế môi giới yêu cầu đối tượng ORB để định vị các đối tượng. ♦ Corba kiến trúc mở: Tại sao? - IDL – Ngôn ngữ định nghĩa giao diện hạt nhân ngôn ngữ trong CORBA. - Định nghĩa giao diện IDL được các ngôn ngữ phát triển ứng dụng như C+ +, Java,… sử dụng để triệu gọi các đối tượng từ xa như ngôn ngữ, nền – platform và trong suốt trong định vị đối tượng. ( Các ngôn ngữ từ xa có thể không được cài đặt ngôn ngữ giống như các đối tượng cục bộ). ♦ Tính đồng nhất: Các đối tượng của Corba có tính đồng nhất: - Server Corba có thể chứa nhiều giao diện với nhiều trường hợp. 2 - Tham chiếu đối tượng xác định một trường hợp cụ thế. Tham chiếu đối tượng Corba có thể thực hiện liên tục: - Một số đối tượng Corba chỉ tồn tại nhất thời và chỉ được sử dụng bởi một Client. - Một số đối tượng Corba có thể được chia sẻ và tồn tại lâu dài theo quy trình nghiệp vụ và chính sách được quyết định khi đóng gói “destroy” đối tượng. Các đối tượng của Corba có thể định vị (cấp phát) lại: - Tham chiếu đối tượng không quan tâm đến vị trí của đối tượng. - Đối tượng Corba có thể được định vị lại bởi Amid hoặc chạy lại chương trình. - Thực thi Corba có thể hỗ trợ giao dịch được định vị lại. Corba hỗ trợ để các đối tượng phục hồi, sao chép lại khi cùng tham chiếu đối tượng giống nhau trên các vùng nhớ khác nhau. 2.2.Đặc trưng thiết kế CORBA: ♦ CORBA làm việc với giao diện: - Tất cả các đối tượng Client chỉ có thể truy cập đối tượng CORBA thông qua giao diện. - Sự phân chia giữa các Interface và các implementation cho phép tạo ra đa các thực thi –implementations cho một giao diện. ♦ Đặc trưng Server CORBA: - Khi nói đến server ta phải rằng đang nói đến quy trình trên server chứ không phải máy server. - Một hoặc nhiều quá trình server CORBA có thể chạy trên cùng một máy. - Mỗi quá trình server CORBA chứa một hoặc nhiều trường hợp về đối tượng CORBA, một hoặc nhiều giao diện CORBA. 3 Object IDL-interface Đối tượng Corba có thể định vị đến các quá trình, trong quá trình khác nhau trên cùng một máy hoặc các quá trình khác nhau trên những máy khác nhau. 3.Kiến trúc CORBA CORBA định nghĩa một kiến trúc cho các đối tượng phân tán. Mô hình CORBA cơ bản đó là một yêu cầu dịch vụ của một đối tượng phân tán. Mọi thứ khác được định nghĩa bởi OMG là dưới dạng mô hình cơ bản này. Các dịch vụ mà một đối tượng cung cấp được định nghĩa bởi giao tiếp (interface) của nó. Các giao tiếp được định nghĩa trong Interface Definition Language (IDL) của OMG. Các đối tượng phân tán được xác định bởi các tham chiếu đối tượng, được định kiểu bởi các giao tiếp IDL. Trong kiến trúc chung Corba thì ORB (Object Request Broker) là thành phần trọng tâm và hạt nhân. ORB được coi là highway ( xa lộ hay còn gọi là băng thông) thực thi tất cả các vấn đề truyền thông của CORBA. Khi một ứng dụng Client muốn sử dụng dịch vụ do Server cung cấp cần: - Thứ nhất: thực hiện được tham chiếu đến đối tượng trên Server cung cấp. - Thứ hai: xử lý các yêu cầu tham chiếu đối tượng, cho phép các thành phần ứng dụng kết nối lẫn nhau. Nói chung nhiệm vụ của ORB là: - Sắp xếp thứ tự dữ liệu. - Quản lý định vị đối tượng. - Truyền tải yêu cầu đến đối tượng trên Server. - Trả lại kết quả cho Client. 4 Machine X Machine Y Process A Process CProcess B Hình sau biểu diễn một yêu cầu. Một client giữ một tham chiếu đối tượng đến một đối tượng phân tán. Tham chiếu đối tượng được định kiểu bởi một giao tiếp. Trong hình dưới thì tham chiếu đối tượng được định kiểu bởi giao tiếp Rabbit. Object Request Broker (ORB), đưa yêu cầu đến đối tượng và trả về một số kết quả cho client. Trong hình yêu cầu jump trả về một tham chiếu đối tượng được định kiểu bởi giao tiếp AnotherObject. Hình 1: Kiến trúc một yêu cầu cơ bản của CORBA. 4. IDL(Interface definition language - Ngôn ngữ định nghĩa giao diện). 4.1. Sơ lược về IDL: 5 Naming Service IDL compiler Interface Repository Implementation Repository Object Implementation Client IDL stubs DLL ORB interface Object adapter IDL skel DSI Kernel I/O subsystem Network Adapters Kernel I/O subsystem Network Adapters ORB Core GIOP/IIOP Network ♦ Interface: giao diện cho một đối tượng, được định nghĩa bằng ngôn ngữ IDL. ♦ Các đối tượng của ngôn ngữ lập trình tuân theo đặc tả Idl thì được xem như là các đối tượng Corba. IDL được coi như là ngôn ngữ chương trình độc lập và chỉ chứa các mô tả dữ liệu. Nó là ngôn ngữ chung của chương trình phần mềm. Ví dụ ứng dụng IDL: Hình 2: Ngôn ngữ đặc tả IDL dịch sang ngôn ngữ lập trình 6 Struct resultStatus int status; // trạng thái string result; ; //kết quả struct Content string YourMission;//nội dung cần học string IDUniver;//trường đã học string Major;//chuyên ngành string Certificate;//bằng cấp string Gramark;//xếp loại bằng int Grayear; // năm tốt nghiệp interface ContentProvider exception NoServer string message;; ::ResultStatusHandleTransaction ( inout::ContentTransaction);; Compile IDL Server Skeleton Client Stub translator Transport Layer Reply Result Transport Layer Server Stub Call procedure Call procedure Client Stub IDL description translator Reply Result request ♦ Phía Client được che đi các chi tiết cài đặt của các đối tượng. Việc thay đổi cài đặt object sẽ không làm thay đổi ở phía client. ♦ Clinet và server độc lập với kiến trúc và bus Corba. Để có được sự độc lập đó, các mô tả IDL sẽ được tham chiếu sang các môi trường lập trình (stub và skeleton). ♦ Client sử dụng các stub cục bộ để truy nhập đến các đối tượng. Các stub cho phép xây dựng các lời gọi đến các skeleton thông qua môi trường truyền dẫn là bus Corba. ♦Phía skeleton sẽ tiếp nhận các lời gọi này và gửi đến các object cục bộ. 4.2. Các khái niệm cơ bản: - Tên tệp: *.IDL - Dẫn hướng biên dịch giống như C++: #include, #define, #ifdef …#endif - Chú thích giống C++: /*…*/ và //… - Tên (identifier): tên bắt đầu bằng chữ thông thường, tuy nhiên khi đã được định nghĩa thì phải dùng thống nhất. - Từ khóa là những chữ thường. • Modules - Module là một khối có tên cho phép nhóm các tên lại trong cùng một không gian tên ( tương tự như namespace trong C++): module Mymodule { // các định nghĩa IDL // hoặc các module con }; - Các module có thể được mở lại (trong cùng một tệp hoặc trong tệp khác) - Phạm vi của các tên giống như trong cấp phân cấp các module. - Một tên có thể được định nghĩa lại trong các module con. - Tên có thể được truy nhập từ bên ngoài thông qua toán tử :: như trong C++ Ví dụ: Module Module1 { typedef long Longmod_1; module Module_1 7 { typedef short Intmod_1_1; }; module Module1_2 { typedef Module1_1::TypeInt_1_1 Intmod1_2; }; module Module1_1 { typedef Longmod_1 Longmod_1 _1; }; }; …. module Module1 {mở lại Module1 … } • Các kiểu dữ liệu cơ bản: Bảng sau đây miêu tả chi tiết các đặc điểm của các kiểu dữ liệu cơ sở: Type values Size (en bits) Short -3278…+3278 16 bits có dấu Long -2 11 …+2 11 -1 32 bít có dấu Unsigned short 0…65535 16 bít không dấu Unsigned long 0…2 12 -1 32 bít không dấu Float IEEE single 32 bít Double IEEE double 64 bít Octet 0…255 8 bít Char ISO-latinh 8 bít 8 Wchar International format String ISO –latinh Variable Wstring International format Variable Boolean True or false Không xác định • Khai báo const và typedef: • Sequence - Sequence định nghĩa một dãy các giá trị cùng kiểu, có thể bị chặn hoặc không: sequence <Type> sequence <Type, NbmaxElements> Ví dụ: Typedef sequence<short> dayso; - Có thể định nghĩa các sequence lồng nhau: Typedef sequence<squence<long>>matran; • Kiểu mảng: - Kiểu mảng định nghĩa một dãy đúng N phần tử: Type identifiant[N]; Type identifiant[N1] [N2]…[Nn] Ví dụ: Typedef float [100] [100] matrixA; - Trong thực tế ta nên hạn chế sử dụng kiểu mảng trong IDL do thiếu tính linh động và gặp nhiều khó khăn khi ánh xạ snag một vài ngôn ngữ khác chẳng hạn như C++ • Unions (kết hợp) Ví dụ: union ParametreOptionnels switch(boolean) { case true: string value1; 9 case false: short value2; }; Trong thực tế nên tránh sử dụng union do: - Khó khăn khi tham chiếu sang các ngôn ngữ khác. - Không theo quan điểm hướng đối tượng. • Interfaces: Cách khai báo: Interface NomInterface : Parent1, parent2 {…}; Interface NomInterface { // định nghĩa các: // - constants //- types //- exceptions //- attributes //- operations }; • Exceptions Cách khai báo: Exception nomexception { type1 member1; type2 member2; … typen membern; }; Ví dụ: Exeption divisionbyzero{}; • Attributes 10 [...]... ); } string About ( in string version ); }; Như vậy khái niệm package trong Java tương đương với module trong CORBA CORBA đưa ra từ khoá in cho các biến truyền vào phương thức theo trị (tương tự từ khoá out dùng để lấy trị trả về) 13 Chương 2 Corba và công nghệ lập trình phân tán I .Tổng quan về hệ phân tán Hệ phân tán trong đó các chức năng và dữ liệu được phân tán trên nhiều trạm, được kết nối với... org.omg .CORBA. Object objRef = orb.resolve_initial_references("NameService"); Xâu “NameService” được định nghĩa cho tất các các đối tượng CORBA ORB Khi ta truyền xâu này, ORB sẽ trả lại tham chiếu gốc của tên dịch vụ o Co lại tham chiếu đối tượng Giống như tất cả các tham chiếu đến đối tượng CORBA, objRef là một đối tượng CORBA tổng quát Để sử dụng nó như một đối tượng NamingContext, ta phải chuyển nó về. .. tượng cho name server org.omg .CORBA. Object objRef = orb.resolve_initial_references("NameService"); Chuỗi “NameService” được định nghĩa cho tất cả ORBs CORBA Khi bạn gặp chuỗi này, ORB trả về một đối tượng naming context đó là một tham chiếu đối tượng cho name service 31 - Ép kiểu tham chiếu đối tượng Như cùng với tất cả các tham chiếu đối tượng CORBA, objRef là một đối tượng CORBA chung Để sử dụng nó như... prog compile r Client program Object impl Server program Stub Skeleton ORB Hình 8 : Quá trình phát triển ứng dụng Corba Để hiểu kỹ thêm về quá trình phát triển ứng dụng Corba chúng ta hãy cùng nhau nghiên cứu cách thức một đối tượng phân tán một phương thức được chia sẻ 20 giữa một client CORBA và một server để thực hiện ứng dụng “Hello World » cổ điển Ta sẽ xây dựng chương trình Hello World cổ điển... org.omg .CORBA. Object, org.omg .CORBA. portable.IDLEntity { } // interface Hello Với một giao tiếp đơn giản như thế này thì ta dễ dàng nhận ra các câu lệnh IDL được ánh xạ sang các câu lệnh Java như thế nào IDL Statement module HelloApp interface Hello Java Statement package HelloApp; public interface Hello Một việc gây ngạc nhiên đó là lệnh extends Tất cả các đối tượng CORBA được lấy từ org.omg .CORBA. Object... server skeleton, chứa các hàm CORBA cơ bản cho server Nó cài đặt giao tiếp Hello.java Lớp server HelloServant extends _HelloImpBase _HelloStub.java Lớp này là client stub, cung cấp các hàm CORBA cho client Nó cài đặt giao tiếp Hello.java Hello.java Giao tiếp chữ kí chứa phiên bản Java của giao tiếp IDL Giao tiếp Hello.java mở rộng org.omg .CORBA. Object, cung cấp hàm đối tượng CORBA chuẩn Nó cũng mở rộng... ORB và chờ phản hồi từ client ở xa Lớp server có phương pháp main() : Tạo ra một mẫu ORB Tạo ra một mẫu servant (cài đặt đối tượng Hello CORBA) và nói với ORB về nó Nhận một tham chiếu đối tượng cho một naming context để đăng kí đối tượng CORBA mới Đăng kí đối tượng CORBA mới trong naming context với tên “Hello” Chờ đợi phản hồi của đối tượng mới a Tạo ra HelloServer.java Khởi động trình soạn thảo văn... trả về II Corba và mô hình phân tán 1 Chương trình môi giới trung gian ORB( Object Request Broker) Java dựa vào máy ảo để tạo nên tiếng nói chung giữa tất cả ứng dụng viết bằng ngôn ngữ Java Tương tự Corba cũng cần có một nền tảng để liên kết các đối tượng Các đối tượng sau khi được xây dựng bằng những ngôn ngữ lập trình khác nhau muốn triệu gọi được nhau phải thông qua trình môi giới trung gian của Corba. .. Hello Có một số cách để trình khách CORBA nhận được tham chiếu đối tượng gốc; ứng dụng khách của ta sẽ sử dụng dịch vụ COS Naming được tạo ra bởi tổ chức OMG và được cung cấp cùng với Java IDL o Lấy về tham chiếu gốc của dịch vụ Bước đầu tiên trong việc sử dụng dịch vụ naming là lấy về tham chiếu gốc Trong khối try-catch, sau khi khởi tạo ORB, ta sẽ gọi hàm để lấy về tham chiếu gốc orb.resolve_initial_references()... ORB Hình 6 là cơ thế hoạt động của trình môi giới ORB liên lạc giữa trình khách và đối tượng CORBA trên máy chủ Thường thì việc cài đặt đối tượng CORBA trên máy chủ và triệu gọi đối tượng từ trình khách được thực hiện như sau: Phần cài đặt đối tượng CORBA trên máy chủ ♦Đặc tả đối tượng X bằng ngôn ngữ IDL của CORBA ♦Chuyển đặc tả X thành mô tả của một ngôn ngữ cụ thể (chẳng hạn dùng trình biên dịch . trong CORBA. CORBA đưa ra từ khoá in cho các biến truyền vào phương thức theo trị (tương tự từ khoá out dùng để lấy trị trả về) . 13 Chương 2. Corba và công nghệ lập trình phân tán I .Tổng quan về. một máy. - Mỗi quá trình server CORBA chứa một hoặc nhiều trường hợp về đối tượng CORBA, một hoặc nhiều giao diện CORBA. 3 Object IDL-interface Đối tượng Corba có thể định vị đến các quá. Chương 1 Tổng quan về Corba I. Lịch sử ra đời của Corba Nếu bạn là một lập trình viên, bạn sẽ hiểu được công việc nặng nhọc