久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

WebService開(kāi)發(fā)較全面的文章

 雨憶 2008-01-24

WebService學(xué)習(xí)筆記

1       WebService概念:

1.1    術(shù)語(yǔ)(資料摘要)

Ø         web Service

Web Service是使應(yīng)用程序可以以與平臺(tái)和編程語(yǔ)言無(wú)關(guān)的方式進(jìn)行相互通信的一項(xiàng)技術(shù),。Web 服務(wù)是一個(gè)軟件接口,,它描述了一組可以在網(wǎng)絡(luò)上通過(guò)標(biāo)準(zhǔn)化的 XML 消息傳遞訪(fǎng)問(wèn)的操作。它使用基于 XML 語(yǔ)言的協(xié)議來(lái)描述要執(zhí)行的操作或者要與另一個(gè) Web 服務(wù)交換的數(shù)據(jù),。一組以這種方式交互的 Web 服務(wù)在面向服務(wù)的體系結(jié)構(gòu)(Service-Oriented Architecture,,SOA)中定義了特殊的 Web 服務(wù)應(yīng)用程序

 

 

Ø         SOAP

SOAPSimple Object Access Protocol )簡(jiǎn)單對(duì)象訪(fǎng)問(wèn)協(xié)議是在分散或分布式的環(huán)境中交換信息并執(zhí)行遠(yuǎn)程過(guò)程調(diào)用的輕量級(jí)協(xié)議,是一個(gè)基于XML的協(xié)議,。使用SOAP,,不用考慮任何特定的傳輸協(xié)議(最常用的還是HTTP協(xié)議),,可以允許任何類(lèi)型的對(duì)象或代碼,,在任何平臺(tái)上,以任何一種語(yǔ)言相互通信,。

SOAP包括四個(gè)部分:SOAP封裝(envelop),,封裝定義了一個(gè)描述消息中的內(nèi)容是什么,,是誰(shuí)發(fā)送的,誰(shuí)應(yīng)當(dāng)接受并處理它以及如何處理它們的框架,;SOAP編碼規(guī)則(encoding rules),,用于表示應(yīng)用程序需要使用的數(shù)據(jù)類(lèi)型的實(shí)例;SOAP RPC表示(RPC representation),,表示遠(yuǎn)程過(guò)程調(diào)用和應(yīng)答的協(xié)定,;SOAP綁定(binding),使用底層協(xié)議交換信息,。

應(yīng)用中比較關(guān)注的是envelop,,由一個(gè)或多個(gè)Header和一個(gè)Body組成。

SOAP在可互操作的基礎(chǔ) Web 服務(wù)協(xié)議棧中的位置:

 

 

Ø         Axis

Axis本質(zhì)上就是一個(gè)SOAP引擎(Apache Axis is an implementation of the SOAP),,提供創(chuàng)建服務(wù)器端,、客戶(hù)端和網(wǎng)關(guān)SOAP操作的基本框架。但Axis并不完全是一個(gè)SOAP引擎,,它還包括:

是一個(gè)獨(dú)立的SOAP服務(wù)器,。

是一個(gè)嵌入Servlet引擎(例如Tomcat)的服務(wù)器。支持WSDL,。

提供轉(zhuǎn)化WSDLJava類(lèi)的工具,。

提供例子程序。

提供TCP/IP數(shù)據(jù)包監(jiān)視工具

 

Ø         AXIS的幾種服務(wù)類(lèi)型

AXIS有四種service styles,,分別是:RPC, Document, Wrapped, Message,。最常用的就是RPCMessage

 

RPC:在AXIS中是一個(gè)默認(rèn)選項(xiàng),。當(dāng)你部署的時(shí)候使用下列兩種方式: 或則 ,,它遵循SOAP RPC和編碼規(guī)則。每個(gè)RPC都包括一個(gè)表示名稱(chēng)的外部接點(diǎn)和一些表示參數(shù)的內(nèi)部接點(diǎn),。AXIS會(huì)根據(jù)規(guī)則將一個(gè)XMLWSDL文件)文件轉(zhuǎn)化成一個(gè)JAVA對(duì)象,,并對(duì)對(duì)想賦上在文件中描述的值。也可以根據(jù)規(guī)則將一個(gè)JAVA對(duì)象轉(zhuǎn)化成XML文件,。

 

Document

適合于老的XML schema,。

 

Wrapped

 

DOCUMENT一樣,適合于老的XML schema,。

在大多書(shū)情況下,,你不許要擔(dān)心是DOCUMENT服務(wù)還是WRAPPED服務(wù)。

 

Message

 

以這種方式部署的話(huà),,會(huì)使AXIS失去意義,,它使你的代碼真正的用XML形式,而不需要轉(zhuǎn)化成JAVA對(duì)象。以這種方式部署的有以下四種服務(wù)方法:

 

public Element [] method(Element [] bodies);

public SOAPBodyElement [] method (SOAPBodyElement [] bodies);

public Document method(Document body);

public void method(SOAPEnvelope req, SOAPEnvelope resp);

 

幾種服務(wù)類(lèi)型的主要區(qū)別:

