《分布式Java应用之基础与实践》读书笔记三

对于大型分布式Java应用与SOA,我们可以从以下几个方面来分析:

  • 为什么需要SOA
  • SOA是什么
  • eBay的SOA平台
  • 可实现SOA的方法

为什么需要SOA

??第一个现象是系统多元化带来的问题,可采用对共用逻辑的部分进行抽象的方法,形成多个按领域划分的公用业务逻辑系统;第二个现象是系统访问量、数据量上涨后带来的典型问题,可采用拆分系统的方式来解决。在构建了共用业务逻辑系统和拆分系统后,最明显的问题就是系统之间如何交互。为了整个系统的性能、可用性等考虑,统一的交互方式就成为明显的解决方案了,SOA是这种方式的首选。

SOA是什么

??SOA全称是面向服务架构,它强调系统之间以标准的服务方式进行交互,各系统可采用不同的语言、不同的框架来实现、交互则全部通过服务的方式进行。eBay实现了一个SOA平台来支撑其业务的多元化发展,eBay认为SOA最大的好处是提升了业务的可重用性及灵敏度。但是,SOA平台同样会带来很多挑战,比如:

  • 服务多级调用带来的延时:高性能的服务交互、完善的服务调用过程控制
  • 调试/跟踪困难:
  • 更高的安全/检测的要求:拆分后的每个系统都要相应的安全控制与监测
  • 现有应用移植:
  • Qos的支持:每个服务提供者能够支撑的访问量有限,采用流量控制、机器资源分配等
  • 高可用和高度可伸缩
  • 多版本和依赖管理

eBay的SOA平台

eBay根据这些挑战自行实现了一个SOA平台,这个SOA平台包括以下几点:

  • 高性能、可扩展的轻量级框架
  • 对监测、安全控制、流量控制的支持
  • 服务注册和服务仓库
  • 开发工具

对于一个大型应用中的SOA平台,至少应包含以下几点功能:

  • 统一的服务交互方式,并可实现和现有应用的无缝集成
  • 提供调试/跟踪的支持
  • 依赖管理
  • 高性能与高可用

可实现SOA的方法

基于SCA实现SOA平台

??SCA的全称是Service Component Architecture,是实际上的SOA实现方法指导。首先,我们看看SCA标准是如何定义服务的交互的,包括了如何发布服务、如何调用服务以及支持的通信协议和交互方式三个方面。

发布服务

??服务遵循SOA以接口方式对外提供,发布服务首先要求系统本身已经有相应的接口实现。为了减少对系统实现的侵入,通过XML定义Component映射到系统本身的接口实现上,在定义了Component后,即可将Component实现的接口以服务的方式发布。用来发布服务的XML示例文件如下:

<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" targetNamespace="http://foo.com" name="HelloWorldComposite">
    <component name="HelloWorldComponent">
        <implementation.java class="DefaultHelloWorld"/>
    </component>
    <service name="HelloWorldService" promote="HelloWorldComponent">
        <interface.java interface="HelloWorld"/>
    </service>
</composite>

这些标签的主要关系如下图所示:

component标签主要通过implementation子标签定义和已有系统的集成,SCA提供了对多种实现集成的支持。service子标签用于表明当前component对外提供了什么service,reference子标签用于表明当前component引用了什么service。

调用服务

??调用服务的方式同样可通过简单地定义xml即可实现。用来调用服务的XML示例代码如下:

<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" targetNamespace="http://foo.com" name="HelloWorldComposite">
    <component name="HelloWorldComponent">
        <implementation.spring location="beans.xml"/>
        <reference name="HelloWorldService" target="HelloWorldService"/>
    </component>
    <reference name="HelloWorldService" promote="HelloWorldComponent">
        <interface.java interface="HelloWorld"/>
    </reference>
</composite>
// Spring的beans.xml定义如下
<beans>
    <sca:reference name="HelloWorldService" type="HelloWorld"/>
</beans>
支持的通信和交互方式

??SCA标准默认提供的通信方式为SCA、WebService和JMS三种。SCA是指由框架根据运行状况来选择采用相应的通信方式,例如,根据服务端和客户端是否在同一个JVM上,来切换本地调用或者WebService和JMS方式等。WebService的实现为HTTP方式;JMS则可采用多种方式来实现,例如TCP/IP、HTTP等。

??SCA可以在不侵入系统的情况下以多种方式发布和调用服务,并将其注入新需要引用服务的系统中,而且,这些系统同样可以以Java、Spring或C++等多种方式实现。从标准来看,在统一的服务交互方式上,SCA提供了清晰的发布服务、调用服务及无缝和现有应用集成的支持。在调试/跟踪的支持上SCA标准并没有明确的定义,只能自行实现;依赖管理方面也同样没有明确的定义,而且没有定义服务仓库,这给依赖管理的实现带来更大的困难。

