- 相關(guān)推薦
WebService的優(yōu)缺點(diǎn)
Web service是一個(gè)平臺(tái)的獨(dú)立,低耦合的,自包含的、基于可編程的web的應(yīng)用程序,可使用開(kāi)放的XML(標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言下的一個(gè)子集)標(biāo)準(zhǔn)來(lái)描述、發(fā)布、發(fā)現(xiàn)、協(xié)調(diào)和配置這些應(yīng)用程序,用于開(kāi)發(fā)分布式的互操作的應(yīng)用程序。
1. 什么是WebService?
對(duì)這個(gè)問(wèn)題,我們至少有兩種答案。從表面上看,WebService 就是一個(gè)應(yīng)用程序,它向外界暴露出一個(gè)能夠通過(guò)Web進(jìn)行調(diào)用的API。這就是說(shuō),你能夠用編程的方法通過(guò)Web來(lái)調(diào)用這個(gè)應(yīng)用程序。我們把調(diào)用這個(gè) WebService 的應(yīng)用程序叫做客戶。
例如,你想創(chuàng)建一個(gè)WebService ,它的作用是返回當(dāng)前的天氣情況。那么你可以建立一個(gè)ASP頁(yè)面,它接受郵政編碼作為查詢字符串,然后返回一個(gè)由逗號(hào)隔開(kāi)的字符串,包含了當(dāng)前的氣溫和天氣。要調(diào)用這個(gè)ASP頁(yè)面,客戶端需要發(fā)送下面的這個(gè)HTTP GET請(qǐng)求:http://host.company.com/weather.asp?zipcode=20171 返回的數(shù)據(jù)就應(yīng)該是這樣:
21,晴
這個(gè)ASP頁(yè)面就應(yīng)該可以算作是WebService了。因?yàn)樗贖TTP GET請(qǐng)求,暴露出了一個(gè)可以通過(guò)Web調(diào)用的API。當(dāng)然WebService還有更多的東西。
下面是對(duì)WebService更精確的解釋:WebService是建立可互操作的分布式應(yīng)用程序的新平臺(tái)。作為一個(gè)Windows程序員,你可能已經(jīng)用 COM或DCOM建立過(guò)基于組件的分布式應(yīng)用程序。COM是一個(gè)非常好的組件技術(shù),但是我們也很容易舉出COM并不能滿足要求的情況。 WebService平臺(tái)是一套標(biāo)準(zhǔn),它定義了應(yīng)用程序如何在Web上實(shí)現(xiàn)互操作性。你可以用任何你喜歡的語(yǔ)言,在任何你喜歡的平臺(tái)上寫(xiě) WebService ,只要我們可以通過(guò)WebService標(biāo)準(zhǔn)對(duì)這些服務(wù)進(jìn)行查詢和訪問(wèn)。
2. WebService的優(yōu)點(diǎn):
跨防火墻的通信
如果應(yīng)用程序有成千上萬(wàn)的用戶,而且分布在世界各地,那么客戶端和服務(wù)器之間的通信將是一個(gè)棘手的問(wèn)題。因?yàn)榭蛻舳撕头⻊?wù)器之間通常會(huì)有防火墻或者代理服務(wù)器。在這種情況下,使用DCOM就不是那么簡(jiǎn)單,通常也不便于把客戶端程序發(fā)布到數(shù)量如此龐大的每一個(gè)用戶手中。傳統(tǒng)的做法是,選擇用瀏覽器作為客戶端,寫(xiě)下一大堆ASP頁(yè)面,把應(yīng)用程序的中間層暴露給最終用戶。這樣做的結(jié)果是開(kāi)發(fā)難度大,程序很難維護(hù)。
舉個(gè)例子,在應(yīng)用程序里加入一個(gè)新頁(yè)面,必須先建立好用戶界面(Web頁(yè)面),并在這個(gè)頁(yè)面后面,包含相應(yīng)商業(yè)邏輯的中間層組件,還要再建立至少一個(gè) ASP頁(yè)面,用來(lái)接受用戶輸入的信息,調(diào)用中間層組件,把結(jié)果格式化為HTML形式,最后還要把“結(jié)果頁(yè)”送回瀏覽器。要是客戶端代碼不再如此依賴于 HTML表單,客戶端的編程就簡(jiǎn)單多了。
如果中間層組件換成WebService的話,就可以從用戶界面直接調(diào)用中間層組件,從而省掉建立ASP頁(yè)面的那一步。要調(diào)用 WebService,可以直接使用MicrosoftSOAPToolkit或.NET這樣的SOAP客戶端,也可以使用自己開(kāi)發(fā)的SOAP客戶端,然后把它和應(yīng)用程序連接起來(lái)。不僅縮短了開(kāi)發(fā)周期,還減少了代碼復(fù)雜度,并能夠增強(qiáng)應(yīng)用程序的可維護(hù)性。同時(shí),應(yīng)用程序也不再需要在每次調(diào)用中間層組件時(shí),都跳轉(zhuǎn)到相應(yīng)的“結(jié)果頁(yè)”。
從大多數(shù)人的經(jīng)驗(yàn)來(lái)看,在一個(gè)用戶界面和中間層有較多交互的應(yīng)用程序中,使用WebService這種結(jié)構(gòu),可以節(jié)省花在用戶界面編程上20% 的開(kāi)發(fā)時(shí)間。另外,這樣一個(gè)由WebService組成的中間層,完全可以在應(yīng)用程序集成或其它場(chǎng)合下重用。最后,通過(guò)WebService把應(yīng)用程序的邏輯和數(shù)據(jù)“暴露”出來(lái),還可以讓其它平臺(tái)上的客戶重用這些應(yīng)用程序。
應(yīng)用程序集成
企業(yè)級(jí)的應(yīng)用程序開(kāi)發(fā)者都知道,企業(yè)里經(jīng)常都要把用不同語(yǔ)言寫(xiě)成的、在不同平臺(tái)上運(yùn)行的各種程序集成起來(lái),而這種集成將花費(fèi)很大的開(kāi)發(fā)力量。應(yīng)用程序經(jīng)常需要從運(yùn)行在IBM主機(jī)上的程序中獲取數(shù)據(jù);或者把數(shù)據(jù)發(fā)送到主機(jī)或UNIX應(yīng)用程序中去。即使在同一個(gè)平臺(tái)上,不同軟件廠商生產(chǎn)的各種軟件也常常需要集成起來(lái)。通過(guò)WebService,應(yīng)用程序可以用標(biāo)準(zhǔn)的方法把功能和數(shù)據(jù)“暴露”出來(lái),供其它應(yīng)用程序使用。
例如,有一個(gè)訂單登錄程序,用于登錄從客戶來(lái)的新訂單,包括客戶信息、發(fā)貨地址、數(shù)量、價(jià)格和付款方式等內(nèi)容;還有一個(gè)訂單執(zhí)行程序,用于實(shí)際貨物發(fā)送的管理。這兩個(gè)程序來(lái)自不同軟件廠商。一份新訂單進(jìn)來(lái)之后,訂單登錄程序需要通知訂單執(zhí)行程序發(fā)送貨物。通過(guò)在訂單執(zhí)行程序上面增加一層 WebService,訂單執(zhí)行程序可以把“AddOrder”函數(shù)“暴露”出來(lái)。這樣,每當(dāng)有新訂單到來(lái)時(shí),訂單登錄程序就可以調(diào)用這個(gè)函數(shù)來(lái)發(fā)送貨物了。
B2B的集成
用WebService集成應(yīng)用程序,可以使公司內(nèi)部的商務(wù)處理更加自動(dòng)化。但當(dāng)交易跨越供應(yīng)商和客戶、突破公司的界限時(shí)會(huì)怎么樣呢?跨公司的商務(wù)交易集成通常叫做B2B集成。
WebService是B2B集成成功的關(guān)鍵。通過(guò)WebService,公司可以把關(guān)鍵的商務(wù)應(yīng)用“暴露”給指定的供應(yīng)商和客戶。例如,把電子下單系統(tǒng)和電子發(fā)票系統(tǒng)“暴露”出來(lái),客戶就可以以電子的方式發(fā)送訂單,供應(yīng)商則可以以電子的方式發(fā)送原料采購(gòu)發(fā)票。當(dāng)然,這并不是一個(gè)新的概念,EDI(電子文檔交換)早就是這樣了。但是,WebService的實(shí)現(xiàn)要比EDI簡(jiǎn)單得多,而且WebService運(yùn)行在Internet上,在世界任何地方都可輕易實(shí)現(xiàn),其運(yùn)行成本就相對(duì)較低。不過(guò),WebService并不像EDI那樣,是文檔交換或B2B集成的完整解決方案。WebService只是 B2B集成的一個(gè)關(guān)鍵部分,還需要許多其它的部分才能實(shí)現(xiàn)集成。
用WebService來(lái)實(shí)現(xiàn)B2B集成的最大好處在于可以輕易實(shí)現(xiàn)互操作性。只要把商務(wù)邏輯“暴露”出來(lái),成為WebService,就可以讓任何指定的合作伙伴調(diào)用這些商務(wù)邏輯,而不管他們的系統(tǒng)在什么平臺(tái)上運(yùn)行,使用什么開(kāi)發(fā)語(yǔ)言。這樣就大大減少了花在B2B集成上的時(shí)間和成本,讓許多原本無(wú)法承受EDI的中小企業(yè)也能實(shí)現(xiàn)B2B集成。
軟件和數(shù)據(jù)重用
軟件重用是一個(gè)很大的主題,重用的形式很多,重用的程度有大有小。最基本的形式是源代碼模塊或者類(lèi)一級(jí)的重用,另一種形式是二進(jìn)制形式的組件重用。
3. WebService的缺點(diǎn)
單機(jī)應(yīng)用程序
目前,企業(yè)和個(gè)人還使用著很多桌面應(yīng)用程序。其中一些只需要與本機(jī)上的其它程序通信。在這種情況下,最好就不要用WebService,只要用本地的 API就可以了。COM非常適合于在這種情況下工作,因?yàn)樗刃∮挚臁_\(yùn)行在同一臺(tái)服務(wù)器上的服務(wù)器軟件也是這樣。最好直接用COM或其它本地的API來(lái)進(jìn)行應(yīng)用程序間的調(diào)用。當(dāng)然WebService也能用在這些場(chǎng)合,但那樣不僅消耗太大,而且不會(huì)帶來(lái)任何好處。
局域網(wǎng)的同構(gòu)應(yīng)用程序
在許多應(yīng)用中,所有的程序都是用VB或VC開(kāi)發(fā)的,都在Windows平臺(tái)下使用COM,都運(yùn)行在同一個(gè)局域網(wǎng)上。例如,有兩個(gè)服務(wù)器應(yīng)用程序需要相互通信,或者有一個(gè)Win32或WinForm的客戶程序要連接局域網(wǎng)上另一個(gè)服務(wù)器的程序。在這些程序里,使用DCOM會(huì)比SOAP/HTTP有效得多。與此相類(lèi)似,如果一個(gè).NET程序要連接到局域網(wǎng)上的另一個(gè).NET程序,應(yīng)該使用.NETremoting。有趣的是,在.NETremoting 中,也可以指定使用SOAP/HTTP來(lái)進(jìn)行WebService調(diào)用。不過(guò)最好還是直接通過(guò)TCP進(jìn)行RPC調(diào)用,那樣會(huì)有效得多。
WebService應(yīng)用
1. JDK6增加了對(duì)WS的支持
下面是WebService的一個(gè)簡(jiǎn)單的服務(wù)應(yīng)用
Java代碼
import javax.xml.ws.*;
import javax.jws.*;
import javax.jws.soap.*;
@WebService(targetNamespace="http://localhost:7070/Ebay")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class HelloService
{
public static void main(String args)
{
Endpoint.publish("http://localhost:7070/Ebay",new HelloService());
}
@WebMethod
public void sayHello()
{
System.out.println("hello");
}
}
2. Axis安裝配置
安裝JDK;
安裝并配置Tomcat;
從官方的網(wǎng)站http://ws.apache.org/axis下載最新的Axis項(xiàng)目打包文件,并將webapps下axis目錄拷貝到Tomcat的webapps目錄下;
驗(yàn)證Axis的安裝;
瀏覽所發(fā)布的服務(wù)。 3. 服務(wù)器端開(kāi)發(fā)
即時(shí)發(fā)布
使用即時(shí)發(fā)布首先需要一個(gè)實(shí)現(xiàn)服務(wù)功能的Java源文件,將其擴(kuò)展名改為.jws(Java Web Service的縮寫(xiě)),然后將該文件放到Tomcat下面的webappsaxis目錄下即可。但是JWS的web服務(wù)發(fā)布是一個(gè)很簡(jiǎn)單的Web服務(wù)發(fā)布方式,在頁(yè)面中你不能使用包,而且由于代碼是在運(yùn)行期被編譯的,所以在部署之后,你也很難找到錯(cuò)誤所在。
定制發(fā)布
① 編寫(xiě)要發(fā)布為服務(wù)的java類(lèi)
② 編譯生成的class文件應(yīng)該放在Tomcat下的webappsaxisWEB-INFclasses下面
③ 編寫(xiě)deploy.wsdd 文件描述服務(wù)的名稱,入口等信息
④ 切換到命令航下,執(zhí)行
java org.apache.axis.client.AdminClient –p 8085 deploy.wsdd 4. 調(diào)用web服務(wù)
DLL動(dòng)態(tài)接口調(diào)用方式(Dynamic Invocation Interface)
Java代碼
public static void main(String args) {
try {
String endpoint =
"http://localhost:8080/axis/services/test1";
//實(shí)例化一個(gè)服務(wù)對(duì)象service
Service service = new Service();
//創(chuàng)建一個(gè)空的調(diào)用對(duì)象Call,設(shè)置Call的操作名稱,目標(biāo)地址,傳入?yún)?shù)等等
//執(zhí)行調(diào)用后即可得到返回的結(jié)果
Call call = (Call) service.createCall();
call.setTargetEndpointAddress( new java.net.URL(endpoint) );
call.setOperationName(new QName("http://soapinterop.org/", "add3") );
// Call to addParameter/setReturnType as described in user-guide.html
//call.addParameter("testParam",
// org.apache.axis.Constants.XSD_STRING,
// javax.xml.rpc.ParameterMode.IN);
//call.setReturnType(org.apache.axis.Constants.XSD_STRING);
Integer ret = (Integer) call.invoke( new Object { 1,3 } );
System.out.println( ret);
} catch (Exception e) {
System.err.println(e.toString());
}
}
動(dòng)態(tài)代理方式(Dynamic Proxy)
動(dòng)態(tài)代理需要一個(gè)本地的接口作為代理
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/Test.jws?wsdl";
String nameSpaceUri = "http://soapinterop.org/";
String serviceName = "Test1Service";
String portName = "Test1";
ServiceFactory serviceFactory = ServiceFactory.newInstance();
Service service = serviceFactory.createService(
new URL(wsdlUrl), new QName(nameSpaceUri,serviceName));
ITestDynameicProxy proxy = (ITestDynameicProxy)service.getPort(
new QName(nameSpaceUri,portName),ITestDynameicProxy.class);
System.out.println(proxy.getMessage());
}
通過(guò)輸入wsdl地址,命名空間地址和服務(wù)名,用服務(wù)工廠創(chuàng)建出一個(gè)服務(wù)實(shí)例,再通過(guò)設(shè)置端口名得到一個(gè)服務(wù)類(lèi)型的服務(wù)代理對(duì)象,通過(guò)該代理,就可以直接訪問(wèn)web服務(wù)了。
靜態(tài)方式(Stubs)
① 按常規(guī)方式發(fā)布一個(gè)WebService
② 得到wsdl文件
* 通過(guò)web頁(yè)面直接另存為
* 通過(guò)Java2WSDL工具類(lèi)生成
(java org.apache.axis.wsdl.Java2WSDL -o demo1.wsdl -l http://localhost:8080/axis/services/demo -n http://www.itcast.cn/test.Demo)
③ 利用WSDL2Java工具類(lèi)生成客戶端調(diào)用代碼
(java org.apache.axis.wsdl.WSDL2Java demo.wsdl -p client)
④ 在生成的代碼基礎(chǔ)上,進(jìn)行客戶端的調(diào)用
Java代碼
public static void main(String args) throws ServiceException, RemoteException {
DemoServiceLocator demoService = new DemoServiceLocator();
Demo demo = demoService.getdemo();
System.out.println(demo.getMessage());
}
【W(wǎng)ebService的優(yōu)缺點(diǎn)】相關(guān)文章:
沖浪浴缸的優(yōu)缺點(diǎn)07-10
留學(xué)德國(guó)的優(yōu)缺點(diǎn)10-08
景觀硬質(zhì)材料優(yōu)缺點(diǎn)08-23
RTK技術(shù)優(yōu)缺點(diǎn)及措施07-02
去新加坡留學(xué)優(yōu)缺點(diǎn)06-30
室內(nèi)使用塑料的優(yōu)缺點(diǎn)09-09
樓梯材質(zhì)分類(lèi)及優(yōu)缺點(diǎn)10-05