基于RPC(遠(yuǎn)程過(guò)程調(diào)用)方式,,這也是Web服務(wù)最常用的方式,。面向消息/文檔的的類(lèi)型跟RPC不同的是它提供了一個(gè)更底層的抽象,要求更多的編程工作,??蛻?hù)端可以傳入任何的XML文檔,得到的響應(yīng)不一定是SOAPEnvelope,,可以返回任何它所需要的東西,,甚至不返回。雖然這對(duì)開(kāi)發(fā)者來(lái)說(shuō)非常的靈活,,但是這種通訊類(lèi)型在實(shí)際的應(yīng)用中并不常見(jiàn),。面向消息/文檔的Web服務(wù)主要適合于下面幾種情況,比如批量處理,,基于表單的數(shù)據(jù)導(dǎo)入,,有需要返回非XML數(shù)據(jù)時(shí),Web服務(wù)器實(shí)現(xiàn)中要求直接訪(fǎng)問(wèn)傳輸層等等

 

Ø         WSDL

Web服務(wù)的接口定義語(yǔ)言,,由Ariba,、IntelIBM,、MS等共同提出,,通過(guò)WSDL,可描述Web服務(wù)的三個(gè)基本屬性:

·服務(wù)做些什么——服務(wù)所提供的操作(方法)

·如何訪(fǎng)問(wèn)服務(wù)——和服務(wù)交互的數(shù)據(jù)格式以及必要協(xié)議

·服務(wù)位于何處——協(xié)議相關(guān)的地址,,如URL

 

WSDL文檔以端口集合的形式來(lái)描述Web服務(wù),,WSDL 服務(wù)描述包含對(duì)一組操作和消息的一個(gè)抽象定義,綁定到這些操作和消息的一個(gè)具體協(xié)議,,和這個(gè)綁定的一個(gè)網(wǎng)絡(luò)端點(diǎn)規(guī)范,。

WSDLWeb 服務(wù)概念性協(xié)議棧中的位置

 

Ø         WSDD

WSDD就是WEB服務(wù)分布描述(Web Service Deployment Descriptor, 它定義了WEB服務(wù)的接口,如服務(wù)名,、提供的方法,、方法的參數(shù)等信息。

 

Ø         UDDI

UDDI就是統(tǒng)一描述,、發(fā)現(xiàn)和集成(Universal Description, Discovery, and Integration),。UDDI用于集中存放和查找WSDL描述文件,起著目錄服務(wù)器的作用,。

 

Web 服務(wù)中的角色,、操作和構(gòu)件:

    * 服務(wù)提供者。從企業(yè)的角度看,,這是服務(wù)的所有者,。從體系結(jié)構(gòu)的角度看,,這是托管訪(fǎng)問(wèn)服務(wù)的平臺(tái)。

    * 服務(wù)請(qǐng)求者,。從企業(yè)的角度看,,這是要求滿(mǎn)足特定功能的企業(yè),。從體系結(jié)構(gòu)的角度看,,這是尋找并調(diào)用服務(wù),或啟動(dòng)與服務(wù)的交互的應(yīng)用程序,。服務(wù)請(qǐng)求者角色可以由瀏覽器來(lái)?yè)?dān)當(dāng),,由人或無(wú)用戶(hù)界面的程序(例如,另外一個(gè) Web 服務(wù))來(lái)控制它,。

    * 服務(wù)注冊(cè)中心,。這是可搜索的服務(wù)描述注冊(cè)中心,服務(wù)提供者在此發(fā)布他們的服務(wù)描述,。在靜態(tài)綁定開(kāi)發(fā)或動(dòng)態(tài)綁定執(zhí)行期間,,服務(wù)請(qǐng)求者查找服務(wù)并獲得服務(wù)的綁定信息(在服務(wù)描述中)。對(duì)于靜態(tài)綁定的服務(wù)請(qǐng)求者,,服務(wù)注冊(cè)中心是體系結(jié)構(gòu)中的可選角色,,因?yàn)榉?wù)提供者可以把描述直接發(fā)送給服務(wù)請(qǐng)求者。同樣,,服務(wù)請(qǐng)求者可以從服務(wù)注冊(cè)中心以外的其它來(lái)源得到服務(wù)描述,,例如本地文件、FTP 站點(diǎn),、Web 站點(diǎn),、廣告和服務(wù)發(fā)現(xiàn)(Advertisement and Discovery of ServicesADS)或發(fā)現(xiàn) Web 服務(wù)(Discovery of Web Services,,DISCO),。

1.2    WebService用途

Ø         異構(gòu)平臺(tái)或分布式平臺(tái)遠(yuǎn)程調(diào)用

 

2       WebService實(shí)例

2.1    Axis包介紹

Axis是一個(gè)實(shí)現(xiàn)WebServiceFrameworkApache Web Services Projecthttp://ws. )的一個(gè)子項(xiàng)目

2.1.1   Axis1.4(Axis中最后Release版本)

2.1.1.1             基本概念

Ø         Axis部署方式有兩種:

1,axis最方便的發(fā)布WebServices的方法是把你的.java改成.jws的放到Web發(fā)布文件夾下的根目錄下,此方法叫即時(shí)部署