基于ESB实现SOA平台

??ESB和SCA不同,它并不是由多个厂家联合制定的SOA实现的标准,可以认为ESB只是个概念,核心思想是基于消息中间件来实现系统间的交互。基于消息中间件所构建的此系统交互的中间场所称为总线,系统间交互的数据格式采用统一的消息格式,由总线完成消息的转化、路由、发送到相应的目标应用,基于ESB构建的系统结构如图所示:

通常ESB框架须具备一下5个要素

  • 标准的消息通信格式
  • 消息路由:总线接受消息后,根据消息数据决定需要调用的系统
  • 支持多种的消息交互类型:请求/响应和发布/订阅等方式
  • 支持多种网络协议
  • 支持多种数据格式并能够进行相互转换

??在统一以服务方式进行交互这点上,可以认为ESB中的消息方式交互承担了这一功能,且支持多种通信及交互(同步、异步)方式,在调试/跟踪支持上没有定义,在依赖管理上,由于所有的交互都通过总线来进行,在此基础上可根据消息的流转来判断和形成各个系统的依赖关系。

基于Tuscany实现SOA平台

??在SCA实现框架中,本书选择了Tuscany1.5来分析,这是目前最常用的SCA实现框架之一,下面以一个基于Tuny实现发布服务和调用服务的例子。通过提供一个HelloWorld接口的实现,配置为Spring Bean,并给予Tuscany将其发布为WebService方式的SCA Service。代码如下:

// HelloWorld接口定义
@Remotable
public interface HelloWorld {
    public String sayHello(String name);
}
// HelloWorld接口实现
public class DefaultHelloWorld implements HelloWorld {
    public String sayHello(String name) {
        return "Server response: Hello " + name;
    }
}
// Spring Bean xml的配置如下
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sca="http://www.springframework.org/schema/sca" xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/sca http://www.osoa.org/xmlns/sca/1.0/spring-sca.xsd">
    <sca:service name="HelloWorldService" type="HelloWorld" target="HelloWorldServiceBean"/>
    <bean id="HelloWorldServiceBean" class="DefaultHelloWorld">
    </bean>
</beans>
// 将以上文件保存至resources/spring目录下,命名为beans.xml

// 基于Tuscany将其发布为WebService的配置如下:
<composite name="HelloWorld" targetNamespace="http://tuscany.apache.org/xmlns/sca/1.0" xmlns="http://www.osoa.org/xmlns/sca/1.0" xmlns:nsl="http://www.osoa.org/xmlns/sca/1.0">
    <service name="HelloWorldService" promote="HelloWorldComponent">
        <interface.java interface="HelloWorld"/>
        <binding.ws uri="http://localhost:8080/services/HelloWorldService"/>
    </service>
    <component name="HelloWorldComponent">
        <implementation.spring.location="resoureces/spring/beans.xml"/>
    </component>
</composite>
// 将以上文件保存至src目录下,命名为publishservice.composite

// 编写一个启动类来完成服务的发布
public static void main(String[] args) throws Exception {
    SCADomain.newInstance("publishservice.composite");
    while(true) {
        Thread.sleep(100000);
    }
}

至此,基于Tuscany的服务发布功能已经完成,关于如何调用服务的代码就不给出了。

??在启动了发布SCA Service的代码后,再启动调用SCA Service的代码,即可在console上看到相应的执行信息,基于以上步骤,很容易在Spring中以WebService的方式发布和调用SCA Servie。以下介绍基于Tuscany如何实现SOA平台。首先还是从统一服务的交互这点分别来看发布服务、调用服务和支持的网络协议及交互方式。

  • 发布服务:在SCA标准的基础上支持更多种实现方式的系统中的功能发布为SCA Service
  • 调用服务:在SCA标准的基础上支持更多种应用集成及调用方式,包括更多语言支持
  • 支持的通信以及交互方式:在SCA标准的基础上支持更多种通信方式

在调试/跟踪方面,当服务器端抛出异常时,会将此异常信息带回到调用端,对于查错而言有一定的帮助;在依赖管理方面、高性能和高可用性方面等,Tuscany没有做专门的处理。

基于Mule实现SOA平台

??Mule是最常用的ESB实现框架之一,首先看看基于Mule如何来实现同样的例示功能。其实,Mule也是通过WebService的方式对外提供HelloWorldService,和Tuscany中不同的地方仅在于配置文件和启动代码两个方面,配置文件中去掉publishservice.composite,改为遵循Mule编写如下配置文件:

