SOA分析报告.docx
《SOA分析报告.docx》由会员分享,可在线阅读,更多相关《SOA分析报告.docx(15页珍藏版)》请在冰豆网上搜索。
SOA分析报告
SOA分析报告
1引言
1.1编写目的
SOA架构作为炙手可热的技术,如何应用到企业的IT系统和商业流程之中、并给企业带来直接的经济效益,一直备受国内外企业管理者的高度关注和推崇。
本文最终目的是对SOA的利弊进行分析,分析SOA项目技术上的可行性,以保证今后项目的顺利进行。
1.2背景
测试一
背景:
a.被测软件为SOA架构的一种,应用weservice制作的加减运算,通过中间层对由调用程序对web服务的调用。
b.本测试有信息部提出测试,测试环境:
windowsxp2,.NET2005
测试二
背景:
a.被测软件名称:
扫描码系统
b.公司业务拓展的需要,要新开一家仓库,但是公司的内网是不能对外开放的,这就用到了我们今天所测试的SOA架构的webservice.通过我们的中间接口来直接与外网相连。
保障公司内部系统的安全。
下面我们举其中的一段代码。
1.3SOA的定义
SOA即面向服务的体系结构(service-orientedarchitecture,SOA),是指为了解决在inernet环境下业务集成的需要,通过连接能完成特定任务的独立功能实现的一种软件系统架构。
具体上说它是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。
接口是采用中立的方式进行定义的,它独立于实现服务的硬件平台、操作系统和编程语言。
这使得构建在各种这样的系统中的服务可以以一种统一和通用的方式进行交互。
1.4SOA的基础结构
要运行,管理SOA应用程序,企业需要SOA基础,这是SOA平台的一个部分。
SOA基础必须支持所有的相关标准,和需要的运行时容器。
WSDL,UDDI和SOAP是SOA基础的基础部件。
WSDL用来描述服务;UDDI用来注册和查找服务;而SOAP,作为传输层,用来在消费者和服务提供者之间传送消息。
SOAP是Web服务的默认机制,其他的技术为可以服务实现其他类型的绑定。
一个消费者可以在UDDI注册表(registry)查找服务,取得服务的WSDL描述,然后通过SOAP来调用服务。
2SOA的测试
测试一
2.1测试概要:
先创建一个Web服务,此Web服务即为我们所定义的中间接口,是SOA的主要服务所在。
然后我们再创建调用程序对此服务进行调用。
2.2创建Web服务
首先,打开VS.Net2005,按Ctrl+Shift+N(或者打开“文件-新建-项目”),选择“ASP.NETWeb服务”。
生成WebService默认文件是Service1.asmx。
查看Service1.asmx.cs代码,你会发现VS.Net2003已经为WebService文件建立了缺省的框架。
原始代码为:
//代码1
usingSystem;
usingSystem.Web;
usingSystem.Web.Services;
usingSystem.Web.Services.Protocols;
[WebService(Namespace="http:
//tempuri.org/")]
[WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]
publicclassService:
System.Web.Services.WebService
{
publicService()
{
//Uncommentthefollowinglineifusingdesignedcomponents
//InitializeComponent();
}
[WebMethod]
publicstringHelloWorld()
{
return"HelloWorld";
}
}
}直接使用“WEB服务示例”,我们先看一下最简单的WebService是什么样子的。
直接按F5编译查看效果。
再点击“调用”按钮,就可以看到用XML格式返回的WebService结果(如图4)。
说明我们的WebService环境没有问题,而且还初步接触了一下最简单的WebService。
(图4)
2、创建一个简单带有功能的WebService
网上有很多例子都是计算a+b=sum和显示问候语的,所以我们也来练习一下。
我们建立一个整数加法和显示西部E网问候语的WebService的例子,然后我们在下一节练习如何调用它。
另外:
WebMethod和WebService都有一个Description属性,功能就是描述一下服务功能,具体方法可见:
[WebMethod(Description="计算a+b=sum的功能")]和
[WebService(Namespace="",Description="用VS.NET开发一个WebService实例")]
[WebMethod(Description="计算a+b=sum的功能")]
publicintAdd(inta,intb)
{
returna+b;
}
[WebMethod(Description="显示问候语的功能")]
publicstringShow(stringyourname)
{
return"西部E网"+"欢迎"+yourname;
}
(代码3) 运行后显示的结果如图5,具体的操作和测试方式就不细说了,和上面的HelloWorld差不多。
如果测试正确性,可以输入“http:
//localhost:
1406/WebSite1/Service.asmx”(如图
(图5)
(图6)
3、用ASP调用WebService
如果要用ASP来调用WevService,就一定要使用SOAPToolkit或者XMLHTTP,使用SOAPClient需要专门安装SOAPToolkit,这对客户端来说不具有通用性,因此我们就学习使用XML来进行对WebService的调用。
<%
SetobjHTTP=Server.CreateObject("MSXML2.XMLHTTP")
SetxmlDOC=Server.CreateObject("MSXML.DOMDocument")
strWebserviceURL="http:
//localhost:
1406/WebSite1/Service.asmx?
op=Add"
'设置参数和值
strRequest="a=5&b=6"
objHTTP.Open"POST",strWebserviceURL,False
'设置Content-Type很重要
objHTTP.SetRequestHeader"Content-Type","application/x-www-form-urlencoded"
objHTTP.Send(strRequest)
bOK=xmlDOC.load(objHTTP.responseXML)
'查看状态值
ifobjHTTP.Status=200then
xmlStr=xmlDOC.xml
xmlStr=Replace(xmlStr,"<","<",1,-1,1)
xmlStr=Replace(xmlStr,">",">",1,-1,1)
Response.WritexmlStr
else
Response.WriteobjHTTP.Statu&"
"
Response.WriteobjHTTP.StatusText
endif
%>
代码4)
注意:
代码中的“http:
//localhost:
1406/WebSite1/Service.asmx?
op=Add”是在第2节中其中“计算a+b=sum功能”的WebService地址。
以上代码在本地测试都没有问题(在部署webservice的本地机器上测试的),然而把strWebserviceURL="http:
//localhost/WebService1/Service1.asmx/Add"改为部署在其他机器上的WebService时,却出了问题,结果一直是返回500错误,即objHTTP.Status一直都为500。
原因在于.NetFramework1.1默认不支持HttpGet和HttpPost。
如果修改webservice里的web.config增加上代码5后,上代码就可以调用远程机器上的WebService了。
4、用VBScript调用WebService
大家都清楚,其实VB、ASP、VBScript的语法和代码都及其相似,其实写出来他们其中任何一个都能出来另外几个。
SetobjHTTP=CreateObject("MSXML2.XMLHTTP")
SetxmlDOC=CreateObject("MSXML.DOMDocument")
strWebserviceURL="http:
//localhost:
1406/WebSite1/Service.asmx?
op=Add"
'设置参数和值
strRequest="a=2&b=3"
objHTTP.Open"POST",strWebserviceURL,False
'设置Content-Type很重要
objHTTP.SetRequestHeader"Content-Type","application/x-www-form-urlencoded"
objHTTP.Send(strRequest)
bOK=xmlDOC.load(objHTTP.responseXML)
'查看状态值,这里是用MsgBox的方式显示的,你可以根据
'自己的需要用其他方式显示
msgBoxobjHTTP.Status
msgboxobjHTTP.StatusText
'objHTTP.Status=200,这里就可以处理返回的xml片段了
'如果需要,可以替换返回的xml字符串当中的<和>
xmlStr=xmlDOC.xml
xmlStr=Replace(xmlStr,"<","<",1,-1,1)
xmlStr=Replace(xmlStr,">",">",1,-1,1)
msgboxxmlStr
代码6)
5、用ASP.Net调用WebService
在VS.Net2005中新建窗体(我这里使用的C#),我这里的文件是WebForm1.aspx,编辑WebForm1.aspx.cs代码。
这里我们之举对Add()函数接口的调用和调用HelloWord()的方法,其它类似。
加进去一个lable控件。
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
namespaceWindowsApplication1
{
publicpartialclassForm1:
Form
{
publicForm1()
{
InitializeComponent();
}
privatevoidForm1_Load(objectsender,EventArgse)
{
localhost.Services=newWindowsApplication1.localhost.Service();
MessageBox.Show(s.HelloWorld());
}
publicclassmyApp
{
publicstaticvoidmain()
{
localhost.Servicecsrv=newWindowsApplication1.localhost.Service();
Console.WriteLine("csrv.Add(11,33);={0}",csrv.Add(33,11));}
}
privatevoidlbl1_Click(objectsender,EventArgse)
{
localhost.Servicecsrv=newWindowsApplication1.localhost.Service();
this.lbl1.Text=csrv.Add(33,11).ToString();
}
}
}
其中我们执行后点击labl控件会显示出我们调用的值44。
即调用成功。
测试二
2.5公司内部的扫描码系统
(由于关于公司机密,部分内容不能泄漏!
!
)
第一步:
建立一个webservice,代码如下
ImportsSystem.Web
ImportsSystem.Web.Services
ImportsSystem.Web.Services.Protocols
ImportsSystem.Data.SqlClient
ImportsSystem.Data.SqlClient.SqlDataReader
ImportsSystem.Data
="http:
//tempuri.org/")>_
=WsiProfiles.BasicProfile1_1)>_
_
PublicClassService
InheritsSystem.Web.Services.WebService
DimstrconnAsString="UserID=missql;Password=hello;database=barcode;DataSource=BC-SERVER"
_
PublicFunctionInsertBarcode(ByValsBarAsString,ByValyearweekAsLong,ByValProdAsString,ByValprod_typeAsString)AsBoolean
DimsDateTimeAsString
DimcnAsSqlConnection=NewSqlConnection(strconn)
DimsqlAsString="p_checkrule'"&sBar&"','"&Prod&"'"
cn.Open()
DimcommAsSqlDataAdapter=NewSqlDataAdapter(sql,cn)
DimdtAsDataTable=NewDataTable
comm.Fill(dt)
DimdaAsDataTable=NewDataTable
ForEachrAsDataRowIndt.Rows
Ifr(0).ToString<>"ok"Then
MsgBox("条形码["&sBar&"]不符合规则!
")
InsertBarcode=False
ExitFunction
EndIf
Next
Dimsql1AsString="Selectgetdate()asdt"
Dimcomm1AsSqlDataAdapter=NewSqlDataAdapter(sql1,cn)
comm1.Fill(da)
sDateTime=Format(da.Rows(0)("dt"),"yyyymmddhhmmss")
Dimsql2AsString="selectrtrim(curr_state)ascurr_state1,*frombarcode_mainwherebarcode='"&sBar&"'"
Dimcomm2AsSqlDataAdapter=NewSqlDataAdapter(sql2,cn)
comm2.Fill(da)
Ifda.Rows.Count<>0Then
Ifda.Rows(0)("curr_state1").ToString<>"00"Then
MsgBox("条形码["&sBar&"]已存在且非新生成状态!
")
InsertBarcode=False
ExitFunction
Else
Dimsql3AsString="UPDATEBARCODE_MAINSETCURR_STATE='-1',T3_PRINTED=1,TDATE="&Left(sDateTime,8)&",TTIME="&Right(sDateTime,6)&"WHEREBARCODE='"&sBar&"'"
Dimcomm3AsSqlCommand=NewSqlCommand(sql3,cn)
comm3.ExecuteNonQuery()
InsertBarcode=True
ExitFunction
EndIf
EndIf
Dimsql4AsString="insertintobarcode_main(year_week,prod,barcode,sord,curr_state,product_type,tdate,ttime,curr_whs,curr_loc,t3_printed)"&_
"values("&yearweek&",'"&Prod&"','"&sBar&"','4','-1','"&prod_type&"',"&Left(sDateTime,8)&","&Right(sDateTime,6)&",'D1','-1',1)"
Dimcomm4AsSqlCommand=NewSqlCommand(sql4,cn)
comm4.ExecuteNonQuery()
InsertBarcode=True
EndFunction
EndClass
<调用程序>
然后我们在客户段用以下代码进行调用,我们的调用环境是VB6.0
PublicFunctionInsertBarcode(sBarAsString,yearweekAsLong,ProdAsString,prod_typeAsString)AsBoolean
DimccAsNewMSSOAPLib.SoapClient
cc.mssoapinit"webservice地址(关于公司机密不能泄漏)"
InsertBarcode=cc.InsertBarcode()
EndFunction
测试结果调用成功。
速度稍慢,不过还可以满足要求。
并且极大的保证的公司的系统安全,给我们的编程工作带来了极大的方便。
3SOA的测试评论
优点
3.1可从企业外部访问
由测试可以知道,我们可以直接利用这种中间接口来调用程序,其实这种程序也就是我们所说的面向服务的接口。
通常被称为业务伙伴的外部用户也能像企业内部用户一样访问相同的服务。
华东路仓库也是一样。
我们可以基于SOAP协议和XML语言来直接从外网对公司的数据库进行调用,而且可以保障内部系统的安全。
3.2随时可用
当有服务使用者请求服务时,SOA要求必须有服务提供者能够响应。
大多数SOA都能够为门户应用之类的同步应用和B2B之类的异步应用提供服务。
同步应用对于其所使用的服务具有很强的依赖性。
许多同步应用通常部署在前台,其最终用户很容易受到服务提供者短缺的影响。
很多情况下,同步应用利用分布式服务提供者,这样可以响应更多的用户请求。
但是,随着提供特定服务功能的服务器数量的增长,出现短缺的可能性也呈指数级上升。
相比之下,异步应用要更为稳健,因为其采用队列请求设计,因此可以容许出现服务提供者短缺或迟滞的情况。
异步应用大多数情况下部署在后台,用户通常不会觉察到短暂的短缺。
大部分情况下异步应用能够稳健应对短时间短缺,但是长时间短缺则会引发严重问题。
在服务短缺解决、队列引擎将罕见的大量工作推到共享的应用资源中时,可能会出现队列溢出甚至服务死锁。
服务使用者要求提供同步服务时,通常是基于其自身理解或使用习惯。
在多数情况下,采用异步模型可以达到同样的效果,但更能够体现SOA的最佳特性。
当然,并不是所有情况下都应当采用异步设计模式。
但大多数情况下,异步消息可以确保系统在不同负荷下的伸缩性,在接口响应时间不是很短时尤其如此。
3.3可以跨语言调用
由测试一我们可以看到,可以用不同的语言对SOA架构的webservice进行调用,你可以用任何你喜欢的语言进行编程,此编程接口只负责和服务端数据库的交换,尔不属于客户端程序,所以这就给编程人员带来了极大的方便。
我们不得不说webservice是一个进步。
3.4可以更好的支持商业流程
有以上测试我们很容易发现SOA结构就是把服务定义为专门的接口。
面向不同的服务这种接口很容易被修改。
而不需要在源程序上做太大的改动。
我们只需要改动这些接口即可。
这给企业的日益频繁的新需要提供了良好的修改方式。
可以很好的提升效率,加快开发速度、降低在客户化和人员技能的投入。
3.5有利于公司业务的集成
传统的应用集成方法(点对点集成、企业消息总线或中间件的集成(EAI)、基于业务流程的集成)都很复杂、昂贵,并且不灵活。
这些集成方法难于快速适应基于企业现代业务变化不断产生的需求。
基于面向服务架构(SOA)的应用开发和集成可以很好的解决其中的许多问题。
SOA描述了一套完善的开发模式来帮助客户端应用连接到服务上。
这些模式定制了系列机制用于描述服务、通知及发现服务、与服务进行通信。
不同于传统的应用集成方法,在SOA中,围绕服务的所有模式都是以基于标准的技术实现的。
大部分的通信中间件系统,如RPC、CORBA、DCOM、EJB和RMI,也同样如此。
可是它们的实现都不是很