注意:在你寫(xiě)的類(lèi)中不能有具體包的信息,,因?yàn)檫@正是Axis即時(shí)部署不支持的

 

       2, 通過(guò)WSDD自定義部署

2.1.1.2             Axis自帶web分析

Ø         下載axis1.4

Ø         啟動(dòng)tomcat4.1.31

Ø         拷貝webapps\axistomcat\ webapps,tomcat自動(dòng)部署web module

Ø         訪(fǎng)問(wèn): http://localhost:8080/axis/ ,一般可以正常訪(fǎng)問(wèn)到Apache-AXIS主頁(yè),并可以點(diǎn)擊list察看已發(fā)布的web service

 

 

Ø         重點(diǎn):

1,webservice只需要在一個(gè)web container中配置即可 

2,axis自帶web.xml中的配置:

 

一個(gè)servlet監(jiān)聽(tīng)器:

三個(gè)servlet,其中紅色是主控程序

 

servlet的映射地址:

 

 

3,axis自帶的webservice在哪配的?

 可能是寫(xiě)到 org.apache.axis.transport.http.AxisServlet 中的

2.1.1.3             編寫(xiě)自己的webservice

下面是如何自己編寫(xiě)并發(fā)布一個(gè)web service的過(guò)程:

服務(wù)器測(cè)試環(huán)境:

Web Server

描述

Tomcat4.1

端口:8080

程序列表:

1,一個(gè)java普通類(lèi)Class1.class:web service的主要調(diào)用類(lèi)

  有三個(gè)方法

2,WEB-INFO\ server-config.wsdd :對(duì)上面類(lèi)的wsdd配置描述

 

Weblogic8.1

端口:7001

程序列表:

1,一個(gè)clientjsp文件,遠(yuǎn)程調(diào)用8080端口的webservice類(lèi)中的方法

 

 

 

2.1.1.3.1       編寫(xiě)并部署服務(wù)器的webservice

1,新建一個(gè)類(lèi),如圖:

其中有三個(gè)方法,兩個(gè)簡(jiǎn)單方法和一個(gè)返回類(lèi)型為自定義類(lèi)的方法.

寫(xiě)方法 test3的原因主要是要研究webservice如何傳遞自定義類(lèi)以及如何在異構(gòu)平臺(tái)上傳遞和接收自定義類(lèi).

 

package com.bell.ws;

 

public class Class1 {

    public Class1() {

    }

    public String test1(String p1){

        return "test1:"+p1;

    }

    public void test2(){

        System.out.println("i‘m test2");

    }

    public MyVO test3(MyVO myvo){

        return myvo;

    }

}

 

 

 

2, WEB-INF目錄下加入一個(gè)server-config.wsdd,。這是WebServices的發(fā)布描述文件,作用類(lèi)似于web.xml,。它有自己的格式

其內(nèi)容如下:

<?xml version="1.0" encoding="UTF-8"?>

<deployment xmlns="http://xml./axis/wsdd/" xmlns:java="http://xml./axis/wsdd/providers/java">

 <service name="Class1" provider="java:RPC">

  <parameter name="allowedMethods" value="*"/>

  <parameter name="className" value="com.bell.ws.Class1"/>

 </service>

</deployment>

 

重啟tomcat,就可以看到剛剛發(fā)布的service:

但這時(shí)點(diǎn)進(jìn)wsdl時(shí)會(huì)出錯(cuò):原因: server-config.wsdd中未加全內(nèi)容

把內(nèi)容加全后,測(cè)試成功:

<?xml version="1.0" encoding="UTF-8"?>

<deployment xmlns="http://xml./axis/wsdd/"

    xmlns:java="http://xml./axis/wsdd/providers/java"

    xmlns:handler="http://xml./axis/wsdd/providers/handler"

    xmlns:xsi="http://www./2001/XMLSchema-instance"

    name="defaultClientConfig" xsi:type="deployment">

    <globalConfiguration name="defaultClientConfig">

        <parameter name="disablePrettyXML" value="true"/>

        <parameter name="dotNetSoapEncFix" value="true"/>

        <requestFlow name="RequestFlow1" type="">

            <handler name="Handler1" type="java:org.apache.axis.handlers.JWSHandler">

                <parameter name="scope" value="session"/>

            </handler>

            <handler name="Handler2" type="java:org.apache.axis.handlers.JWSHandler">

                <parameter name="scope" value="request"/>

                <parameter name="extension" value=".jwr"/>

            </handler>

        </requestFlow>

    </globalConfiguration>

    <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>

    <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/>

    <handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>

    <transport name="http" type="">

        <parameter name="qs:list" value="org.apache.axis.transport.http.QSListHandler"/>

        <parameter name="qs:method" value="org.apache.axis.transport.http.QSMethodHandler"/>

        <parameter name="qs:wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>

        <requestFlow name="RequestFlow1" type="">

            <handler name="Handler1" type="URLMapper"/>

            <handler name="Handler2" type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>

        </requestFlow>

    </transport>

    <transport name="local" type="">

        <responseFlow name="ResponseFlow1" type="">

            <handler name="Handler1" type="LocalResponder"/>

        </responseFlow>

    </transport>

   

   

 <service name="Class1" provider="java:RPC">

  <parameter name="allowedMethods" value="*"/>

  <parameter name="className" value="com.bell.ws.Class1"/>

 </service>

