﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-菩萨说:做人要低调....-文章分类-SOA</title><link>http://www.blogjava.net/jiangmin/category/14057.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 21 Mar 2008 21:10:49 GMT</lastBuildDate><pubDate>Fri, 21 Mar 2008 21:10:49 GMT</pubDate><ttl>60</ttl><item><title>Apache Axis初级教程---安装、应用  </title><link>http://www.blogjava.net/jiangmin/articles/187596.html</link><dc:creator>JiangMin</dc:creator><author>JiangMin</author><pubDate>Thu, 20 Mar 2008 16:37:00 GMT</pubDate><guid>http://www.blogjava.net/jiangmin/articles/187596.html</guid><wfw:comment>http://www.blogjava.net/jiangmin/comments/187596.html</wfw:comment><comments>http://www.blogjava.net/jiangmin/articles/187596.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangmin/comments/commentRss/187596.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangmin/services/trackbacks/187596.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文讲述了Apache Axis的安装及简单应用，作为Apache Axis的一个入门教程。虽然现在Apache Web Service项目已经推出了Apache Axis2，Axis2相对Axis是一个很大的更新，关于Apache Axis2的介绍，请参考http://ws.apache.org/axis2，目前的版本是1.3。既然已经有了Apache Axis2这个更加优秀的Web Servi...&nbsp;&nbsp;<a href='http://www.blogjava.net/jiangmin/articles/187596.html'>阅读全文</a><img src ="http://www.blogjava.net/jiangmin/aggbug/187596.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangmin/" target="_blank">JiangMin</a> 2008-03-21 00:37 <a href="http://www.blogjava.net/jiangmin/articles/187596.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何使用Axis开发Webservice应用程序</title><link>http://www.blogjava.net/jiangmin/articles/78607.html</link><dc:creator>JiangMin</dc:creator><author>JiangMin</author><pubDate>Thu, 02 Nov 2006 02:24:00 GMT</pubDate><guid>http://www.blogjava.net/jiangmin/articles/78607.html</guid><wfw:comment>http://www.blogjava.net/jiangmin/comments/78607.html</wfw:comment><comments>http://www.blogjava.net/jiangmin/articles/78607.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangmin/comments/commentRss/78607.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangmin/services/trackbacks/78607.html</trackback:ping><description><![CDATA[　Axis是Apache的一个开源web service引擎。它目前最为成熟的开源web service引擎之一。下面我主要介绍一下如何使用该Axis开发您的web service 服务。
　　
　　1、安装 
　　以tomcat4.1为服务器，下面说明如何安装axis：
　　
　　1.解压下载后的包，将包中axis目录复制到tomcat目录下的webapps目录下；
　　
　　2.将axis/WEB-INF/lib目录下类文件复制到tomcat目录下的common/lib目录下；
　　
　　3.重新启动tomcat；
　　
　　4.访问http://localhost:8080/axis/happyaxis.jsp,如果能访问，表示安装成功；
　　
　　2、开发webservice服务
　　
　　a.编写普通类文件，如下所示：
　　//文件名：Test.java
　　import java.util.*;
　　
　　public class Test
　　{
　　//fields
　　private String name="gaga";
　　private int age=20;
　　private List items=new ArrayList();
　　
　　
　　//method at here.
　　public String getName()
　　 {
　　return name;
　　}
　　
　　public int getAge()
　　 {
　　return age;
　　}
　　
　　public List getItems()
　　 {
　　return items;
　　}
　　}
　　将本文件(Test.java)复制到Axis目录下，并将其更名为Test.jws； 
　　
　　b.访问http://localhost:8080/axis/Test.jws,Axis就会编译该文件，并将其部署到系统中，下面你就可以开发web service的客户端程序了； 
　　
　　3、开发客户端程序 
　　
　　下面是客户端程序：
　　import org.apache.axis.client.*;
　　import org.apache.axis.client.Call;
　　import org.apache.axis.client.Service;
　　
　　import javax.xml.namespace.QName;
　　
　　
　　public class TestWebService
　　{
　　
　　public static void main(String args[])
　　 {
　　
　　System.out.println("Start invoking....");
　　
　　try {
　　String endpoint =
　　"http://localhost:8080/axis/Test.jws";
　　//你写的那个文件
　　Service service = new Service();
　　Call call = (Call)
　　 service.createCall();
　　call.setTargetEndpointAddress
　　( new java.net.URL(endpoint) );
　　call.setOperationName("getAge");
　　 //填写你要调用的方法名称
　　int ret =Integer.parseInt
　　(("" + call.invoke( new Object[] {} )));
　　
　　System.out.println(ret);
　　
　　} catch (Exception e) {
　　System.err.println(e.toString());
　　}
　　System.out.println("Finished the invoking."); 
　　}
　　}
　　关于业务调用封装到服务端程序里，然后部署就可以了，就这么简单。<img src ="http://www.blogjava.net/jiangmin/aggbug/78607.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangmin/" target="_blank">JiangMin</a> 2006-11-02 10:24 <a href="http://www.blogjava.net/jiangmin/articles/78607.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实施WebService Security[WS-Security1.0]的Encrypt和Sign模式(XFire+WSS4J) </title><link>http://www.blogjava.net/jiangmin/articles/68964.html</link><dc:creator>JiangMin</dc:creator><author>JiangMin</author><pubDate>Mon, 11 Sep 2006 07:10:00 GMT</pubDate><guid>http://www.blogjava.net/jiangmin/articles/68964.html</guid><wfw:comment>http://www.blogjava.net/jiangmin/comments/68964.html</wfw:comment><comments>http://www.blogjava.net/jiangmin/articles/68964.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangmin/comments/commentRss/68964.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangmin/services/trackbacks/68964.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 鉴于很多系统需要实施WS-Security的标准，我们在SpringSide中提供了XFire+WSS4J的Demo，本文介绍SpringSide中Spring+XFire+WSS4J的基本配置[WebService Server端配置]第一，创建一个基本的BookServicepublic interface BookService {    /** *//**     * 按书名模糊查询图书 ...&nbsp;&nbsp;<a href='http://www.blogjava.net/jiangmin/articles/68964.html'>阅读全文</a><img src ="http://www.blogjava.net/jiangmin/aggbug/68964.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangmin/" target="_blank">JiangMin</a> 2006-09-11 15:10 <a href="http://www.blogjava.net/jiangmin/articles/68964.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在 WebService 中使用属性发布一个方法</title><link>http://www.blogjava.net/jiangmin/articles/68922.html</link><dc:creator>JiangMin</dc:creator><author>JiangMin</author><pubDate>Mon, 11 Sep 2006 03:17:00 GMT</pubDate><guid>http://www.blogjava.net/jiangmin/articles/68922.html</guid><wfw:comment>http://www.blogjava.net/jiangmin/comments/68922.html</wfw:comment><comments>http://www.blogjava.net/jiangmin/articles/68922.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangmin/comments/commentRss/68922.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangmin/services/trackbacks/68922.html</trackback:ping><description><![CDATA[在 WebService 中发布一个方法很简单，只要将你要发布的方法用 System.Web.Services.WebMethodAttribute 属性类来标识出就可以了，但是该属性只能应用于方法而不能应用到属性。该类的MSDN文档可以见到(C#): 
<p>　　[AttributeUsage(AttributeTargets.Method)]</p><p>　　public sealed class WebMethodAttribute : Attribute</p><p>　　那么，如果我们需要将一个属性也发布成一个Web方法，该如何做呢?在讨论这个问题之前，先来看看为什么我们需要发布属性为一个Web方法?因为有人可能会这么告诉你，你可以把你的属性改写成两个对应的getXXXXX/setXXXXX方法来分别发布成WebMethod。哦，是的，这么做看似可以达到目的，但是这样做损害了我们的接口定义，使得我们无法享受属性为我们所带来的快乐(请不要问我是什么快乐)，其实最重要的一个原因就是无法完成对接口的实现了，此话怎讲?且看下面代码(C#):</p><p>　　public interface IDataService</p><p>　　{</p><p>　　// 该属性指示当前使用的是什么数据库系统(例如:MS-SQLServer、Orcale、IBM-DB2 等等)</p><p>　　int DataProvider</p><p>　　{</p><p>　　get;</p><p>　　}</p><p>　　// 该方法执行一段指定的SQL脚本，并返回其结果集</p><p>　　System.Data.DataSet Execute(String sqlText);</p><p>　　// 该方法将指定的数据集保存到数据库中</p><p>　　void Update(System.Data.DataSet dataSet);</p><p>　　}</p><p>　　现在我们写一个 WebService 其需要实现 IDataService 接口，必须在该 WebService 中包含并发布该属性。这时我们该怎么办?呵呵，且看</p><p>　　public class DataService : System.Web.Services.WebSerbice, IDataService</p><p>　　{</p><p>　　...</p><p>　　public int DataProvider</p><p>　　{</p><p>　　[WebMethod(MessageName="GetDataProvider")]</p><p>　　get</p><p>　　{</p><p>　　...</p><p>　　}</p><p>　　}</p><p>　　[WebMethod()]</p><p>　　public System.Data.DataSet Execute(String sqlText)</p><p>　　{</p><p>　　...</p><p>　　}</p><p>　　}</p><p>　　OK，大家看到了，将一个方法发布成Web方法是在其函数体前指定 WebMethod 属性，而属性则是在其get或set器之前指定 WebMethod 属性，如果不指定属性的 MessageName 属性值，则发布的属性的Web方法名将被置为get_XXXXX和set_XXXXX。</p><p>　　在使用VS.net生成的 WebService 代理类(通过添加Web引用，Reference.cs)中的成员都是方法，因此需要手动修改代理类中的相关方法为属性，例如上例的本地代理类的相关代码看起来是这样的:</p><p>　　[System.Web.Services.Protocols.SoapDocumentMethodAttribute(... ...)]</p><p>　　[return: System.Xml.Serialization.XmlElementAttribute("GetDataProviderResult")]</p><p>　　public int GetDataProvider()</p><p>　　{</p><p>　　object[] results = this.Invoke("GetDataProvider", new object[0]);</p><p>　　return (int)results[0];</p><p>　　}</p><p>　　那么，你只需将该方法的主体部分大概改成这个样子即可:</p><p>　　public int GetDataProvider</p><p>　　{</p><p>　　[System.Web.Services.Protocols.SoapDocumentMethodAttribute(... ...)]</p><p>　　[return: System.Xml.Serialization.XmlElementAttribute("GetDataProviderResult")]</p><p>　　get</p><p>　　{</p><p>　　object[] results = this.Invoke("GetDataProvider", new object[0]);</p><p>　　return (int)results[0];</p><p>　　}</p><p>　　}</p><img src ="http://www.blogjava.net/jiangmin/aggbug/68922.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangmin/" target="_blank">JiangMin</a> 2006-09-11 11:17 <a href="http://www.blogjava.net/jiangmin/articles/68922.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>测试服务 :SOA的完整性和扩展性</title><link>http://www.blogjava.net/jiangmin/articles/68914.html</link><dc:creator>JiangMin</dc:creator><author>JiangMin</author><pubDate>Mon, 11 Sep 2006 02:58:00 GMT</pubDate><guid>http://www.blogjava.net/jiangmin/articles/68914.html</guid><wfw:comment>http://www.blogjava.net/jiangmin/comments/68914.html</wfw:comment><comments>http://www.blogjava.net/jiangmin/articles/68914.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangmin/comments/commentRss/68914.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangmin/services/trackbacks/68914.html</trackback:ping><description><![CDATA[随着开发软件往可复用服务的迁移，很多软件开发生命周期中的范式被开发了出来。正如面向对象要求一个特别的概念集合来达到有效的开发，面向对象架构也带来了它共享的具体途径。在接下来的段落中，我们将会我们将会探索开发服务的许多重要方面中的一个:测试。
<p>　　依赖于你们组织中的软件管理类型，测试可以通常作为一个全局过程或者最高优先权的过程。以前的方法，在代码行之间用敏捷开发技巧，强迫把测试推迟到服务被完全实现以后才进行测试，而随后的服务就会采用这个还没有经过测试的服务，并且不等到你使之成为一个“准备好”的服务。</p><p>　　当有支持者确认了一个调查，在开始就 进行测试并且采用敏捷原则比直到最后的开发阶段才测试更有好处，我们暂且不管这些，我们先把关于何时把测试引入到你具体的工程中去的讨论搁置一边，让我们关注一下如何进行测试。</p><p>　　测试决不是一个简单的东西，有很多不同的测试类型可以应用在软件上。依据测试的复杂性和领域 ，即使专业的团队——QA团队——可以被雇来完成特定的任务，但是是为了特定的目定，我们将会关注两种类型的测试，他们都相对容易的开发:单元测试和压力测试。</p><p>　　单元测试是指通过预先定义的一些列数据集合来验证一个服务的既定目的的过程，这个数据集合是用来模拟显示世界的用法从而能够及时的方式来探测到缺陷。当为你的服务进行单元测试的时候， 在服务被发布为正是的产品以前你可以把他们看成安全保护网，因为你能够在实际数据流在这个系统运行之前使用这些预先的数据集合来测试你的服务的逻辑。</p><p>　　另外一个单元测试为你的开发带来的那些好处在当你的系统开始用上了一段时间之后就会更加突出了。因为演化的服务意味着底层逻辑的修改，这些修改可能会破坏服务本来被希望忙足的一些具体的使用设定。尽管如此，通过现有的单元测试套件，并且保证一直保持同这些测试的一致，保护任何使用你服务的依赖部分免受在以后可能新的修订中带来的任何破坏</p><p>　　实际的单元测试的进行很大程度上依赖于编程语言或者你使用来部署你的服务的平台，但是更加可能的情况是为了能更容易的进行测试的步步为营，确认和部署，将会通过一个特定的框架来完成这些 ——换一句话说就是， 自动化的进行所有的能够使得单元测试成为必需的过程。</p><p>　　在所有的最流行的单元测试的框架中有:Java的JUnit 和.NET的Unit Testing Framework ，Unit Testing Framework 构成了Visual Studio的一部分。对于深度的解释他们的框架或者其他的一些单元测试套件将不会在本文中讨论，但是列表1.1展示的就是一个Java支持的服务的Junit测试是怎样的。</p><p>　　列表1.1 对Java类构成的Web Services的Junit单元测试</p><p><font style="BACKGROUND-COLOR: #dddddd" face="Verdana" color="#000000">import junit.framework.*;<br />public class PayrollTest extends TestCase { <br />    private Payroll basePayroll;<br />    private Employee accountingE;<br />    public PayrollTest(String type) {<br />        super(type);<br />    }<br />   protected void setUp() {<br /> // Initialize Payroll object<br />        basePayroll = new Payroll();<br />  // Generate employee, assign to payroll<br />        accountingE = new Employee("John Smith", 5743.00);<br />        basePayroll.addEmployee(accountingE);<br />    }<br />    protected void tearDown() {<br /> // Reinitialize Payroll object<br />        basePayroll = null;<br />    }<br />    public void testAddEmployee() {<br />        Employee contractE = new Employee("Auditor", 2843.00);<br />        basePayroll.addEmployee(contractE);<br />         double totalPayroll = accountingE.getSalary() + contractE.getSalary();<br />        assertEquals(totalPayroll, basePayroll.getTotal(), 0.0);<br />         assertEquals(2, basePayroll.countEmployees());<br />    }<br />    public void testEmptyPayroll() {<br />        basePayroll.emptyPayroll();    <br />        assertTrue(basePayroll.emptyPayroll());<br />    }<br />       public void testEliminateEmployee() throws EmployeeNotFound {<br />        basePayroll.eliminateEmployee(accountingE);<br />        assertEquals(0, basePayroll.countEmployees());<br />        assertEquals(0.0, basePayroll.getTotal(), 0.0);<br />    }<br />     public static Test suite() {<br />        TestSuite suite = new TestSuite(PayrollTest.class);<br /> return suite;<br />     }<br />    public static void main(String args[]) {<br />        junit.textui.TestRunner.run(suite());<br />    }<br /> }</font></p><p>　　这个测试列表表示的是对两个将会用来构成决定薪水册的数据的Web service进行测试的一个例子。请注意Payroll和Employee类的实例是如何创建的，它们都会被后面的testXXX()命名的方法来操纵。一旦被这些方法操作，请注意看到是通过不同的以assertXXX()命名的Junit方法来调用的。</p><p>　　用来调用预先定义的数据块的不同的断言方法的参数在底层的服务类之间传递，在这些类上进行同所期望的值进行比对，这个比对是在当测试框架给出一个错误或者返回一个正确的执行的时候进行。</p><p>　　单元测试是用来验证一个服务逻辑的完整性，重点测试是用来决定一个服务在一个特定的用户附载的时候应该具有什么样的行为，它是一个可以帮助决定对一个服务的基础架构的适当支持的过程，这些基础架构包括如硬件能力，应用程序配置和可以获得的网络带宽，以及其他的东西。</p><p>　　一个可以帮助你进行压力测试的工具是JMeter ，它是一个由Apache组织开发的一个开源项目。尽管Jmeter是基于java的，它可以产生SOAP和XMLRPC类型的请求，有效地发挥一个Web services客户端的功能，来压力测试任何服务端的部署。图1.1展示的是一个使用这个工具进行的在SOAP/XML-RPC服务上的附载测试。</p><p><img src="http://searchwebservices.techtarget.com.cn/imagelist/06/03/2jp7e6i982q6.jpg" border="0" /></p><p>　　图1.1:Jmeter对Web services的压力测试</p><p>　　在Jmeter中创建上述的压力测试的过程如下:</p><p>　　1. 在Jmeter的主界面，将你的鼠标移动到Test Plan按钮上并点击右键。从弹出的菜单中选择:Add – Thread Group。Thread Group按钮将会被创建。</p><p>　　2.定位在Thread Group按钮上左边的窗体中将会显示不同的参数。参数Number of threads 表示的是你的压力测试将会对你的服务仿效的请求的数。</p><p>　　3.下一步，当鼠标在Thread Group按钮上点击右键，从弹出的菜单中选择:Add – Sampler – SOAP/XML-RPC Request。SOAP/XML-RPC请求按钮将会被创建。</p><p>　　4.鼠标定位在SOAP/XML-RPC请求按钮，左边的窗体中将会显示不同的参数。有关于你的Web service的URL的介绍，以及你希望发出的每一个请求的载荷。</p><p>　　5.当鼠标在SOAP/XML-RPC请求按钮上时，点击右键，从弹出的菜单中选择:Add – Listener – Monitor Results，和Add – Listener – View Results。两个显示压力测试结果的按钮将会生成。注意:如果需要，你可以添加更多的监听者，这是Jmeter进行压力测试结果的表示术语。</p><p>　　6.保存你的测试，并从最高层的菜单中选择Run-Start选项开始你的压力测试。</p><p>　　7.最后移动你的鼠标到每一个不同的Listener按钮上， 观察你在对你的Web service进行压力测试时获得的性能参数。</p><p>　　和单元测试框架相类似的本质，解释Jmeter的许多复杂——或者任何其他压力测试工具的这方面的问题——将会超出本文的范围，但是Jmeter提供了全面可理解的并可自由获取的文档来解释不同的压力测试功能。</p><p>　　我们总结我们对在Web services环境下单元测试和压力测试的认识，这是在很多的测试过程中你可以在你的面向服务设计中的两个方法，从而能够确保你的部署的完整性和可测量性</p><img src ="http://www.blogjava.net/jiangmin/aggbug/68914.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangmin/" target="_blank">JiangMin</a> 2006-09-11 10:58 <a href="http://www.blogjava.net/jiangmin/articles/68914.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>本文译自Thomas Erl的《Service-Oriented Architecture: Concepts, Technology and Design》部分章节。</title><link>http://www.blogjava.net/jiangmin/articles/68906.html</link><dc:creator>JiangMin</dc:creator><author>JiangMin</author><pubDate>Mon, 11 Sep 2006 02:46:00 GMT</pubDate><guid>http://www.blogjava.net/jiangmin/articles/68906.html</guid><wfw:comment>http://www.blogjava.net/jiangmin/comments/68906.html</wfw:comment><comments>http://www.blogjava.net/jiangmin/articles/68906.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangmin/comments/commentRss/68906.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangmin/services/trackbacks/68906.html</trackback:ping><description><![CDATA[
		<div>
				<font size="3">本文译自Thomas Erl的《Service-Oriented Architecture: Concepts, Technology and Design》部分章节。</font>
		</div>
		<div>
				<font size="3">
				</font> </div>
		<div>
				<font size="3">注意本节的标题是“面向服务和面向对象”，而不是“面向服务对面向对象”。这种区别是要强调这两种思想之间的关系不是竞争关系这一事实。</font>
		</div>
		<div>
				<font size="3">
				</font> </div>
		<div>
				<font size="3">事实上，面向对象编程通常用于构建Web Services中应用逻辑的封装。然而，面向对象编程方法到底与面向服务方法有何根本的不同是值得去探索的，理解它们的不同有助于你将它们放在一起工作。</font>
		</div>
		<div>
				<font size="3">
				</font> </div>
		<div>
				<font size="3">下面列出两种方法在设计方面的比较。（尽管使用“逻辑处理单元”术语在比较服务和对象会引起的混淆，然而面向服务是基于服务来设计，面向对象是以对象创建为中心。）</font>
		</div>
		<div>
				<font size="3">
				</font> </div>
		<ul>
				<li>
						<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">
								<font size="3">
										<span>
												<span style="FONT: 7pt 'Times New Roman'">         </span>
										</span>面向服务强调逻辑处理单元（服务）之间的松耦合。虽然面向对象支持可重用、松耦合的编程程序，但它主要基于预定义的依赖类，产生和逻辑处理单元（对象）的紧耦合。</font>
						</div>
				</li>
		</ul>
		<div>
				<font size="3">
				</font> </div>
		<ul>
				<li>
						<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">
								<font size="3">
										<span>
												<span style="FONT: 7pt 'Times New Roman'">        </span>
										</span>面向服务鼓励粗粒度接口（服务描述），因此每个通讯单元（消息）都包含完成给定任务所需的尽可能多的信息。面向对象编程完全支持细粒度接口（APIs），因此通讯单元（RPC或本地API调用）能执行各种大小的任务。</font>
						</div>
				</li>
		</ul>
		<div>
				<font size="3">
				</font> </div>
		<ul>
				<li>
						<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">
								<font size="3">
										<span>
												<span style="FONT: 7pt 'Times New Roman'">         </span>
										</span>面向服务期望逻辑处理单元（服务）的范围可以较大。面向对象中的逻辑处理单元（对象）趋向于在一定范围内更小和更加明确。</font>
						</div>
				</li>
		</ul>
		<div>
				<font size="3">
				</font> </div>
		<ul>
				<li>
						<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">
								<font size="3">
										<span>
												<span style="FONT: 7pt 'Times New Roman'">         </span>
										</span>面向服务促进逻辑处理单元（服务）未知行为的创建，那是由智能通讯单元（消息）所引起的行为。面向对象鼓励逻辑处理和数据的绑定，产生非常智能的单元（对象）。</font>
						</div>
				</li>
		</ul>
		<div>
				<font size="3">
				</font> </div>
		<ul>
				<li>
						<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">
								<font size="3">
										<span>
												<span style="FONT: 7pt 'Times New Roman'">         </span>
										</span>面向服务更多采用逻辑处理单元（服务）进行设计并进可能保持无状态。面向对象鼓励数据和逻辑的绑定，因此产生有状态单元（对象）。（然而，近来更多的基于组件的设计方法背离了这种趋势）</font>
						</div>
				</li>
		</ul>
		<div>
				<font size="3">
				</font> </div>
		<ul>
				<li>
						<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt">
								<font size="3">
										<span>
												<span style="FONT: 7pt 'Times New Roman'">         </span>
										</span>面向服务支持逻辑处理单元（服务）的松耦合组合。面向对象也支持组合但趋向于继承自逻辑处理单元（对象），那会导致依赖紧耦合。</font>
						</div>
				</li>
		</ul>
		<div>
				<font size="3">
				</font> </div>
		<div>
				<font size="3">上面从耦合度、接口粒度、关注点、状态等方面对面向服务和面向对象进行了比较。下面再对两种方法的设计原则进行比较。</font>
		</div>
		<div>
				<font size="3">
				</font> </div>
		<p>
				<span style="FONT-SIZE: 10.5pt">当然，面向服务还欠缺很多面向对象已有的概念和理论。下表提供了一般的面向对象原则与已经讨论过的面向服务的原则的比较。</span> </p>
		<p> </p>
		<p>
		</p>
		<table class="MsoTableGrid" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellspacing="0" cellpadding="0" border="1">
				<tbody>
						<tr style="mso-yfti-irow: 0">
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 104.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt" valign="top" width="139">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<strong style="mso-bidi-font-weight: normal">
														<font size="3">
																<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">面向服务原则</span>
																<span lang="EN-US">
																		<?XML:NAMESPACE PREFIX = O /?>
																		<o:p>
																		</o:p>
																</span>
														</font>
												</strong>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 321.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" valign="top" width="429">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<strong style="mso-bidi-font-weight: normal">
														<font size="3">
																<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">面向对象原则</span>
																<span lang="EN-US">
																		<o:p>
																		</o:p>
																</span>
														</font>
												</strong>
										</p>
								</td>
						</tr>
						<tr style="mso-yfti-irow: 1">
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 104.4pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="139">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务的重用</span>
														<span lang="EN-US">
																<o:p>
																</o:p>
														</span>
												</font>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 321.7pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="429">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">面向对象大多数情况是创建可重用的类，模块化分解的面向对象原则是应用程序的设计方式。</span>
														<span lang="EN-US">
																<o:p>
																</o:p>
														</span>
												</font>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US">
														<o:p>
																<font face="Times New Roman" size="3"> </font>
														</o:p>
												</span>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">相关的原则，如抽象，封装，接口和实现逻辑的分离。服务重用是这个目标的延续。</span>
														<span lang="EN-US">
																<o:p>
																</o:p>
														</span>
												</font>
										</p>
								</td>
						</tr>
						<tr style="mso-yfti-irow: 2">
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 104.4pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="139">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务的契约</span>
														<span lang="EN-US">
																<o:p>
																</o:p>
														</span>
												</font>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 321.7pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="429">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务契约的需求和构建面向对象应用中的接口相类似。接口提供了一种提炼类描述的方法，这和</span>
														<span lang="EN-US">
																<font face="Times New Roman">WSDL </font>
														</span>
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的定义非常相似。与</span>
														<span lang="EN-US">
																<font face="Times New Roman">SOA</font>
														</span>
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">鼓励的“</span>
														<span lang="EN-US">
																<font face="Times New Roman">WSDL</font>
														</span>
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">优先”方法一样，“接口优先”方法也被认为是面向对象的最佳实践。</span>
														<span lang="EN-US">
																<o:p>
																</o:p>
														</span>
												</font>
										</p>
								</td>
						</tr>
						<tr style="mso-yfti-irow: 3">
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 104.4pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="139">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务的松耦合</span>
														<span lang="EN-US">
																<o:p>
																</o:p>
														</span>
												</font>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 321.7pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="429">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">尽管接口的创建一定程度上将类从类的使用者解耦，但耦合是面向服务从面向对象继承到的主要特性。</span>
														<span lang="EN-US">
																<o:p>
																</o:p>
														</span>
												</font>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US">
														<o:p>
																<font face="Times New Roman" size="3"> </font>
														</o:p>
												</span>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">相对面向服务设计方法，继承和其他面向对象原则造成逻辑处理单元之间的紧耦合。</span>
														<span lang="EN-US">
																<o:p>
																</o:p>
														</span>
												</font>
										</p>
								</td>
						</tr>
						<tr style="mso-yfti-irow: 4">
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 104.4pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="139">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务的抽象</span>
														<span lang="EN-US">
																<o:p>
																</o:p>
														</span>
												</font>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 321.7pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="429">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">面向对象的抽象原则要求一个类提供一个接口给外部世界，并通过这个接口来访问类。封装通过建立信息隐藏概念来支持这种方式，通过接口暴露的类内部的任何逻辑都不能被外部所访问。</span>
														<span lang="EN-US">
																<o:p>
																</o:p>
														</span>
												</font>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US">
														<o:p>
																<font face="Times New Roman" size="3"> </font>
														</o:p>
												</span>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务抽象可以基本达到对象抽象和封装的程度。它的目标是隐藏服务的内部细节，因此只有服务契约是可以得到的，服务的请求者也只要关心服务契约。</span>
														<span lang="EN-US">
																<o:p>
																</o:p>
														</span>
												</font>
										</p>
								</td>
						</tr>
						<tr style="mso-yfti-irow: 5">
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 104.4pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="139">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务的组合</span>
														<span lang="EN-US">
																<o:p>
																</o:p>
														</span>
												</font>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 321.7pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="429">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">面向对象支持关联的概念，如聚合和组合。在松耦合的上下文中，这些概念也被面向服务的方法支持。</span>
														<span lang="EN-US">
																<o:p>
																</o:p>
														</span>
												</font>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US">
														<o:p>
																<font face="Times New Roman" size="3"> </font>
														</o:p>
												</span>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例如，可用与组合成对象层次结构相同的方法来将可组合的服务装配成服务层次结构。</span>
														<span lang="EN-US">
																<o:p>
																</o:p>
														</span>
												</font>
										</p>
								</td>
						</tr>
						<tr style="mso-yfti-irow: 6">
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 104.4pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="139">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务的自治　</span>
														<span lang="EN-US">
																<o:p>
																</o:p>
														</span>
												</font>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 321.7pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="429">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自治的特性在面向服务设计中比在面向对象方法中有更重要的作用。在面向服务中，通过利用服务间的松耦合关系，可以实现逻辑处理单元之间的独立性。</span>
														<span lang="EN-US">
																<o:p>
																</o:p>
														</span>
												</font>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US">
														<o:p>
																<font face="Times New Roman" size="3"> </font>
														</o:p>
												</span>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在面向对象设计中，跨对象引用和继承相关的依赖支持较低程度的对象级自治。</span>
														<span lang="EN-US">
																<o:p>
																</o:p>
														</span>
												</font>
										</p>
								</td>
						</tr>
						<tr style="mso-yfti-irow: 7">
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 104.4pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="139">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务的无状态</span>
														<span lang="EN-US">
																<o:p>
																</o:p>
														</span>
												</font>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 321.7pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="429">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">由类结合和数据构成的对象天生就是有状态的。服务中提倡的无状态趋向于背离典型的面向对象设计。</span>
														<span lang="EN-US">
																<o:p>
																</o:p>
														</span>
												</font>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US">
														<o:p>
																<font face="Times New Roman" size="3"> </font>
														</o:p>
												</span>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">尽管可以创建有状态服务和无状态对象，但无状态原则是面向服务中通常更加强调的。</span>
														<span lang="EN-US">
																<o:p>
																</o:p>
														</span>
												</font>
										</p>
								</td>
						</tr>
						<tr style="mso-yfti-irow: 8; mso-yfti-lastrow: yes">
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 104.4pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="139">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<font size="3">
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务的发现</span>
														<span lang="EN-US">
																<o:p>
																</o:p>
														</span>
												</font>
										</p>
								</td>
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #d4d0c8; PADDING-BOTTOM: 0cm; WIDTH: 321.7pt; BORDER-TOP-COLOR: #d4d0c8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="429">
										<p class="doctext" style="MARGIN: auto 0cm">
												<span style="FONT-SIZE: 10.5pt">
														<font face="宋体">设计一致的和自描述的类接口是另一个面向对象最佳实践，它能改进识别和区别逻辑处理单元方法。这些特性也允许类被更容易地发现。<span lang="EN-US"><o:p></o:p></span></font>
												</span>
										</p>
										<p class="doctext" style="MARGIN: auto 0cm">
												<span style="FONT-SIZE: 10.5pt">
														<font face="宋体">可发现性是面向服务范例中强调的另一个原则。它鼓励服务契约的交互支持在设计和运行时的可发现性。</font>
												</span>
												<span lang="EN-US">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p> </p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
						<font size="3">可以看到，面向对象和面向服务并非竞争者。面向服务显然在不少方面是以面向对象为基础，当前典型的面向服务的解决方案将由服务（遵循面向服务的原则）和面向对象的组件构成。在合理的设计中，每个原则都能被适当地处理并能相互补充。</font>
				</span>
		</p>
<img src ="http://www.blogjava.net/jiangmin/aggbug/68906.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangmin/" target="_blank">JiangMin</a> 2006-09-11 10:46 <a href="http://www.blogjava.net/jiangmin/articles/68906.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SOA的几个关键特性</title><link>http://www.blogjava.net/jiangmin/articles/68905.html</link><dc:creator>JiangMin</dc:creator><author>JiangMin</author><pubDate>Mon, 11 Sep 2006 02:44:00 GMT</pubDate><guid>http://www.blogjava.net/jiangmin/articles/68905.html</guid><wfw:comment>http://www.blogjava.net/jiangmin/comments/68905.html</wfw:comment><comments>http://www.blogjava.net/jiangmin/articles/68905.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangmin/comments/commentRss/68905.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangmin/services/trackbacks/68905.html</trackback:ping><description><![CDATA[
		<p>SOA的几个关键特性：一种粗粒度、松耦合服务架构，服务之间通过简单、精确定义接口进行通讯，不涉及底层编程接口和通讯模型。</p>
		<p>1  可从企业外部访问 B2B协议</p>
		<p>2  随时可用</p>
		<p>3  粗粒度服务接口</p>
		<p>4 分级，粗粒度的服务比细粒度的服务重用性差，所以要采用不同的粒度等级来创建服务。</p>
		<p> 在服务分级方面，须注意服务层的公开服务通常由后台系统（BES's）或SOA平台中现有的本地服务组成。因此允许在服务层创建私有服务是非常重要的。</p>
		<p>5  松散耦合</p>
		<p> 服务接口作为与服务实现分离的实体而存在。大多数松散耦合方法都依靠基于服务接口的消息。基于消息的接口能够兼容多种传输方式（如HTTP、JMS、TCP/IP、MOM等）。基于消息的接口可以采用同步和异步协议实现。</p>
		<p> 当客户调用消息类Web服务时，客户通常会发送的是一个完整的文档（如采购订单），而非一组离散的参数。</p>
		<p>6  可重用的服务及服务接口设计管理</p>
		<p>7  标准化的接口</p>
		<p> Web服务使应用功能得以通过标准化接口（WSDL）提供，并可基于标准化传输方式（HTTP和JMS）、采用标准化协议（SOAP）进行调用。</p>
		<p>8  支持各种消息模式</p>
		<p> 无状态的消息、有状态的消息、等幂消息</p>
		<p>9  精确定义的服务接口</p>
		<p> 总之，SOA可以看作是B/S模型、XML/Web Service技术之后的自然延伸。SOA将能够帮助我们站在一个新的高度理解企业级架构中的各种组件的开发、部署形式，</p>
		<p>它将帮助企业系统架构者以更迅速、更可靠、更具重用性架构整个业务系统。较之以往，以SOA架构的系统能够更加从容地面对业务的急剧变化。<br /></p>
<img src ="http://www.blogjava.net/jiangmin/aggbug/68905.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangmin/" target="_blank">JiangMin</a> 2006-09-11 10:44 <a href="http://www.blogjava.net/jiangmin/articles/68905.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>