<mule>
    <spring:beans>
        <spring:import resource="resources/spring/mulepublisherbeans.xml"/>
    </spring:beans>
    <model name="HelloWorld">
        <service name="HelloWorldService">
            <inbound>
                <axis:inbound-endpoint address="http://localhost:12345/services">
                <soap:http-to-soap-request-transformer/>
                </axis:inbound-endpoint>
            </inbound>
            <component>
                <spring-object bean="HelloWorldBean"/>
            <component>
        </service>
    </model>
</mule>
// 将上面文件保存为publishservice.xml

// 发布服务的启动代码遵循Mule改为如下方式
MuleContext muleContext = new DefaultMuleContextFactory().createMuleContext("publishservice.xml");
muleContext.start();

至此,基于Mule的服务发布功能已经完成,关于如何调用服务的代码也不给出了。

??执行以上代码就实现了以Mule Service的方式调用远端通过Mule Service发布为WebService的功能。我们还是以Mule如何实现SOA平台,看看Mule如何实现服务方式的统一交互。

  • 发布服务:Mule支持以WebService、jms等方式将Spring或普通Java对象昂发布为Mule Service
  • 调用服务:Mule用法较麻烦,原因是ESB强调一切以消息的方式发送给总线
  • 支持的通信和交互方式:支持WebService和jms两种,支持同步和异步方式

在调试/跟踪上,Mule未提供特别的支持;在依赖管理上,Mule所在的MuleSoft提供了一个开源的服务治理框架:MuleGalaxy;在高性能和高可用性上,Mule未优化。

小结

??SCA标准及SCA标准实现的框架对于服务的统一交互支持得很好,ESB及ESB框架则更适用于需要解耦方式的服务交互及复杂的多服务交互的场景,但无论是基于SCA标准、ESB、还是已有的SCA框架和ESB框架,在实现一个大型应用的SOA平台时都还有不少需要自行扩展实现的地方,尤其是在调试/跟踪、依赖管理、高性能及高可用性方面。对于大型应用的服务化,SOA平台是一方面,如何推广实行也是一个重要因素,eBay提及的现有应用移植及培训开发人员是在推广实行时徐亚仔细考虑的。

??以上提及的一个基本的大型应用的SOA平台的特征,而对于一个更加完善的SOA平台,作者认为还需要具备以下几点:

  • 支撑集群环境:软件负载均衡、服务接口或方法级的路由策略等
  • 完善的服务治理:包括依赖管理、状况监测、安全控制等
  • 服务SoS(Quality of Service)的支持
时间: 2024-08-04 12:54:53

《分布式Java应用之基础与实践》读书笔记三的相关文章

软件需求十步走读书笔记2

今天读完了软件需求十步走的第二部分.读了知识篇和方法篇.在知识篇中知识体系的构建方法 事物的知识是由知的知识和识的知识构成.识的知识是以知的知识为核心的需求工程的知识构成 需求工程的知识体系是由基础知识体系.专用知识体系.特有知识体系三个部分构成需求工程的基础知识 形式逻辑中演绎.推理.假设.论证等方法对于解决软件需求中“不完整.不准确.总在变.不一致”问题具有帮助需求工程的专有知识.需求工程的专有知识包括软件工程.软件体系架构和信息资源规划需求工程的特有知识 需求规划是新一代软件需求工程有别于

软件需求十步走读书笔记1

今天开始读软件需求十步走这个本书,这本书把软件的需求调研分为十步,两个阶段.书中主要的几个问题:难点问题.性能问题.范畴问题.鸿沟问题.关系问题.观念问题.地位问题.主要针对这几个常见易出的问题,作者做出解释和分析以及面对这些问题应该如何去做,从中交给我们解决问题的道理. 需求规划是新一代需求工程中的最大亮点,它的工作是将业务.对象和信息化体系作为研究对象,采用科学研究.体系架构设计.信息资源规划的方法,编制出具有系统性.科学性.前瞻性的需求规划成果.需求规划的成果中包括形势分析.业务体系分析.

《软件需求十步走》读书笔记三

近期读了<软件需求十步走>最后的部分,分别是管理篇.组织篇. 管理篇 1.需求管理的思路 :需求工程的需求业务活动由需求规划中的6个业务活动和需求开发的4个业务活动共计10项业务活动组成,构成了需求工程的业务主线.需求工程的需求管理活动的目标就是确保需求业务活动能够按进度要求.质量要求.成本要求生产出高质量的软件需求. 2.需求版本控制 :软件需求基线是由各阶段需求业务活动的工作成果文档和文档内各部分内容的版本号的集成.软件需求基线工作的落实借助这些工作成果文档和文档内部分内容版本号来实现的.

《软件需求十步走》读书笔记二