</deployment>

 

成功頁(yè)面

 

 

2.1.1.3.2       編寫(xiě)客戶(hù)端程序調(diào)用遠(yuǎn)程webservice

Ø         在上面webservice發(fā)布成功的前提下,編寫(xiě)客戶(hù)端程序進(jìn)行遠(yuǎn)程調(diào)用:

 

<%@ page import="org.apache.axis.client.Call,org.apache.axis.client.Service,org.apache.axis.encoding.XMLType,org.apache.axis.utils.Options" %>

<%@ page import="javax.xml.namespace.QName,javax.xml.rpc.ParameterMode" %>

<%

        try {

            Service  service = new Service();

            Call    call    = (Call) service.createCall();

            call.setTargetEndpointAddress( new java.net.URL("http://localhost:8080/axis/services/Class1") );

            call.setOperationName( new QName("http://ws.", "test1") );

            call.addParameter( "arg1", XMLType.XSD_STRING, ParameterMode.IN);

            call.setReturnType( org.apache.axis.encoding.XMLType.XSD_STRING );

 

            String ret = (String) call.invoke( new Object[] { "first test!" } );

            System.out.println("You typed : " + ret);

            out.println("ret"+ret);

        } catch (Exception e) {

           // e.printStackTrace();

            System.err.println(e.toString());

        }

%>

 

 

正常調(diào)用的結(jié)果頁(yè)面如下:

 

2.1.1.3.3       編寫(xiě)返回復(fù)合類(lèi)型的webservice

上面我們返回的只是簡(jiǎn)單的string型字串,下面舉例說(shuō)明如何返回復(fù)合類(lèi)型的webservice:

還是使用上面的Class1.java,其中方法test3是返回的MyVO類(lèi)型:

對(duì)server-config.wsdd進(jìn)行配置:

 

目前會(huì)出現(xiàn):

java.io.IOException: No serializer found for class com.bell.ws.MyVO in registry

org.apache.axis.encoding.TypeMappingDelegate@38fb59

2.1.2   Axis2

 

2.2    Jbuilder2006實(shí)現(xiàn)WebService

 

2.3    疑問(wèn)

1,安全問(wèn)題

2,有狀態(tài)會(huì)話(huà)問(wèn)題等等

3,如何跨平臺(tái)返回復(fù)雜類(lèi)型

4,即然java源文件+wsdd文件即可部署web service,jbuilder中生成的一堆文件是干嘛用的?

3       WebService開(kāi)發(fā)經(jīng)驗(yàn)(網(wǎng)上摘抄)

摘自網(wǎng)址:http://www./topic/73047

去年,,在一個(gè)大型項(xiàng)目(1500w)中用到Web Services,現(xiàn)在項(xiàng)目進(jìn)入了尾聲,,所以對(duì)以前的開(kāi)發(fā)經(jīng)歷做一個(gè)總結(jié),。
我想大家一定會(huì)問(wèn)?為什么你們項(xiàng)目中要用到Web Services,,因?yàn)榭蛻?hù)有如下需求:

1
,、客戶(hù)要求項(xiàng)目用C/S架構(gòu),并且服務(wù)器端是IBM那一套:WebSphere AppServerDB2AIX5.3RS/6000

2
,、最終用戶(hù)上報(bào)數(shù)據(jù),,因?yàn)榫W(wǎng)絡(luò)原因,譬如Modem上網(wǎng),,可以離線(xiàn)操作,,等填寫(xiě)了幾十張報(bào)表后,可以一次提交,。同時(shí),,在登錄時(shí),可以將服務(wù)端數(shù)據(jù)同步到本地AccessMSSQL數(shù)據(jù)庫(kù),,這樣提高客戶(hù)端響應(yīng)速度,。

3
、由于有些報(bào)表以后可能需要修改,,或添加一些新報(bào)表,,又不想重新開(kāi)發(fā),這樣客戶(hù)那邊工作人員可以通過(guò)客戶(hù)端自定義,。

如果有以上需求,,我想大家應(yīng)該都比較認(rèn)同這種異構(gòu)分布式解決方案:客戶(hù)端用C# .Net開(kāi)發(fā),通過(guò)Web Services調(diào)用服務(wù)器端Java組件,。

其實(shí),,上面的解決方案太過(guò)于理想,最后我們不得不面對(duì)殘酷的現(xiàn)實(shí):三種客戶(hù)端中的兩種最后被迫改為B/S,。
在項(xiàng)目中,,我主要負(fù)責(zé)Web Services和服務(wù)器端組件開(kāi)發(fā)中所遇到的種種問(wèn)題,相當(dāng)于技術(shù)支持吧,,以及部分模塊的開(kāi)發(fā),。

以下是我們開(kāi)發(fā)中遇到的實(shí)際問(wèn)題,雖然最終都一一解決,,但遇到了幾個(gè)無(wú)法突破的瓶頸:客戶(hù)端不穩(wěn)定,,客戶(hù)端響應(yīng)遲緩,后期測(cè)試和維護(hù)困難巨大,。

