1. Trang chủ
  2. » Công Nghệ Thông Tin

CÔNG NGHỆ GRID COMPUTING VÀ ỨNG DỤNG THỬ NGHIỆM TRONG BÀI TOÁN QUẢN TRỊ MẠNG - 10 ppt

23 436 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 23
Dung lượng 663,67 KB

Nội dung

Phụ lục - 193 - <xsd:sequence> <xsd:element name="value" type="xsd:int"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="addResponse"> <xsd:complexType/> </xsd:element> </xsd:schema> </types> &lt! Messages > &lt! PortType > </definitions> Ở đây định nghĩa các kiểu của các thành phần add và addResponse. Trên đây vừa trình bày sơ nét về cấu trúc cơ bản của file GWSDL, có thể thêm các kiểu mới, mở rộng bằng cách tham khảo các không gian tên đã được định nghĩa sẵn. C C . . K K ỹ ỹ t t h h u u ậ ậ t t c c à à i i đ đ ặ ặ t t c c á á c c c c h h ứ ứ c c n n ă ă n n g g c c ơ ơ b b ả ả n n c c ủ ủ a a G G r r i i d d S S e e r r v v i i c c e e C C . . 1 1 . . K K ỹ ỹ t t h h u u ậ ậ t t c c à à i i đ đ ặ ặ t t O O p p e e r r a a t t i i o o n n P P r r o o v v i i d d e e r r Như đã giới thiệu, GT3 hỗ trợ 2 cách cài đặt interface trong ngôn ngữ lập trình, cách thứ nhất là kỹ thuật sử dụng tính kế thừa, ở đây lớp MathImpl kế thừa từ lớp GridServiceImpl, do GridServiceImpl có tất cả các chức năng cơ bản nên MathImpl chỉ cần cài đặt tất cả các phương thức của Math portType là đủ. Như trên hình 0-1, lớp MathImpl chứa tất cả các hàm cài đặt cho các phương thức của portType (L ưu ý, ở đây có nhiều hàm hơn). Tuy nhiên, cài đặt tất cả các phương thức của portType chỉ trong một lớp có thể gây ra nhiều bất tiện đặc biệt là đối với các portType lớn, có nhiều phương thức. Và kỹ thuật này, đối với Java, lớp MathImpl không thể kế thừa từ một lớp nào nữa, điều này hạn chế việc tái sử dụng mã. Phụ lục - 194 - Hình 8-1 Lớp triển khai interface của Grid service bằng kỹ thuật kế thừa. GT3 đưa một hướng tiếp cận mới để giải quyết khuyết điểm của kỹ thuật sử dụng tính kế thừa, đó là kỹ thuật uỷ quyền. Hướng tiếp cận này cho phép phân tán các nhóm phương thức vào các lớp khác nhau, các lớp này được gọi là Operation Provider. Như trên hình 0-2, có thể chia lớp MathImpl thành 3 lớp, ứng với từng nhóm phương thức. Hình 8-2 Cài đặt intrface củaGrid service bằng kỹ thuật Operation Provider Lưu ý là 3 lớp này không thừa kế từ lớp nào hết, chúng chỉ cài đặt một interface tên là Operation Provider. Lúc này các chức năng của lớp GridServiceImpl không được kế thừa từ đây mà được yêu cầu Grid service container cung cấp thông qua bản đặc tả triển khai. Khi tiến hành cài đặt theo cách tiếp cận này, có một số thay đổi nhỏ so với kỹ thuật sử dụng tính kế thừa, như trình bày dưới đây. Lớp cung cấp hoạt động (Operation Provider) ở đây gọi là MathProvider cũng giống như các lớp của MathImpl trước đây, chỉ khác là ở đây cài đặt thêm interface OperationProvider, file : $GRIDSER_DEMO/org/globus/progtutorial/services/core/providers/impl /MathProvider.java Phụ lục - 195 - package org.globus.progtutorial.services.core.providers.impl; import org.globus.ogsa.GridServiceBase; import org.globus.ogsa.GridServiceException; import org.globus.ogsa.OperationProvider; import java.rmi.RemoteException; import javax.xml.namespace.QName; //Luu y o day cai dat OperationProvider public class MathProvider implements OperationProvider { // Cac thuoc tinh cua Operation provider //Khai bao namespace private static final String namespace = "http://www.globus.org/namespaces/2004/02/progtutorial/MathService"; //Khai bao ten cac phuong thuc duoc cung cap, tuong ung voi file GWSDL private static final QName[] operations = new QName[] { new QName(namespace, "add"), new QName(namespace, "subtract"), new QName(namespace, "getValue") }; private GridServiceBase base; // Cac phuong thuc cua Operation Provider public void initialize(GridServiceBase base) throws GridServiceException { this.base = base; } public QName[] getOperations() { return operations; } //Cai dat private int value = 0; public void add(int a) throws RemoteException { value = value + a; } // tuong tu MathImpl } File đặc tả triển khai cũng có một số thay đổi, file : $GRIDSER_DEMO/org/globus/progtutorial/services/core/providers/serv er-deploy.wsdd <?xml version="1.0"?> <deployment <! Tuong tu tren > <parameter name="schemaPath" value="schema/progtutorial/MathService/Math_service.wsdl"/> <! Ten class > <parameter name="className" value="org.globus.progtutorial.stubs.MathService.MathPortType"/> <! Yeu cau Grid service container goi chuc nang cua GridServiceImpl nhu la chuc nang co ban cua MathService > <parameter name="baseClassName" value="org.globus.ogsa.impl.ogsi.GridServiceImpl"/> Phụ lục - 196 - <parameter name="operationProviders" value="org.globus.progtutorial.services.core.providers.impl.Math Provider"/> <!—Tuong tu tren > </deployment> Các thao tác khác để triển khai service hoàn toàn tương tự như đã giới thiệu ở trên. C C . . 2 2 . . T T h h ê ê m m t t h h à à n n h h p p h h ầ ầ n n d d ữ ữ l l i i ệ ệ u u ( ( S S e e r r v v i i c c e e D D a a t t a a E E l l e e m m e e n n t t ( ( S S D D E E ) ) ) ) Như đã biết, mỗi Grid service đều có các SDE của riêng mình, phần này sẽ xem xét kỹ thuật thêm SDE cho một service. Ở đây chúng ta thêm một SDE có tên là MathData chứa các thông tin như giá trị hiện tại (value), phép toán thực hiện cuối cùng (lastOp), số phép toán đã thực hiện (numOp), MathData chỉ có một và chỉ một giá trị (cardinality = 1 1) được mô tả trên hình 0-3: Hình 8-3 Ví dụ về SDE của MathService + Đặc tả SDE Việc định nghĩa một SDE cho một service thông qua file đặc tả GWSDL, tuy nhiên MathData là một kiểu phức tạp nên mặc dù có thể đặc tả kiểu này trong file GWSDL, chúng ta có thể đặc tả trong một file khác. File : $GRIDSER_DEMO/schema/progtutorial/MathService_sd/MathSDE.xsd <complexType name="MathDataType"> <sequence> <element name="value" type="int"/> <element name="lastOp" type="string"/> <element name="numOps" type="int"/> </sequence> </complexType> Phụ lục - 197 - Bây giờ, chúng ta sẽ đặc tả lại inteface của service bằng cách tạo một file GWSDL mới, file này có nội dung và cấu trúc gần giống với file GWSDL cũ, một số phần thay đổi được trình bày ở đây. File : $GRIDSER_DEMO/schema/progtutorial/MathService_sd/Math.gwsdl. + Xác định lại namespace, <definitions name="MathService" targetNamespace="http://www.globus.org/namespaces/2004/02/progtutorial/MathService_sd" xmlns:tns="http://www.globus.org/namespaces/2004/02/progtutorial/MathService_sd" xmlns:data="http://www.globus.org/namespaces/2004/02/progtutorial/MathService_sd/MathSDE" xmlns:ogsi="http://www.gridforum.org/namespaces/2003/03/OGSI" xmlns:gwsdl="http://www.gridforum.org/namespaces/2003/03/gridWSDLExtensions" xmlns:sd="http://www.gridforum.org/namespaces/2003/03/serviceData" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/"> + Nhập file MathSDE.xsd định nghĩa MathData vào <import location="MathSDE.xsd" namespace="http://www.globus.org/namespaces/2004/02/progtutorial/MathService_sd/MathSDE" /> + Khai báo SDE trong đặc tả interface <gwsdl:portType name="MathPortType" extends="ogsi:GridService"> <! <operation>s > <sd:serviceData name="MathData" type="data:MathDataType" minOccurs="1" maxOccurs="1" mutability="mutable" modifiable="false" nillable="false"> </sd:serviceData> </gwsdl:portType> + Cài đặt SDE File : $GRIDSER_DEMO/org/globus/progtutorial/services/core/servicedata/im pl/MathImpl.java Ở đây khai báo lớp không thay đổi: public class MathImpl extends GridServiceImpl implements MathPortType Lớp cài đặt này có thêm 2 thuộc tính private mới : private ServiceData mathDataSDE; //La SDE private MathDataType mathDataValue; //Chua gia tri cua SDE Phụ lục - 198 - Việc tạo lập các SDE nằm trong hàm postCreate, ở đây chúng ta có thể để các giá trị khởi tạo cho SDE. public void postCreate(GridContext context) throws GridServiceException { // Goi ham postCreate lop co so super.postCreate(context); //Duoi day la cac buoc tao mot SDE va dua vao Service Data Set // Tao Service Data Element mathDataSDE = this.getServiceDataSet().create("MathData"); // Tao mot doi tuong MathDataType va khoi tao cac gia tri mathDataValue = new MathDataType(); mathDataValue.setLastOp("NONE"); mathDataValue.setNumOps(0); mathDataValue.setValue(0); // Dua cac gia tri vao doi tuong MathDataType mathDataSDE.setValue(mathDataValue); // Them SDE vao Service Data Set this.getServiceDataSet().add(mathDataSDE); } Các hàm add(), substract() có thêm các lệnh mới để cập nhật lại SDE: public void add(int a) throws RemoteException { //Cac ham setLastOp(),setValue(),setNumOps(), getNumOps() duoc tu //dong phat sinh tu file dac ta MathSDE.xsd mathDataValue.setLastOp("Addition"); incrementOps(); mathDataValue.setValue(mathDataValue.getValue() + a); } // Ham nay cap nhat MathData SDE tang so phep toan len 1 private void incrementOps() { int numOps = mathDataValue.getNumOps(); mathDataValue.setNumOps(numOps + 1); } + Đặc tả cài đặt Trong file đặc tả chỉ cần thay đổi lại các giá trị tương ứng tên các file mới vừa tạo ra. <parameter name="baseClassName" value="org.globus.progtutorial.services.core.servicedata.impl.MathImpl" /> <parameter name="className" value="org.globus.progtutorial.stubs.MathService_sd.MathPortType "/> Phụ lục - 199 - <parameter name="schemaPath" value="schema/progtutorial/MathService_sd/Math_service.wsdl"/> + Client truy xuất SDE //Khai bao import giong nhu tren // public class Client { public static void main(String[] args) { try { // Lay tham so dong lenh URL GSH = new java.net.URL(args[0]); int a = Integer.parseInt(args[1]); // Lay GSR cua Math PortType MathServiceGridLocator mathServiceLocator = new MathServiceGridLocator(); MathPortType math = mathServiceLocator.getMathServicePort(GSH); // Lay SDE "MathData", su dung phuong thuc findServiceData cua GridServiceImpl ExtensibilityType extensibility = math.findServiceData(QueryHelper.getNamesQuery("MathData")); ServiceDataValuesType serviceData = AnyHelper.getAsServiceDataValues(extensibility); MathDataType mathData = (MathDataType) AnyHelper.getAsSingleObject(serviceData, MathDataType.class); // Xuat cac gia tri cua SDE ra man hinh System.out.println("Value: " + mathData.getValue()); System.out.println("Previous operation: " + mathData.getLastOp()); System.out.println("# of operations: " + mathData.getNumOps()); // Goi phuong thuc cua service. math.add(a); }catch(Exception e) { System.out.println("ERROR!"); e.printStackTrace(); } } } C C . . 3 3 . . C C à à i i đ đ ặ ặ t t c c ơ ơ c c h h ế ế N N o o t t i i f f i i c c a a t t i i o o n n Như đã biết, cơ chế Notification cho phép client biết được những gì đang xảy ra ở một Grid service instance. Cơ chế Notification liên quan mật thiết đến các SDE của service. Trong GT3, cơ chế Notification hoạt động theo sơ đồ sau với các bước: Phụ lục - 200 - Hình 8-4 Sơ đồ hoạt động của cơ chế Notification trong GT3. 1. addListener : Các client yêu cầu service thông báo cho mình khi có sự thay đổi của SDE xác định trong lời gọi. 2. notifyChange : Khi có sự thay đổi, MathService sẽ yêu cầu SDE tương ứng gửi thông báo cho các client đã yêu cầu. 3. deliverNotification : SDE thông báo cho client. Ở đây các giá trị của SDE được gửi về cho client, do đó client không cần thực hiện thêm bất cứ truy vấn nào nữa. Có thể thấy đây là cơ chế “push” notification, GT3 chỉ hỗ trợ duy nhất dạng này. Dưới đây, chúng ta sẽ xem xét chi tiết k ỹ thuật cài đặt notification này trong GT3 với MathService. + Khai báo sử dụng Notification trong portType Thêm cơ chế Notification ảnh hưởng đến interface do chúng ta cần cung cấp một số phương thức mới ra bên ngoài. Tất nhiên, chúng ta không cần cài đặt các phương thức này mà chỉ cần khai báo sử dụng lại portType NotificationSource có sẵn, portType này chứa đầy đủ các phương thức liên quan đến cơ chế Notification. Do đó file GWSDL ở trên chỉ cần sửa lại như sau: File : $GRIDSER_DEMO/schema/progtutorial/MathService_sd_notif/Math.gwsdl <! Khai bao su dung lai portType NotificationSource > gwsdl:portType name="MathPortType" extends="ogsi:GridService ogsi:NotificationSource"> <! <cac operation> > <! <serviceData> > </gwsdl:portType> + Cài đặt Chúng ta chỉ cần thêm một lệnh duy nhất trong các hàm cài đặt. File : $GRIDSER_DEMO/org/globus/progtutorial/services/core/notifications/ impl/MathImpl.java public void add(int a) throws RemoteException { Phụ lục - 201 - mathDataValue.setLastOp("Addition"); incrementOps(); mathDataValue.setValue(mathDataValue.getValue() + a); //Yeu cau thong bao cho cac client mathDataSDE.notifyChange(); } + Đặc tả cài đặt Hoàn toàn giống như trước, chỉ thêm một dòng mới. File: $GRIDSER_DEMO/org/globus/progtutorial/core/notifications/server- config.wsdd <deployment <!—Khai bao tuong tu tren, dong duoi day duoc them moi > <parameter name="operationProviders" value="org.globus.ogsa.impl.ogsi.NotificationSourceProvider"/> <!—-Tuong tu tren > </deployment> + Client Client ở đây phức tạp hơn so với các ví dụ trước. Client trong Java (hay đúng hơn là lớp nhận các thông báo) phải cài đặt phương thức deliverNotification, phương thức này sẽ được Grid service gọi khi có sự thay đổi trong SDE của mình. Mã nguồn client như sau, file : $GRIDSER_DEMO/org/globus/progtutorial/clients/MathService_sd_notif /ClientListener.java //Cac khai bao import public class ClientListener extends ServicePropertiesImpl implements NotificationSinkCallback { public static void main(String[] args) { // Lay tham so dong lenh HandleType GSH = new HandleType(args[0]); ClientListener clientListener = new ClientListener(GSH); } public ClientListener(HandleType GSH) throws Exception { // Bat dau dang ky va lang nghe MathService NotificationSinkManager notifManager = NotificationSinkManager.getManager(); notifManager.startListening(NotificationSinkManager.MAIN_THREAD); String sink = notifManager.addListener("MathData", null, GSH, this); System.out.println("Listening "); // Cho nguoi dung nhan phim System.in.read(); // Ket thuc lang nghe notifManager.removeListener(sink); notifManager.stopListening(); System.out.println("Not listening anymore!"); Phụ lục - 202 - } //Khi co thay doi trong SDE,ham nay se duoc Grid service goi, se xuat ra man // hinh cac gia tri cua SDE public void deliverNotification(ExtensibilityType any) throws RemoteException { try { // SDE da thay doi, lay gia tri moi ServiceDataValuesType serviceData = AnyHelper.getAsServiceDataValues(any); MathDataType mathData = (MathDataType) AnyHelper.getAsSingleObject(serviceData, MathDataType.class); // Xuat ra man hinh System.out.println("Current value: " + mathData.getValue()); System.out.println("Previous operation: " + mathData.getLastOp()); System.out.println("# of operations: " + mathData.getNumOps()); }catch(Exception exc) { System.out.println("ERROR!"); exc.printStackTrace(); } } } C C . . 7 7 . . C C à à i i đ đ ặ ặ t t k k ỹ ỹ t t h h u u ậ ậ t t t t ạ ạ o o s s e e r r v v i i c c e e đ đ ộ ộ n n g g ( ( T T r r a a n n s s i i e e n n t t s s e e r r v v i i c c e e ) ) Làm cho một service có khả năng được tạo lập một cách động (chuyển service thành transient service) là một trong những việc dễ dàng nhất trong GT3, chúng ta không cần thay đổi portType cũng như cài đặt của nó. Mọi thứ cần làm là sửa lại file đặc tả cài đặt. + Đặc tả cài đặt Để có thể thấy rõ hơn về sự thay đổi, chúng ta xem lại file WSDD cũ: <?xml version="1.0"?> <deployment name="defaultServerConfig" xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="progtutorial/core/first/MathService" provider="Handler" style="wrapped"> <parameter name="name" value="MathService"/> <parameter name="baseClassName" value="org.globus.progtutorial.services.core.first.impl.MathImpl"/> <parameter name="className" value="org.globus.progtutorial.stubs.MathService.MathPortType"/> <parameter name="schemaPath" value="schema/progtutorial/MathService/Math_service.wsdl"/> <!—Cac tham so chung > <parameter name="allowedMethods" value="*"/> <parameter name="persistent" value="true"/> <parameter name="handlerClass" value="org.globus.ogsa.handlers.RPCURIProvider"/> [...]... chi tiết cấu trúc một chứng chỉ điện tử: Hình 8-5 Cấu trúc một chứng chỉ điện tử * Việc lấy chứng nhận cho một người dùng (lưu ý có thể là người dùng thật sự hay host) trong Grid bao gồm các bước: 1 Người dùng Grid phát sinh một cặp khoá (khóa bí mật và khóa công khai tương ứng) , và một bản yêu cầu chứng nhận chứa khoá công khai và các thông tin cần thiết theo yêu của CA - 211 - Phụ lục 2 Sau đó, người... xong, CA tạo một chứng chỉ bằng cách ký tên vào bản yêu cầu, và gửi chứng chỉ này lại cho người dùng đã yêu cầu chứng nhận Việc yêu cầu chứng thực trên trên đây chỉ cần thực hiện một lần duy nhất, từ khi nhận được chứng chỉ, người dùng có thể dùng nó đế đại diện cho mình khi giao tiếp với bất kỳ hệ thống nào có yêu cầu chứng thực - 212 - Phụ lục Tài liệu tham khảo [1] Ian Foster, The Grid, CLUSTERWORLD,... E Cấu trúc một chứng chỉ điện tử Một chứng chỉ điện tử bao gồm các phần chính : một subject (distinguished name (DN)) duy nhất trong không gian tên của hệ thống Grid xác định người hoặc đối tượng mà chứng chỉ đại diện, một khóa công khai đi kèm với subject, phần nhận dạng CA thực hiện ký chứng nhận chứng chỉ, chữ ký của CA và phần mở rộng chứa thông tin về cá nhân hay host được chứng nhận Một số thông... Open Grid Services Architecture, GLOBAL GRID FORUM, 10/ 03/2004, http://forge.gridforum.org/projects/ogsawg [6] S Tuecke, K Czajkowski, I Foster, J Frey, S Graham, C Kesselman, T Maquire, T Sandholm, D Snelling, P Vanderbilt, Open Grid Services Infrastructure (OGSI) Version 1.0, GLOBAL GRID FORUM, 27/06/2003, http://www.ggf.org/ogsi-wg [7] Mark Baker, Rajkumar Buyya, Domenico Laforenza, Grids and Grid. .. Method khá tốt, tuy nhiên nó khó có thể sử dụng lại Giả sử chúng ta có 2 hàm preCreate() và postCreate() và muốn sử dụng lại trong tất cả các Grid Service, với kỹ thuật Callback Method, chỉ có cách đưa nó vào một lớp cha, rồi cho tất cả các lớp Grid Service khác thừa kế từ nó Tất nhiên đây có sự hạn chế như đã giới thiệu trong phần Operation Provider GT3 đưa ra giải pháp mới là Lifecycle Monitor Một lifecycle... //Cac phuong thuc can callback public void create(GridContext context) throws GridServiceException { logger.info("Instance is going to be created (create)"); } - 207 - Phụ lục public void destroy(GridContext context) throws GridServiceException { logger.info("Instance is going to be destroyed (destroy)"); } public void preCall(GridContext context) throws GridServiceException { logger.info("Service is... tả: + Trước hết, chúng ta đã thêm tiền tố “instance-” vào name, schemaPath, baseClassName, và className, bằng cách này, chúng ta cho container biết đây là những tham số để truyền vào khi tạo các instance MathService thông qua Factory - 203 - Phụ lục + Sau đó chúng ta thêm các tham số mới vào “khối tham số chung”, để ý lúc này, schemaPath, baseClassName, và className tham khảo đến mã thực thi của Factory... “instance-” và sửa lại “khối tham số chung” + Đối với client Có thể sử dụng lại các client cũ Ở đây, chúng ta viết một client để demo khả năng tạo lập, sử dụng và huỷ một service instance thông qua Factory File : $GRIDSER_DEMO/org/globus/progtutorial/clients/MathService/FactoryC lient.java package org.globus.progtutorial.clients.MathService; import import import import org.gridforum.ogsi.OGSIServiceGridLocator;... cua MathService Factory OGSIServiceGridLocator gridLocator = new OGSIServiceGridLocator(); Factory factory = gridLocator.getFactoryPort(GSH); GridServiceFactory mathFactory = new GridServiceFactory(factory); // Tao mot MathService instance moi va lay GSR cua no LocatorType locator = mathFactory.createService(); MathServiceGridLocator mathLocator = new MathServiceGridLocator(); MathPortType math = mathLocator.getMathServicePort(locator);... Bảng 8-2 Các hàm callback trong GT3 File : $GRIDSER_DEMO/org/globus/progtutorial/services/core/lifecycle/impl /MathImpl.java // import org.globus.ogsa.GridServiceCallback; // public class MathImpl extends GridServiceImpl implements MathPortType, GridServiceCallback { // // Cai dat cac phuong thuc Callback, chi can su dung lai cac ham cai san cua lop cha GridServiceImpl public void preCreate(GridServiceBase . Grid bao gồm các bước: 1. Người dùng Grid phát sinh một cặp khoá (khóa bí mật và khóa công khai tương ứng) , và một bản yêu cầu chứng nhận chứa khoá công khai và các thông tin cần thiết theo yêu. khó có thể sử dụng lại. Giả sử chúng ta có 2 hàm preCreate() và postCreate() và muốn sử dụng lại trong tất cả các Grid Service, với kỹ thuật Callback Method, chỉ có cách đưa nó vào một lớp cha,. Factory OGSIServiceGridLocator gridLocator = new OGSIServiceGridLocator(); Factory factory = gridLocator.getFactoryPort(GSH); GridServiceFactory mathFactory = new GridServiceFactory(factory);

Ngày đăng: 30/07/2014, 20:20

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN