SOA分析报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SOA分析报告
1引言
1.1编写目的
SOA架构作为炙手可热的技术,如何应用到企业的IT系统和商业流程之中、并给企业带来直接的经济效益,一直备受国内外企业管理者的高度关注和推崇。
本文最终目的是对SOA的利弊进行分析,分析SOA项目技术上的可行性,以保证今后项目的顺利进行。
1.2背景
测试一
背景:
a. 被测软件为SOA架构的一种,应用weservice制作的加减运算,通过中间层对由调用程序对web服务的调用。
b.本测试有信息部提出测试,测试环境:
windows xp2, .NET2005
测试二
背景:
a. 被测软件名称:扫描码系统
b.公司业务拓展的需要,要新开一家仓库,但是公司的内网是不能对外开放的,这就用到了我们今天所测试的SOA架构的webservice.通过我们的中间接口来直接与外网相连。
保障公司内部系统的安全。
下面我们举其中的一段代码。
1.3SOA的定义
SOA即面向服务的体系结构(service-oriented architecture,SOA),是指为了解决在inernet环境下业务集成的需要,通过连接能完成特定任务的独立功能实现的一种软件系统架构。
具体上说它是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。
接口是采用中立的方式进行定义的,它独立于实现服务的硬件平台、操作系统和编程语言。
这使得构建在各种这样的系统中的服务可以以一种统一和通用的方式进行交互。
1.4SOA的基础结构
要运行,管理SOA应用程序,企业需要SOA基础,这是SOA平台的一个部分。
SOA基础必须支持所有的相关标准,和需要的运行时容器。
WSDL,UDDI和SOAP
是SOA基础的基础部件。
WSDL用来描述服务;UDDI用来注册和查找服务;而SOAP,作为传输层,用来在消费者和服务提供者之间传送消息。
SOAP是Web服务的默认机制,其他的技术为可以服务实现其他类型的绑定。
一个消费者可以在UDDI注册表(registry)查找服务,取得服务的WSDL描述,然后通过SOAP来调用服务。
2 SOA的测试
测试一
2.1测试概要:
先创建一个W eb服务,此Web 服务即为我们所定义的中间接口,是SOA的主要服务所在。
然后我们再创建调用程序对此服务进行调用。
2.2 创建Web服务
首先,打开 2005, 按Ctrl+Shift+N(或者打开“文件-新建-项目”),选择“ Web 服务”。
生成WebService默认文件是Service1.asmx。
查看Service1.asmx.cs代码,你会发现 2003已经为Web Service文件建立了缺省的框架。
原始代码为:
//代码1
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
[WebService(Namespace = "/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
public Service()
{
//Uncomment the following line if using designed components
//InitializeComponent();
}
[WebMethod]
public string HelloWorld()
{
return"Hello World";
}
}
}直接使用“WEB 服务示例”,我们先看一下最简单的Web Service是什么样子的。
直接按F5编译查看效果。
明我们的Web Service环境没有问题,而且还初步接触了一下最简单的Web Service。
(图4)
2、创建一个简单带有功能的Web Service
网上有很多例子都是计算a+b=sum和显示问候语的,所以我们也来练习一下。
我们建立一个整数加法和显示西部E网问候语的Web Service的例子,然后我们在下一节练习如何调用它。
另外:WebMethod和WebService都有一个Description属性,功能就是描述一下服务功能,具体方法可见:
[WebMethod(Description="计算a+b=sum的功能")]和
[WebService (Namespace="", Description = "<font
color='#FF0000'><b>用 开发一个Web Service 实例< /b></font>")]
[WebMethod(Description="计算a+b=sum的功能")]
public int Add(int a,int b)
{
return a+b;
}
[WebMethod(Description="显示问候语的功能")]
public string Show(string yourname)
{
return "西部E网"+"欢迎"+yourname;
}
(代码3)运行后显示的结果如图5,具体的操作和测试方式就不细说了,和上面的HelloWorld差不多。
如果测试正确性,可以输入
“http://localhost:1406/WebSite1/Service.asmx”(如图
(图5)
(图6)
3、用ASP调用Web Service
如果要用ASP来调用WevService,就一定要使用SOAP Toolkit或者XMLHTTP, 使用SOAP Client需要专门安装SOAP Toolkit,这对客户端来说不具有通用性,因此我们就学习使用XML来进行对WebService的调用。
<%
Set objHTTP = Server.CreateObject("MSXML2.XMLHTTP")
Set xmlDOC =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)
'查看状态值
if objHTTP.Status=200 then
xmlStr = xmlDOC.xml
xmlStr = Replace(xmlStr,"<","<",1,-1,1)
xmlStr = Replace(xmlStr,">",">",1,-1,1)
Response.Write xmlStr
else
Response.Write objHTTP.Statu&"<br>"
Response.Write objHTTP.StatusText
end if
%>
代码4)
注意:代码中的“http://localhost:1406/WebSite1/Service.asmx?op=Add”是在第2节中其中“计算a+b=sum功能”的Web Service地址。
以上代码在本地测试都没有问题(在部署webservice的本地机器上测试的),然而把strWebserviceURL = "http://localhost/WebService1/Service1.asmx/Add"改为部署在其他机器上的WebService时,却出了问题,结果一直是返回500错误,即objHTTP.Status一直都为500。
原因在于.Net Framework1.1默认不支持HttpGet和HttpPost。
如果修改webservice里的web.config增加上代码5后,上代码就可以调用远程机器上的WebService了。
<webServices>
<protocols>
<add name="HttpPost"/>
<add name="HttpGet"/>
</protocols>
</webServices>
4、用VBScript调用Web Service
大家都清楚,其实VB、ASP、VBScript的语法和代码都及其相似,其实写出来他们其中任何一个都能出来另外几个。
<script language="vbscript">
Set objHTTP = CreateObject("MSXML2.XMLHTTP")
Set xmlDOC =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的方式显示的,你可以根据
'自己的需要用其他方式显示
msgBox objHTTP.Status
msgbox objHTTP.StatusText
'objHTTP.Status=200,这里就可以处理返回的xml片段了
'如果需要,可以替换返回的xml字符串当中的<和>
xmlStr = xmlDOC.xml
xmlStr = Replace(xmlStr,"<","<",1,-1,1)
xmlStr = Replace(xmlStr,">",">",1,-1,1)
msgbox xmlStr
</script>
代码6)
5、用调用Web Service
在 2005中新建窗体(我这里使用的C#),我这里的文件是WebForm1.aspx,编辑WebForm1.aspx.cs代码。
这里我们之举对Add()函数接口的调用和调用HelloWord()的方法,其它类似。
加进去一个lable控件。
using System;
using System.Collections.Generic;
using ponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
localhost.Service s = new
WindowsApplication1.localhost.Service();
MessageBox.Show(s.HelloWorld());
}
public class myApp
{
public static void main()
{
localhost.Service csrv=new
WindowsApplication1.localhost.Service();
Console.WriteLine("csrv.Add(11,33);={0}",csrv.Add(33,11)); } }
private void lbl1_Click(object sender, EventArgs e)
{
localhost.Service csrv = new
WindowsApplication1.localhost.Service();
this.lbl1.Text = csrv.Add(33, 11).ToString();
}
}
}
其中我们执行后点击labl控件会显示出我们调用的值44。
即调用成功。
测试二
2.5公司内部的扫描码系统
(由于关于公司机密,部分内容不能泄漏!!)
第一步:
建立一个webservice,代码如下
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.Data.SqlClient
Imports System.Data.SqlClient.SqlDataReader
Imports System.Data
<WebService(Namespace:="/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<pilerServices.DesignerGenerated()> _
Public Class Service
Inherits System.Web.Services.WebService
Dim strconn As String = " User ID=missql;Password=hello;database=barcode;Data
Source=BC-SERVER"
<WebMethod()> _
Public Function InsertBarcode(ByVal sBar As String, ByVal yearweek As Long, ByVal Prod As String, ByVal prod_type As String) As Boolean
Dim sDateTime As String
Dim cn As SqlConnection = New SqlConnection(strconn)
Dim sql As String = "p_checkrule '" & sBar & "', '" & Prod & "'"
cn.Open()
Dim comm As SqlDataAdapter = New SqlDataAdapter(sql, cn)
Dim dt As DataTable = New DataTable
comm.Fill(dt)
Dim da As DataTable = New DataTable
For Each r As DataRow In dt.Rows
If r(0).ToString <> "ok"Then
MsgBox("条形码[" & sBar & "]不符合规则!")
InsertBarcode = False
Exit Function
End If
Next
Dim sql1 As String = " Select getdate() as dt"
Dim comm1 As SqlDataAdapter = New SqlDataAdapter(sql1, cn)
comm1.Fill(da)
sDateTime = Format(da.Rows(0)("dt"), "yyyymmddhhmmss")
Dim sql2 As String = "select rtrim(curr_state) as curr_state1,* from barcode_main where barcode = '" & sBar & "'"
Dim comm2 As SqlDataAdapter = New SqlDataAdapter(sql2, cn)
comm2.Fill(da)
If da.Rows.Count <> 0 Then
If da.Rows(0)("curr_state1").ToString <> "00"Then
MsgBox("条形码[" & sBar & "]已存在且非新生成状态!")
InsertBarcode = False
Exit Function
Else
Dim sql3 As String = "UPDATE BARCODE_MAIN SET CURR_STATE = '-1', T3_PRINTED = 1, TDATE = " & Left(sDateTime, 8) & ", TTIME = " & Right(sDateTime, 6) & " WHERE BARCODE = '" & sBar & "'"
Dim comm3 As SqlCommand = New SqlCommand(sql3, cn)
comm3.ExecuteNonQuery()
InsertBarcode = True
Exit Function
End If
End If
Dim sql4 As String= "insert into barcode_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)"
Dim comm4 As SqlCommand = New SqlCommand(sql4, cn)
comm4.ExecuteNonQuery()
InsertBarcode = True
End Function
End Class
<调用程序>
然后我们在客户段用以下代码进行调用,我们的调用环境是VB6.0
Public Function InsertBarcode(sBar As String, yearweek As Long, Prod As String, prod_type As String) As Boolean
Dim cc As New MSSOAPLib.SoapClient
cc.mssoapinit "webservice地址(关于公司机密不能泄漏)"
InsertBarcode = cc.InsertBarcode()
End Function
测试结果调用成功。
速度稍慢,不过还可以满足要求。
并且极大的保证的公司的系统安全,给我们的编程工作带来了极大的方便。
3 SOA的测试评论
优点
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,也同样如此。
可是它们的实现都不是很完美的,在权衡交互性以及标准定制的可接受性方面总是存在问题。
SOA 试图排除这些缺陷。
因为几乎所有的通信中间件系统都有固定的处理模式,如RPC 的功能、CORBA 的对象等等。
然而,服务既可以定义为功能,又可同时对外定义为对象、应用等等。
这使得SOA
可适应于任何现有系统,并使得系统在集成时不必刻意遵循任何特殊定制。
SOA 帮助企业信息系统迁移到"leave-and-layer"架构之上,这意味着在不用对现有的企业系统做修改的前提下,系统可对外提供Web 服务接口,这是因为它们已经被可以提供Web 服务接口的应用层做了一层封装,所以在不用修改现有系统架构的情况下,SOA 可以将系统和应用迅速转换为服务。
SOA 不仅覆盖来自于打包应用、定制应用和遗留系统中的信息,而且还覆盖来自于如安全、内容管理、搜索等IT 架构中的功能和数据。
因为基于SOA 的应用能很容易地从这些基础服务架构中添加功能,所以基于SOA的应用能更快地应对市场变化,为使企业业务部门设计开发出新的功能应用。
下图提供了使用基于服务集成的企业应用的高级视图。
与传统的企业应用集成架构的主要区别在于该系统使用基于标准的服务,并包括过程/数据服务、编排和组合。
基于标准的服务成了应用间的集成点。
服务的编排和组合增加了服务的灵活性、重用性和集成性。
图示:使用基于服务集成的企业应用。
缺点
a.安全问题,由于需要事先灵活的策略,很多情况下需要把服务暴露在外,导致企业的安全需求就凸显出来,特别是那些以Web Services方式构建的SOA应用系统。
由于Web Services天生的问题。
”SOA可大幅改善业务的灵活性和响应时间,但它必须是一个安全的环境。
b标准的问题,SOA的建立是需要封装的服务具有一个统一的、标准的接口。
c企业管理的问题,如何对企业内部的各个系统进行整合,将是一个巨大的挑战。
所以我认为流程是阻挡SOA的最大障碍。
4 建议
1.首先要牢记的一点是我们公司必须对SOA的理解达成共识,应为对SOA的理解现在还没有一个确切的定义,所以对于一个部门达成共识就显得相当重要。
我们可以用自己的理解来共同支持这种架构。
比如说大家可以共同探讨wbservice的结构形式来共同支持它
2.我们需要对员工进行培训,
对许多企业而言,SOA与传统架构有着天壤之别。
传统架构侧重的是各种应用间紧密连接的接口,因此员工要想理解SOA就必须经历一段艰苦的学习过程。
而通过合理的培训和教育,您可以减轻员工的这种学习压力,更加自信地为SOA的实施做好准备。
建议您采用自上至下的培训顺序。
首先,对高级管理人员进行培训,让他们了解SOA 的基本要点,以及部署SOA后企业可能获得的利益与优势。
在完成高级管理层的培训后,接下来可以对下一级业务主管开展SOA方面的教育工作。
他们不仅需要理解SOA的总体目标,还要深入理解具体实践中遇到的细节,并且需要明确知道SOA是怎样实施的。
最后,您还需要对构建和部署SOA的人员进行具体培训。
这种渐进式的培训应该解决一些特定的技术问题,为企业平稳过渡到SOA架构提供有效保障。
当然,这一阶段培训的工作量和精力投入都是最大的。
需要提醒您的是,早期培训并不一定会带来彻底的成功。
SOA的概念对于许多IT专家来说仍然非常陌生,即便他们对其他架构研究得相当透彻,面对SOA也会显得有些不知所措。
想要理解新的规范总是很困难的。
未来主义学者Joel Barker将这种症状称作“规范效
应”。
他解释说,多数人所感知的世界都有一定的边界。
当新的理论试图对这种边界发起挑战时,人们很可能会表现出抗拒的态度,因为这些新的理论与他们原有的信仰显得格格不入。
想征服规范效应,管理层的支持和全面深入的培训必不可少。
但是,千万不能灰心。
员工完全可以通过再培训来接受这些新概念,在这方面已经有很多成功的先例。
3.学着眼高手低
最后一点,也是重要的,即在实施SOA的初期不要过于热情了。
因为这是一项长期工作。
历史证明,在IT行业中使用轰炸式的工作方法很难奏效。
小规模的渐进式发展成功的几率却高许多,因为这种变化更易于管理。
幸运的是,事实证明,渐进式的方法在实施SOA的过程中非常有效,因为这种架构允许企业一次实施一项服务。
在开始时,可以选择一些相对比较简单的功能,也就是说风险较低、但仍然比较重要的功能。
例如,从多个系统中提取和合并客户信息的功能就可以当作早期尝试的不错范例。
您可以围绕该功能开发一套服务,并为整个企业提供支持。
然后,您可以开始“脱钩”不同系统中的功能,使之不再依赖点到点的接口,而是将其重新定向至全新的共享式服务。
从小处着手可以帮助您的企业在部署重大服务前进行一些初步的测试,并且对流程加以细化。
例如,您可以将财务应用重新定向,让它们使用一个通用的接口。
另外,这种初步的测试还能监测出企业对SOA的准备情况,以及在新架构下的应变能力。