一,、異構(gòu)平臺(tái)的Web Services兼容性
開(kāi)發(fā)過(guò)程中,我們用AxisWeb Services引擎,,Tomcat做容器,。因?yàn)槲覀冎挥?span>IBM提供的RAD6.060天試用版。該工具超級(jí)占內(nèi)存,,用內(nèi)置的WebSphere開(kāi)發(fā)測(cè)試極其緩慢,,嚴(yán)重影響開(kāi)發(fā)效率,,經(jīng)過(guò)我初期試用后,基本廢棄了,。推薦項(xiàng)目組二三十開(kāi)發(fā)人員用Lomboz eclipse3.12開(kāi)發(fā),,基本滿(mǎn)意。

由于Axis是一個(gè)嵌入式引擎,,所以可以將其打包到最終的WebSphere AppServerWAS)上,,也就是說(shuō),我們沒(méi)有用到WAS提供的Web Services引擎,,這引出了后面會(huì)談到的一個(gè)問(wèn)題:Web Services安全性怎么部署,?

Axis時(shí),,Axis一直都有一個(gè)bug或是說(shuō)缺陷,,官方文檔也詳細(xì)注明,只是我們當(dāng)時(shí)沒(méi)有發(fā)現(xiàn)而走了很多彎路:用Axis發(fā)布的Web Services.net客戶(hù)端調(diào)用時(shí),,必須用RPC風(fēng)格,,不能用Web Services標(biāo)準(zhǔn)的跨平臺(tái)風(fēng)格Document,而后者是Lomboz axis插件的默認(rèn)方式,。也就是說(shuō),,我們發(fā)布的Web Services總是莫名其妙的不好用。我們用JBuilder2007自帶的Axis插件發(fā)布,,竟然非常順利,。

二、Web Services開(kāi)發(fā)中服務(wù)器端組件問(wèn)題
我們服務(wù)器端開(kāi)發(fā),,是用SpringHibernate,,在SpringService層上再封裝一層,也就是façade模式了,,該façade直接發(fā)布為Web Services,,必須經(jīng)過(guò)這個(gè)轉(zhuǎn)換,一是因?yàn)樾阅?,二是因?yàn)?span>Hibernate的復(fù)雜Model對(duì)象,,在wsdl描述后,被.net客戶(hù)端識(shí)別有些問(wèn)題,,List,、Map也會(huì)有問(wèn)題,總之這些對(duì)象太復(fù)雜了,,我們包裝成簡(jiǎn)單的VO對(duì)象,。

另外一個(gè)問(wèn)題是,我們的service方法,,如果直接給WebWork這樣的框架在服務(wù)端用的的話(huà),,是不會(huì)出問(wèn)題,,當(dāng)提供給.net客戶(hù)端用時(shí),就會(huì)出現(xiàn)lazy loading的錯(cuò)誤,,因?yàn)?span>.net客戶(hù)端不能接收Proxy對(duì)象,,必須將數(shù)據(jù)全部load出來(lái),但這時(shí)Hibernatesession已經(jīng)關(guān)閉,。項(xiàng)目組很多人遇到這些問(wèn)題,,最后大家不約而同的全部用eager模式,導(dǎo)致了最后的惡果:嚴(yán)重的的性能問(wèn)題,。由于我不是leader,,所以當(dāng)時(shí)這個(gè)問(wèn)題發(fā)現(xiàn)了,也沒(méi)法要求別人,,畢竟很大的一個(gè)團(tuán)隊(duì),。
切身體會(huì):一個(gè)團(tuán)隊(duì),如果不熟悉Hibernate就隨便上,,技術(shù)風(fēng)險(xiǎn)非常大,。Hibernate帶來(lái)的開(kāi)發(fā)效率,是以團(tuán)隊(duì)成員掌握它為前提,。

當(dāng)然,,性能問(wèn)題不只是由Hibernate引起,Web Services本身的性能也非常嚴(yán)重:XML的序列化和反序列化耗時(shí),,XML文件的膨脹導(dǎo)致的網(wǎng)絡(luò)傳輸,,HTTP的無(wú)狀態(tài)導(dǎo)致網(wǎng)絡(luò)IO性能。切身體會(huì):如果系統(tǒng)必須用分布式,,而不是追求所謂的SOA架構(gòu),,Web Services應(yīng)該是下下策,因?yàn)檫€有很多協(xié)議和方式可以選擇:IIOP,、RMI,、Hessianburlap,、RPC,,另外,做系統(tǒng)集成還有Message方式,。

Web Services開(kāi)發(fā)中其它問(wèn)題比較少,,因?yàn)?span>Web Services本身不用編程,只是部署的事情,,開(kāi)發(fā)工具和服務(wù)器會(huì)自動(dòng)為我們做,,我們只需要理解SOAP引擎的原理和使用就夠了,真的遇到問(wèn)題,,可以通過(guò)AxisTcpMonitor監(jiān)視SOAP數(shù)據(jù)包,。
開(kāi)發(fā)過(guò)程中,,.net客戶(hù)端那邊,VSStudio做得很智能,,它會(huì)根據(jù)wsdl文件生成我們所要的一切,,當(dāng)然,wsdl文件的變化,,會(huì)導(dǎo)致VSStudio重新生成所有的類(lèi)和接口,,也很耗時(shí),并且容易出問(wèn)題,。

