當前位置:才華齋>IT認證>SUN認證>

WebService的優缺點

SUN認證 閱讀(3.14W)

Web service是一個平臺的獨立,低耦合的,自包含的、基於可程式設計的web的應用程式,可使用開放的XML(標準通用標記語言下的一個子集)標準來描述、釋出、發現、協調和配置這些應用程式,用於開發分散式的互操作的應用程式。

WebService的優缺點

  1. 什麼是WebService?

對這個問題,我們至少有兩種答案。從表面上看,WebService 就是一個應用程式,它向外界暴露出一個能夠通過Web進行呼叫的API。這就是說,你能夠用程式設計的方法通過Web來呼叫這個應用程式。我們把呼叫這個 WebService 的應用程式叫做客戶。

例如,你想建立一個WebService ,它的作用是返回當前的天氣情況。那麼你可以建立一個ASP頁面,它接受郵政編碼作為查詢字串,然後返回一個由逗號隔開的字串,包含了當前的氣溫和天氣。要呼叫這個ASP頁面,客戶端需要傳送下面的這個HTTP GET請求: 返回的資料就應該是這樣:

21,晴

這個ASP頁面就應該可以算作是WebService了。因為它基於HTTP GET請求,暴露出了一個可以通過Web呼叫的API。當然WebService還有更多的東西。

下面是對WebService更精確的解釋:WebService是建立可互操作的分散式應用程式的新平臺。作為一個Windows程式設計師,你可能已經用 COM或DCOM建立過基於元件的分散式應用程式。COM是一個非常好的元件技術,但是我們也很容易舉出COM並不能滿足要求的情況。 WebService平臺是一套標準,它定義了應用程式如何在Web上實現互操作性。你可以用任何你喜歡的語言,在任何你喜歡的平臺上寫 WebService ,只要我們可以通過WebService標準對這些服務進行查詢和訪問。

  2. WebService的優點:

跨防火牆的通訊

如果應用程式有成千上萬的使用者,而且分佈在世界各地,那麼客戶端和伺服器之間的通訊將是一個棘手的問題。因為客戶端和伺服器之間通常會有防火牆或者代理伺服器。在這種情況下,使用DCOM就不是那麼簡單,通常也不便於把客戶端程式釋出到數量如此龐大的每一個使用者手中。傳統的做法是,選擇用瀏覽器作為客戶端,寫下一大堆ASP頁面,把應用程式的中間層暴露給終端使用者。這樣做的結果是開發難度大,程式很難維護。

舉個例子,在應用程式里加入一個新頁面,必須先建立好使用者介面(Web頁面),並在這個頁面後面,包含相應商業邏輯的中間層元件,還要再建立至少一個 ASP頁面,用來接受使用者輸入的資訊,呼叫中間層元件,把結果格式化為HTML形式,最後還要把“結果頁”送回瀏覽器。要是客戶端程式碼不再如此依賴於 HTML表單,客戶端的程式設計就簡單多了。

如果中間層元件換成WebService的話,就可以從使用者介面直接呼叫中間層元件,從而省掉建立ASP頁面的那一步。要呼叫 WebService,可以直接使用MicrosoftSOAPToolkit或這樣的SOAP客戶端,也可以使用自己開發的SOAP客戶端,然後把它和應用程式連線起來。不僅縮短了開發週期,還減少了程式碼複雜度,並能夠增強應用程式的可維護性。同時,應用程式也不再需要在每次呼叫中間層元件時,都跳轉到相應的“結果頁”。

從大多數人的經驗來看,在一個使用者介面和中間層有較多互動的應用程式中,使用WebService這種結構,可以節省花在使用者介面程式設計上20% 的開發時間。另外,這樣一個由WebService組成的中間層,完全可以在應用程式整合或其它場合下重用。最後,通過WebService把應用程式的邏輯和資料“暴露”出來,還可以讓其它平臺上的客戶重用這些應用程式。

應用程式整合

企業級的應用程式開發者都知道,企業裡經常都要把用不同語言寫成的、在不同平臺上執行的各種程式整合起來,而這種整合將花費很大的開發力量。應用程式經常需要從執行在IBM主機上的程式中獲取資料;或者把資料傳送到主機或UNIX應用程式中去。即使在同一個平臺上,不同軟體廠商生產的各種軟體也常常需要整合起來。通過WebService,應用程式可以用標準的方法把功能和資料“暴露”出來,供其它應用程式使用。

例如,有一個訂單登入程式,用於登入從客戶來的新訂單,包括客戶資訊、發貨地址、數量、價格和付款方式等內容;還有一個訂單執行程式,用於實際貨物傳送的管理。這兩個程式來自不同軟體廠商。一份新訂單進來之後,訂單登入程式需要通知訂單執行程式傳送貨物。通過在訂單執行程式上面增加一層 WebService,訂單執行程式可以把“AddOrder”函式“暴露”出來。這樣,每當有新訂單到來時,訂單登入程式就可以呼叫這個函式來發送貨物了。

B2B的整合

用WebService整合應用程式,可以使公司內部的商務處理更加自動化。但當交易跨越供應商和客戶、突破公司的`界限時會怎麼樣呢?跨公司的商務交易整合通常叫做B2B整合。

WebService是B2B整合成功的關鍵。通過WebService,公司可以把關鍵的商務應用“暴露”給指定的供應商和客戶。例如,把電子下單系統和電子發票系統“暴露”出來,客戶就可以以電子的方式傳送訂單,供應商則可以以電子的方式傳送原料採購發票。當然,這並不是一個新的概念,EDI(電子文件交換)早就是這樣了。但是,WebService的實現要比EDI簡單得多,而且WebService執行在Internet上,在世界任何地方都可輕易實現,其執行成本就相對較低。不過,WebService並不像EDI那樣,是文件交換或B2B整合的完整解決方案。WebService只是 B2B整合的一個關鍵部分,還需要許多其它的部分才能實現整合。

用WebService來實現B2B整合的最大好處在於可以輕易實現互操作性。只要把商務邏輯“暴露”出來,成為WebService,就可以讓任何指定的合作伙伴呼叫這些商務邏輯,而不管他們的系統在什麼平臺上執行,使用什麼開發語言。這樣就大大減少了花在B2B整合上的時間和成本,讓許多原本無法承受EDI的中小企業也能實現B2B整合。

軟體和資料重用

軟體重用是一個很大的主題,重用的形式很多,重用的程度有大有小。最基本的形式是原始碼模組或者類一級的重用,另一種形式是二進位制形式的元件重用。

  3. WebService的缺點

單機應用程式

目前,企業和個人還使用著很多桌面應用程式。其中一些只需要與本機上的其它程式通訊。在這種情況下,最好就不要用WebService,只要用本地的 API就可以了。COM非常適合於在這種情況下工作,因為它既小又快。執行在同一臺伺服器上的伺服器軟體也是這樣。最好直接用COM或其它本地的API來進行應用程式間的呼叫。當然WebService也能用在這些場合,但那樣不僅消耗太大,而且不會帶來任何好處。

區域網的同構應用程式

在許多應用中,所有的程式都是用VB或VC開發的,都在Windows平臺下使用COM,都執行在同一個區域網上。例如,有兩個伺服器應用程式需要相互通訊,或者有一個Win32或WinForm的客戶程式要連線區域網上另一個伺服器的程式。在這些程式裡,使用DCOM會比SOAP/HTTP有效得多。與此相類似,如果一個程式要連線到區域網上的另一個程式,應該使用emoting。有趣的是,在emoting 中,也可以指定使用SOAP/HTTP來進行WebService呼叫。不過最好還是直接通過TCP進行RPC呼叫,那樣會有效得多。

  WebService應用

1. JDK6增加了對WS的支援

下面是WebService的一個簡單的服務應用

Java程式碼

import .*;

import .*;

import .*;

@WebService(targetNamespace="http://localhost:7070/Ebay")

@SOAPBinding(style = )

public class HelloService

{

public static void main(String args)

{

ish("http://localhost:7070/Ebay",new HelloService());

}

@WebMethod

public void sayHello()

{

tln("hello");

}

}

2. Axis安裝配置

安裝JDK;

安裝並配置Tomcat;

從官方的網站http://ws.apache.org/axis下載最新的Axis專案打包檔案,並將webapps下axis目錄拷貝到Tomcat的webapps目錄下;

驗證Axis的安裝;

瀏覽所釋出的服務。 3. 伺服器端開發

即時釋出

使用即時釋出首先需要一個實現服務功能的Java原始檔,將其副檔名改為(Java Web Service的縮寫),然後將該檔案放到Tomcat下面的webappsaxis目錄下即可。但是JWS的web服務釋出是一個很簡單的Web服務釋出方式,在頁面中你不能使用包,而且由於程式碼是在執行期被編譯的,所以在部署之後,你也很難找到錯誤所在。

定製釋出

① 編寫要釋出為服務的java類

② 編譯生成的class檔案應該放在Tomcat下的webappsaxisWEB-INFclasses下面

③ 編寫 檔案描述服務的名稱,入口等資訊

④ 切換到命令航下,執行

java nClient –p 8085 4. 呼叫web服務

DLL動態介面呼叫方式(Dynamic Invocation Interface)

Java程式碼

public static void main(String args) {

try {

String endpoint =

"http://localhost:8080/axis/services/test1";

//例項化一個服務物件service

Service service = new Service();

//建立一個空的呼叫物件Call,設定Call的操作名稱,目標地址,傳入引數等等

//執行呼叫後即可得到返回的結果

Call call = (Call) teCall();

argetEndpointAddress( new (endpoint) );

perationName(new QName("", "add3") );

// Call to addParameter/setReturnType as described in

//arameter("testParam",

// _STRING,

// );

//eturnType(_STRING);

Integer ret = (Integer) ke( new Object { 1,3 } );

tln( ret);

} catch (Exception e) {

tln(ring());

}

}

動態代理方式(Dynamic Proxy)

動態代理需要一個本地的介面作為代理

Java程式碼

public interface ITestDynameicProxy extends Remote {

public String getMessage() throws RemoteException;

}

public static void main(String args) throws Exception {

String wsdlUrl = "http://localhost:8080/axis/test/

String nameSpaceUri = "";

String serviceName = "Test1Service";

String portName = "Test1";

ServiceFactory serviceFactory = nstance();

Service service = teService(

new URL(wsdlUrl), new QName(nameSpaceUri,serviceName));

ITestDynameicProxy proxy = (ITestDynameicProxy)ort(

new QName(nameSpaceUri,portName),s);

tln(essage());

}

通過輸入wsdl地址,名稱空間地址和服務名,用服務工廠創建出一個服務例項,再通過設定埠名得到一個服務型別的服務代理物件,通過該代理,就可以直接訪問web服務了。

靜態方式(Stubs)

① 按常規方式釋出一個WebService

② 得到wsdl檔案

* 通過web頁面直接另存為

* 通過Java2WSDL工具類生成

(java 2WSDL -o -l http://localhost:8080/axis/services/demo -n )

③ 利用WSDL2Java工具類生成客戶端呼叫程式碼

(java 2Java -p client)

④ 在生成的程式碼基礎上,進行客戶端的呼叫

Java程式碼

public static void main(String args) throws ServiceException, RemoteException {

DemoServiceLocator demoService = new DemoServiceLocator();

Demo demo = emo();

tln(essage());

}