这次都<软件需求十步走>的后三篇,分别为“方法篇”.“规划篇”.“开发篇”. 方法篇: 1.需求工程的方法观 方法的使命就是要将问题的结构和规律展现出来 2.分析计算方法 分析计算是需求规划方法与传统需求分析方法有本质区别的地方之一.分析计算包括系统支撑能力计算和业务发展能力计算 3.结构化分析方法 结构化的分析(又称SA)方法是本书在需求规划中的业务建模.系统建模和体系建模所采用的方法 4.面向对象分析方法 在需求分析中本书采用面向对象的分析方法作为用例分析和功能需求分析的方法 5.需求统一

《软件需求十步走》阅读笔记六

本次阅读笔记写一下<软件构造十步走>最后一篇<组织篇>. 本篇共分为四章,分别是建立需求分析体系,需求分析部门的组织结构,需求分析部门的管理工作,需求分析部门的业务工作. 首先是<建立需求分析体系>. 长期以来"轻业务.重技术"的理念根深蒂固,而解决措施是建立一个专业从事软件需求分析的独立部门来承担这项工作.此部门是介于业务部门和技术部门之间的,专门负责对组织自身业务.客户业务.客户对象和竞争对手的研究,然后将其转换成提供给技术部门的软件需求规格说明

《软件需求十步走》阅读笔记二

这一段时间阅读了<软件需求分析十步走>的第三四章,写一写书中一些个人感觉比较好的说法以及阅读感受. 首先是第三章<软件需求工程概论>. 需求工程和软件工程之间的关系界定没有质的变化,只是将需求工程从软件工程中剥离出来,将需求分析的分析工作和管理工作定义为需求工程.需求工程是面向全局的.系统顶层的.着眼未来的工程,是将客户业务作为内部研究对象,将软件工程全过程作为外部研究对象的工程.需求工程是圆心,软件工程是圆点. 需求工程的特征具有:全局性.主导性.主动性.过程性.规范性.可验证性

《软件需求十步走》阅读笔记三

需求既然是项工程,就有其完整的过程.需求工程研究领域可以划分为需求规划.需求开发.需求管理三个部分,新一代的需求工程过程由10个业务活动构成,分别是业务研究.应用建模.系统规划.分析计算.报告编制.规划评审.需求获取.需求分析.需求编制.需求验证. 传统的需求分析中有着三种角色,客户角色.分析角色和团队角色,三种角色领域不同,思维方式也不同,就产生了很多矛盾的问题.产生这样的问题是由于各个领域都在其自己的轨道上运行,并没有相结合起来,产生很多分歧.所以为了解决这样的问题,我们引入了一个新的领域,

阅读笔记:软件需求十步走(三)

软件需求的验证工作的目的是保证需求分析成果的完整性和正确性,保证软件开发后的软件产品是用户所需要的.软件需求验证的工作的重要性是在于发现修复需求分析中存在的问题.软件需求验证的主要工作是自我验证,用户验证,系统验证,技术验证,专家验证,主要是以评审会方式来展开,收集各方意见来进行修正.需求验证存在的问题是还处于人工检测阶段,对验证工作重视程度不够.而目前在验证的方法上存在的问题,大量的还依赖于人工检测,这对于当前的大数据量服务还远远不够,操作性也不太高.我们想说这种情况下,还有没有其他办法?我认

《软件需求十步走》阅读笔记五

本次阅读笔记写一下本书的第六篇<管理篇>. 第六篇共分为四章,分别是需求管理的思路.需求版本控制.管理变更请求.需求跟踪能力. 首先是第一章<需求管理的思路>. 需求管理活动的目标就是确保需求业务活动能够按照进度要求.质量要求.成本要求生产出高质量的由业务需求.用户需求和系统需求构成的软件需求规格说明.需求管理工作具体是借助由基线.版本.状态.变更.跟踪构成的需求约定这一抓手将需求业务活动集成起来并加以规范化.需求管理活动的目的是在客户与软件开发人员之间建立一个由文档构成的需求基线

《软件需求十步走》阅读笔记一

从学习软件以来,每个程序老师都会告诉我们要进行需求分析,而自己有时会简简单单需求分析一下,有时都不会管,然后每次写程序都会删改到自己都不知道程序要有什么功能,程序是用来做什么的,越做越感觉定题与所实施得到的结果分开了很多,没有了自己最初的设想.现在学习需求分析,感觉是自己的想法太简单了.通过对以前程序编写过程的反思,深刻的体会到了需求分析的重要性.“对需求分析工作事前千夫所指是有益的,而事后千夫所指是无畏的”. 一直以为程序才是软件好坏的关键,总是忽略了对软件的需求分析.许多数据表明,软件需求分