三,、Web Services的安全問(wèn)題
當(dāng)時(shí)解決Web Services安全問(wèn)題,花了我將近一個(gè)月的時(shí)間,,主要是學(xué)習(xí)和處理如下四個(gè)問(wèn)題:

XML
Web Services安全規(guī)范

WAS
Web Services引擎的安全部署

Axis
和參考的Xfire引擎的Web Services安全

.net
客戶(hù)端WSE3.0的安全以及和WAS的通訊

最后這些問(wèn)題基本上都解決了,,不過(guò)還是沒(méi)有用上,因?yàn)樵谖覀円呀?jīng)開(kāi)發(fā)的幾種客戶(hù)端和服務(wù)器端部署上很麻煩,,還要測(cè)試,,另外,,客戶(hù)也沒(méi)法驗(yàn)收這個(gè)啊,。

當(dāng)然,我們還回避了一個(gè)嚴(yán)肅的問(wèn)題:我們的Web Services是發(fā)布在Axis引擎上,,還沒(méi)有移植到WASWeb Services引擎,,而發(fā)布在這個(gè)平臺(tái),必須有RAD這類(lèi)開(kāi)發(fā)工具支持,,幾乎沒(méi)法手動(dòng)做,。WAS引擎的Web Services安全配置異常復(fù)雜:我們當(dāng)時(shí)只配置了AuthenticationIntegration,沒(méi)有做Encryption,,但完全夠用,。我當(dāng)時(shí)用SunNetBean開(kāi)發(fā)工具發(fā)布了一下Web Serivces,也是挺好用的,,不過(guò)沒(méi)有配置安全,。順便說(shuō)一下,Sunweb Services引擎jwsdp2.0設(shè)計(jì)有點(diǎn)類(lèi)似于EJB容器,,很不好用,,移植性特差。
我們當(dāng)時(shí)用Axis引擎是1.3版本,,而該版并不支持標(biāo)準(zhǔn)的OASISWS-Security,,只有到2.0版才開(kāi)始,而且?guī)缀醵际鞘謱?xiě)配置文件,。

WASWeb Services安全配置,,對(duì)照IBM的紅皮書(shū),,不是很難,但很復(fù)雜,,安全相關(guān)的xml代碼都好幾百行,,好幾個(gè)文件。配置過(guò)程中,,和.net客戶(hù)端通訊時(shí)遇到一個(gè)問(wèn)題,,怎么也不能互通,但.net.net客戶(hù)端可以互通,,JavaJava客戶(hù)端也可以互通,最后我通過(guò)攔截soap,找到了解決辦法: 必須手動(dòng)更改http://docs./wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3 后的v3,,IBM工具生成的是v1,這是標(biāo)準(zhǔn)不兼容引起的,,因?yàn)楫?dāng)時(shí)RAD04年底,而微軟的WSE3.0比較新,。后來(lái)發(fā)現(xiàn)這篇文章有相似的經(jīng)歷:http:///blogs/kirillg/archive/2005/04/13/7315.aspx

在處理Web Services安全過(guò)程中,我通過(guò)emuleIBM網(wǎng)站下載了上10本這方面的書(shū)籍,,我覺(jué)得以下資料對(duì)我?guī)椭畲螅?span>

Axis的若干文檔:Reference,、developers-guidearchitecture-guide等,,非常詳細(xì)
IBM
的紅皮書(shū):《WebSphere Version 6 Web Services Handbook Development and Deployment.pdf》,、《WebSphere Application Server V6 Security Handbook.pdf》,它專(zhuān)門(mén)講述了Web Services安全的原理和具體配置,,非常深入淺出,。

Securing Web Services with WS-Security》:這本書(shū)很理論化,但我認(rèn)為非常好,,雖然Amazon排行不高,。

WSE3.0
MSDN文檔。

四,、開(kāi)發(fā)過(guò)程中的的溝通問(wèn)題
這應(yīng)該不是一個(gè)技術(shù)問(wèn)題,,而是一個(gè)軟件開(kāi)發(fā)方法學(xué)的問(wèn)題,但對(duì)整個(gè)軟件開(kāi)發(fā)過(guò)程影響極大,。

我們面對(duì)的現(xiàn)實(shí):.net客戶(hù)端開(kāi)發(fā)人員不懂服務(wù)器端Java,,服務(wù)器端Java開(kāi)發(fā)人員不懂.net

除了技術(shù)壁壘外,,還有業(yè)務(wù)銜接性的問(wèn)題,,因?yàn)槲覀儾皇强v向分模塊開(kāi)發(fā),而橫向開(kāi)發(fā)的前提是我們服務(wù)器端開(kāi)發(fā)人員很熟悉業(yè)務(wù),,知道客戶(hù)端需要的接口,,但實(shí)際上,業(yè)務(wù)主要由客戶(hù)端推動(dòng),。所以,,兩端的開(kāi)發(fā)人員都遇到很大的溝通壁壘,。

從技術(shù)的角度表達(dá)就是:客戶(hù)端開(kāi)發(fā)人員需要的接口,服務(wù)器端開(kāi)發(fā)人員不清楚,;服務(wù)器端開(kāi)發(fā)人員也不知道怎么把握粒度,。譬如,有個(gè)updateUser方法,,但更新用戶(hù)信息時(shí),,可能需要更新很多信息:用戶(hù)信息、用戶(hù)角色,、用戶(hù)所屬組….,。loadUser時(shí)也有同樣的按需加載問(wèn)題。

當(dāng)然,,從技術(shù)角度,,開(kāi)發(fā)Web SerivcesBottom-upTop-down兩種開(kāi)發(fā)模式。我們選擇了前者,,也是最常見(jiàn)的方式,,也許用后者更適合我們的項(xiàng)目:從定義的wsdl文件開(kāi)始,客戶(hù)端和服務(wù)器端開(kāi)發(fā)都遵循它,。但問(wèn)題是:我們?cè)趺创_定wsdl,,也就是我們所要求的接口,因?yàn)槲覀冏约簩?duì)業(yè)務(wù)都不是很熟,。

五,、客戶(hù)端和服務(wù)端開(kāi)發(fā)測(cè)試方法
我們當(dāng)時(shí)做得很笨,也最直接:等服務(wù)器端組件發(fā)布完畢后,,通知客戶(hù)端開(kāi)發(fā)人員,然后客戶(hù)端開(kāi)發(fā)人員通過(guò)VSStudio提供的Web Services生成工具,,根據(jù)Axis發(fā)布的wsdl文件,,生成所需的.net對(duì)象,然后像本地調(diào)用一樣使用,。

但問(wèn)題是:
wsdl
隨時(shí)都在變,,這意味著客戶(hù)端生成的組件總在變化,經(jīng)常出現(xiàn)編譯錯(cuò)誤,。

客戶(hù)端開(kāi)發(fā)過(guò)程中遇到的問(wèn)題,,一會(huì)是客戶(hù)端自己,一會(huì)是服務(wù)器端組件:我要的方法包含的信息不夠啊,。

服務(wù)器組件測(cè)試一次,,起容器特慢,而且客戶(hù)端調(diào)用也慢,。
我們的測(cè)試,,最后走入了一個(gè)怎樣的泥潭:譬如測(cè)試一張報(bào)表,,都是在客戶(hù)端手工填寫(xiě),然后觀(guān)察服務(wù)器端日志和響應(yīng),。有人會(huì)問(wèn),,用LoadRunnerFunction Tester這類(lèi)自動(dòng)測(cè)試工具不就ok了嗎?我都用過(guò),,它們對(duì)Web UI確實(shí)好用,,后者對(duì)Swing客戶(hù)端也好用,但對(duì).net客戶(hù)端,,像是不太現(xiàn)實(shí),。

另外,Debug非常困難,,因?yàn)樗髢啥碎_(kāi)發(fā)人員必須在一起密切配合,。

我自己認(rèn)為的解決方案,但未必真的好用:
服務(wù)器端Service方法必須寫(xiě)單元測(cè)試TestCase,,可能代碼量非常大,,測(cè)試好后方發(fā)布為Web Services

同時(shí),,服務(wù)器端提供同一套接口的Mock實(shí)現(xiàn),,供客戶(hù)端開(kāi)發(fā)測(cè)試,解決并行開(kāi)發(fā)的問(wèn)題,。

六,、其它問(wèn)題
當(dāng)然,上面的幾點(diǎn),,具體到細(xì)節(jié),,我都省略了,總之問(wèn)題非常非常多:技術(shù)問(wèn)題,、管理問(wèn)題,、方法和過(guò)程問(wèn)題。

特別提的一點(diǎn)是,,我們幾乎開(kāi)發(fā)了兩套業(yè)務(wù)層+持久化解決方案,,因?yàn)殡x線(xiàn)客戶(hù)端也用了NHibernate持久化,這樣導(dǎo)致開(kāi)發(fā)測(cè)試工作量巨大,,就說(shuō)一點(diǎn)吧:兩邊同步是通過(guò)打包的sql語(yǔ)句,,通過(guò)SOAP傳輸,但AccessDB2sql有不兼容問(wèn)題,,如果要兼容,,就會(huì)以犧牲性能和靈活性為代價(jià)。

另外,我們寫(xiě)項(xiàng)目建議書(shū)時(shí)很被動(dòng),,但也沒(méi)辦法,,因?yàn)橛泻脦准夜靖?jìng)爭(zhēng)。對(duì)我們影響極大的幾個(gè)問(wèn)題:

1,、IBMWAS比起WebLogic Server易用性差遠(yuǎn)了,,導(dǎo)致部署時(shí)極其耗時(shí)。而且還有一些bug,,譬如連接池資源,,當(dāng)時(shí)不得不和IBM工程師咨詢(xún)。實(shí)際上,,我們只用到強(qiáng)大的WAS的一個(gè)非常小的部分:Web容器,。
2
、我們沒(méi)有針對(duì)WAS的開(kāi)發(fā)工具RAD,。但說(shuō)實(shí)話(huà),,那試用版的RAD也是一個(gè)字:慢,而且安裝時(shí)超級(jí)大,,約4個(gè)G,。而且和我們已經(jīng)在用的版本控制工具VSS沒(méi)法集成。

3
,、項(xiàng)目的C/S架構(gòu)不是很合理,,就是原來(lái)客戶(hù)的B/S架構(gòu),也運(yùn)行挺好的,,而且用asp,,跑在一個(gè)pc server上。我們一定程度上為了技術(shù)而技術(shù),。最后也達(dá)不到客戶(hù)需求:性能+穩(wěn)定,。

4
、自定義報(bào)表最后沒(méi)有投入使用,,只是一個(gè)半成品,。本來(lái)自定義報(bào)表就很難,要是容易,,一個(gè)軟件外行人員,就可以把表現(xiàn)層到持久化輕松搞定,,那一般MIS開(kāi)發(fā)人員不要失業(yè)了,,MDA也沒(méi)那么強(qiáng)。很多OA平臺(tái)一直在解決這個(gè)問(wèn)題,,也沒(méi)有發(fā)現(xiàn)特別好用的,。我們做技術(shù)調(diào)研期間試過(guò)MSInfoPathAdobe Designer,以及Excel Server,都不能滿(mǎn)足需求,。

當(dāng)然,,這個(gè)子系統(tǒng)只是我們那個(gè)龐大系統(tǒng)的一個(gè)部分。上面也就算我做的一點(diǎn)點(diǎn)總結(jié)吧,,也是教訓(xùn)?。〔贿^(guò),,從個(gè)人角度考慮,,學(xué)到的東西還是很多的。

這個(gè)子系統(tǒng)花去了我們將近200個(gè)人月,,如果說(shuō)那浪費(fèi)的部分,,估計(jì)至少是100個(gè)人月的工作量。是什么導(dǎo)致,?從我這篇文章只能窺其一角,,因?yàn)檎麄€(gè)系統(tǒng)涉及CMSOA,、BI,、E-commerceGIS,、IM,、MIS。我自己總結(jié)一下,,有以下原因:
1
,、項(xiàng)目建議書(shū)空洞,不切實(shí)際:公司也很無(wú)奈,,客戶(hù)也不成熟,。

2
、需求調(diào)研后的需求分析閉門(mén)造車(chē):客戶(hù)的合同是分階段,,我們上交需求說(shuō)明書(shū)后付20%款,,上交設(shè)計(jì)書(shū)后又付20%。全一個(gè)瀑布開(kāi)發(fā),,雖然按RUP文檔寫(xiě),。到半年后的實(shí)際開(kāi)發(fā)時(shí),發(fā)現(xiàn)很多需求都不合理,。

3
,、整個(gè)過(guò)程都沒(méi)有和客戶(hù)溝通,到最后開(kāi)發(fā)完畢才讓客戶(hù)看,,那時(shí)客戶(hù)也懵了:這不是我要的產(chǎn)品啊,。改呀,,改呀,熬夜啊,。

4
,、項(xiàng)目團(tuán)隊(duì)整體技術(shù)實(shí)力薄弱,當(dāng)時(shí)調(diào)來(lái)做Java開(kāi)發(fā)的人員,,只有少數(shù)幾個(gè)以前做Java,,大多數(shù)是臨時(shí)學(xué)。想起那Hibernate使用,,心寒啊,。另外,WAS問(wèn)題,、AIX問(wèn)題在產(chǎn)品環(huán)境下都出來(lái)了:系統(tǒng)不穩(wěn)定,、宕機(jī)。

5
,、整個(gè)開(kāi)發(fā)階段流程沒(méi)有把握好,,像項(xiàng)目規(guī)范、測(cè)試方法,、日志,、版本控制,這些后期都出現(xiàn)了,,而且非常嚴(yán)重,。就說(shuō)那日志吧,最后出問(wèn)題都不知道怎么查,,日志一遍混亂,。

6
、缺乏做大項(xiàng)目經(jīng)驗(yàn),,整個(gè)系統(tǒng)架構(gòu)都比較松散,,項(xiàng)目開(kāi)始時(shí)很多都不知從何入手,也很倉(cāng)促,。

7
,、項(xiàng)目持續(xù)一年多,人都換了幾批了,,工作交接很大問(wèn)題,。

.....

不過(guò),說(shuō)實(shí)話(huà),,項(xiàng)目團(tuán)隊(duì),,特別是進(jìn)公司一、兩年的員工都很努力,,沒(méi)有人抱怨什么,我和他(她)們一起合作,還是很開(kāi)心的,。

 

4       參考資料或網(wǎng)站:

 

WebService學(xué)習(xí),,開(kāi)發(fā)總結(jié)

http://www./blog/user1/261/archives/2006/2095.html

 

Axis初學(xué)手冊(cè)

http://www./mstar/archive/2005/10/06/14870.aspx

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,,不代表本站觀(guān)點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多