




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
档案项目 Version: 1.0 Date: 2010-4-30档案项目 软件架构过程文档Software Architecture DocumentVersion Revision HistoryDateVersionDescriptionAuthor2010-4-301.0软件架构过程文档第一版,逐步完善潘志鹏文档目的记录SCA框架的搭建过程,并写一个简单的demo,方便开发人员在这个框架中进行开发。面向读者软件工程师,技术经理,架构师等技术类人员注意事项本文 假设读者有spring使用经验,请没有Spring使用经验的读者自己查找Spring 的相关资料。缩写词SOA:面向服务架构(Service-Oriented Architecture)SCA:服务组件架构(Service Component Architecture)SDO:服务数据对象(Service Data Objects)1 软件架构关于软件架构的目标、思想、技术选型等。1.1 设计目标与愿景正如软件本身有其要达到的目标一样,架构设计也有需要达到的目标。我们的目标是:l 可靠性(Reliable):集群,24小时持续运行l 安全性(secure):加密技术,数字证书等各种安全技术l 可伸缩性(Scalable):分布式l 可定制化(Customizable):动态化、模块化l 可扩展性(Extensible):l 可维护性(Maintainable)l 可户体验(Customer Experience):Ajax,可选择用户界面风格l 市场时机(Time to Market)我们将定义和设计软件模块化、动态化、接口、组件、用户界面风格、创新等设计特性,以及高层事物的对象操作、逻辑和流程,来达到以上这些目标。软件架构愿景l 编写服务组件:基于组件编程一直是软件业简化编程、提高效率和质量的一个重要方法。l 组装服务组件:不直接面对具体的技术细节,而是通过组装服务组件的方式来构建企业应用。l 所有的服务器端都独立开发和部署,并且这些服务器端可以随意地被外部依赖和调用。如果要实现新的功能,只需要开发新的服务即可。l B/S的分布式架构,既便于服务的扩展,又便于服务的管理,且实现了压力的分解对系统的可扩展性和可复用性有很大好处。1.2 设计思想为了实现以上的目标与愿景,最终决定采用 服务组件架构SCA。l SCA是为实现SOA而产生的一种规范;l SCA是目前实现SOA的最佳方式;l SCA是为在SOA中构建和组装业务解决方案而专门设计的一个新编程模型,旨在集成和组装服务。可以使用任何语言,能够把各种已经存在的服务十分方便、快速的构建SOA所需要的系统和应用。1.3 整体设计SCA服务端技术选型:SCA + Spring + Hibernate + Jackrabbit + LuceneSCA客户端技术选型:Spring + SCA + JSF我们这里选择的SCA解决方案是 Apache Tuscany各框架的版本分别是:Spring 2.5、Tuscany-sca-2.0-M3、Hibernate-3.3、Jackrabbit-1.5.5、JSF-2.0整体软件架构图如下:图1-1 软件架构图2 搭建SCA服务器端2.1 主要原理根据上面的 图1-1,SCA服务器端应用的主要原理如下:简单的说,就是Tuscany与 Spring集成,Spring容器运行在Tuscany容器中,Spring容器管理内部的服务,Tuscany则把Spring所管理的服务发布为Web服务。以Spring为内核,利用Spring的IOC管理各种服务组件,利用AOP做各种事务管理与事件监听。服务器端分为3层, l DAO层:以Jackrabbit做文件存储,以Hibernate做数据库存储,l Service:提供一些只能在内部使用的服务,如XMap配置、XSD引擎、Schema管理、文档模型(DocumentModel)、仓库管理、生命周期、版本管理、安全管理和全文检索等服务。l Faade:根据业务流程组装服务。Tuscany则把Faade层中组装的服务 发布为SCA服务,服务的协议采用Web Service方式发布。2.2 简要步骤搭建服务器端框架的简要步骤:l 增加Tuscany和Spring 的支持jarl 增加service远程接口和实现类,并在spring配置好l 将Service发布为Web服务:集成配置Tuscany + Spring 组件l 增加SCA服务启动Servlet类l 启动SCA服务并做测试2.3 详细过程本文使用的IDE工具是 MyEclipse6.5。第1步:增加Tuscany和Spring 的支持新建一个Web项目ArchiveService,并增加Tuscany和Spring 的支持,也就是把所有Tuscany和Spring需要用到的jar包拷贝到ArchiveServiceWebRootWEB-INFlib目录下第2步:增加service远程接口和实现类,并在spring配置好(1)在src 下创建一个test包(2)在test包下建一个接口 HelloWorldService.java接口HelloWorldService.javapackage test;import org.oasisopen.sca.annotation.Remotable;Remotablepublic interface HelloWorldService String sayHello(String name);为了将service发布为远程Web Service服务,需要把所有的 Service接口都标记为远程接口。在Tuscany 中很容易就能做到,只要在接口前使用Remotable进行标记。如上面的代码示例。(3)再写接口实现类HelloWorldServiceImpl.java实现类HelloWorldServiceImpl.javapackage test;public class HelloWorldServiceImpl implements HelloWorldService public String sayHello(String name) System.out.println(客户端调用: + name);return Hello + name + !;实现类跟以前写的实现类没有任何的区别。(4)增加Spring配置applicationContext.xmlapplicationContext.xml第3步:将Service发布为Web服务:集成配置Tuscany + Spring 组件这一步很关键,也就是和普通spring开发程序不同的地方,我们不需要改变在spring框架下编写的程序,增加一些相关的配置就可以把spring管理的服务发布 为Web 服务。(1) 在Spring 中配置SCA的Service使用标签把spring管理的服务转换为需要发布的SCA服务。在applicationContext.xml中的是Spring2.5提供的专门用于发布 SCA服务的标签,要使用该标签还需要在根元素中引入该标签的命名空间,如下配示。applicationContext.xml元素包括3个属性。name属性:SCA服务组件的名称,对应ArchiveSposite中的name属性。type属性:指定该组件对应的Service接口类。target属性:指定该服务组件对应的组件名称。完整的applicationContext.xml 配置文件如下:(2)增加SCA的组件配置文件ArchiveSposite,把spring 中配置的服务发布为web服务。ArchiveSposite 由于我们使用Tuscany来发布web服务,而这些web服务又必须引用基于Spring开发的service接口,因此需要在Tuscany中引入Spring的组件。以上配置标记引入了Spring的applicationContext.xml配置文件:这一句就是在为了在Tuscany容器中引入Spring组件的目的。的name属性引用了applicationContext.xml 中的同名组件,这些组件就是在applicationContext.xml中通过来指定的。 这一句就是把HelloWorldService 这个组件发布为web service服务。客户端可以使用这个地址做远程访问。(3)以上完成的SCA组件的配置,为了引用ArchiveSposite作为SCA配置文件,需要添加一个SCA部署文件META-INFsca-contribution.xml,其中指定ArchiveService名称,如下sca-contribution.xml 第4步:增加SCA服务启动Servlet类增加一个servlet启动类,使用Tuscany 启动服务SCAStartUpServlet.javapackage test.start;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import org.apache.tuscany.sca.node.Node;import org.apache.tuscany.sca.node.NodeFactory;import mon.GeneralException;public class SCAStartUpServlet extends HttpServlet /Initialization of the servletpublic void init() throws ServletException super.init();startUp();/启动SCA,发布服务private void startUp() this.start(); try while (true) Thread.sleep(Long.MAX_VALUE); catch (InterruptedException e) throw new GeneralException( SCA服务异常。StartUpServlet.startUp() ); / 初始化SCA服务 private void start() / 创建节点Node node = NodeFactory.newInstance().createNode();/ 启动node.start(); /Destruction of the servletpublic void destroy() super.destroy(); 在ArchiveSerWebRootWEB-INFweb.xml中配置刚才写的servlet。web.xmlSCAStartUpServlettest.SCAStartUpServlet0index.jsp第5步:启动SCA服务并做测试把项目部署到tomcat6下面,启动tomcat,会看到如下信息,说明服务启动成功2010-5-4 17:56:03 org.apache.tuscany.sca.http.jetty.JettyServer addServletMapping信息: Added Servlet mapping: http:/localhost:8081/ArchiveService/HelloworldService再输入网址http:/localhost:8081/ArchiveService/HelloWorldService?wsdl看到以下信息,说明服务发布成功!到此,就完成了SCA服务器端的开发了3 搭建SCA服务的Web应用3.1 主要原理根据上面的 图1-1,SCA服务的Web应用 的主要原理如下:简单的说,就是Spring与Tuscany集成,需要使用Spring来访问Tuscany发布的服务, Tuscany访问服务器端发布的Web服务。也就是说Tuscany是运行在Spring容器中的。服务的协议采用Web Service方式访问。3.2 简要步骤l 增加Spring和Tuscany的支持jarl 增加service接口代码与实现类代码l 配置SCA客户端访问服务器端Web服务增加SCA配置文件增加SCA部署文件客户端测试代码l Spring访问SCA组件集成配置Spring + Tuscany组件增加访问SCA组件的通用类:1) 创建一个产生SCA节点的通用类2) 创建一个产生服务对象的通用服务工厂类增加Spring配置文件l 增加Web层和Action代码,配置JSFl 运行程序,查看结果3.3 详细过程第1步:增加Spring和Tuscany的支持新建一个Web项目ArchiveWeb,并增加Spring和Tuscany的支持,也就是把所有Spring和Tuscany需要用到的jar包拷贝到ArchiveWebWebRootWEB-INFlib目录下第2步:增加service接口代码 与实现类(1)增加一个service接口 :HelloWorldService.javaHelloWorldService.javaPackage test;import org.oasisopen.sca.annotation.Remotable;Remotablepublic interface HelloWorldService String sayHello(String name);(2)增加service实现类代码HelloWorldServiceImpl.javaHelloWorldServiceImpl.javapackage test;import org.oasisopen.sca.annotation.Reference;public class HelloWorldServiceImpl implements HelloWorldService private HelloWorldService helloWorldService; Reference public void setHelloWorldService(HelloWorldService helloWorldService) this.helloWorldService = helloWorldService; public String sayHello(String name) return helloWorldService.sayHello(name); 其中的Reference 表示需要Tuscany注入第3步:配置SCA客户端访问服务器端Web服务主要就是给实现类中的 private HelloWorldService helloWorldService做远程的属性注入。(1)增加SCA配置文件ArchiveSpositeArchiveSposite 对于客户端需要访问的服务器端Web服务,每一个都需要通过映射为本地的一个 Service 实现,该实现类负责将远程的Web服务转化为java类,供Action层使用。该实现类与服务器端ArchiveServer的service实现类不同,它需要引入一个远程服务的对象,例如HelloWorldServiceImpl.java,其中拥有一个HelloWorldService对象helloWorldService,该对象中的name属性对应的变量名(注意大小写必须一致),该变量将会被Tuacany直接注入到HelloWorldServiceImpl.java中。不过需要在HelloWorldServiceImpl.java中提供setXXX()方法,并在该函数前使用Reference进行标注。HelloWorldServiceImpl.java还必须实现HelloWorldService.java ,并重写所有的函数,在函数中直接调用HelloWorldService对象helloWorldService来执行远程操作接口。至此,完成了SCA组件的配置。(2)增加SCA部署文件sca-contribution.xml为了引用ArchiveSposite作为SCA配置文件,必须增加SCA部署文件sca-contribution.xml,并在其中指定ArchiveService名称。sca-contribution.xml (3)客户端测试类ArchiveServiceClientTest.java编写这个测试类是为了方便 直接通过SCA客户端组件来访问远程的Web服务,这样就可以直接做测试,避免部署到web服务器中去才能做测试的麻烦。ArchiveServiceClientTest.javapackage com.archive.sz.scaclient;import org.apache.tuscany.sca.node.Client;import org.apache.tuscany.sca.node.Node;import org.apache.tuscany.sca.node.NodeFactory;public class ArchiveServiceClientTest public static void main(String args) throws Exception / 创建节点Node node = NodeFactory.newInstance().createNode();/ 启动node.start();/ 取得对象 HelloWorldService helloWorldService = (Client) node).getService(HelloWorldService.class, HelloWorldComponent); System.out.println(helloWorldService.sayHello(pzp); / 停止node.stop(); 直接运行代码,可以看到类似下图的打印结果,Hello pzp! 说明访问服务器端发布的Web服务!第4步: Spring访问SCA组件集成配置Spring + Tuscany组件服务器端是以Tuscany来发布web服务,Spring运行在Tuscany 容器中,所以是 Tuscany + Spring集成。而这里需要使用Spring来访问Tuscany 发布的服务,Tuscany是运行在Spring容器中的,所以是Spring与Tuscany集成。上面已经配置了SCA访问外部的Web服务,接下来需要配置Spring访问SCA组件。为了实现类似ArchiveServiceClientTest.java一样,在Action类中访问SCA组件,需要开发一个通用的类来访问SCA组件,该通用类能够在Spring配置文件中直接通过注入的方式产生不同的service对象。(1)首先开发一个SCA客户端类SCAClientBean.java这个类负责读取ArchiveSposite文件,创建Node并启动节点,它实现的效果如下所示:Node node = NodeFactory.newInstance().createNode();node.start();节点服务类SCAClientBean.javapackage com.archive.sz.scaclient;import org.apache.tuscany.sca.node.Client;import org.apache.tuscany.sca.node.Node;import org.apache.tuscany.sca.node.NodeFactory;import org.springframework.beans.factory.DisposableBean;import org.springframework.beans.factory.FactoryBean;import org.springframework.beans.factory.InitializingBean;/* * author zppan 主要是启动SCA服务,创建Client对象 (Client) node; * org.apache.tuscany.sca.node.Client; org.apache.tuscany.sca.node.Node; */public class SCAClientBean implements FactoryBean, InitializingBean, DisposableBean private String resource; private Node node; public void setResource(String resource) this.resource = resource; public Object getObject() throws Exception return (Client)node; SuppressWarnings(unchecked) public Class getObjectType() return Client.class; public boolean isSingleton() return true; public void afterPropertiesSet() throws Exception this.node = NodeFactory.newInstance().createNode(resource); this.node.start(); public void destroy() throws Exception this.node.stop(); (2)再开发一个SCA组件工厂类SCAClientServiceFactory.java,目的是根据SCAClientBean.java产生的节点Node来取得对应组件的实例,要实现的效果如下所示:HelloWorld helloWorld = (Client) node).getService(HelloWorld.class,HelloWorldComponent);实现的代码程序如下:SCAClientServiceFactory.javapackage com.archive.sz.scaclient;import org.apache.tuscany.sca.node.Client;import org.springframework.beans.factory.FactoryBean;import org.springframework.beans.factory.annotation.Required;/* * 使用反射的方式 返回各种service,主要实现如下方式去获取service * 例如 HelloWorldService helloWorldService = (Client)node.getService(HelloWorldService.class, HelloWorldComponent) ; */public class SCAClientServiceFactory implements FactoryBean private Client client; private String className; private String component; Required public void setClient(Client client) this.client = client; Required public void setClassName(String className) this.className = className; Required public void setComponent(String component) ponent = component; public Object getObject() throws Exception re
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB 46032-2025储粮化学药剂管理与使用规范
- 2025年建筑工地抹灰安全题库解析集
- 2025年康复训练面试高频题
- 2025年机械工程师初级面试模拟题及答案全解
- 2025年AI主播入门初级题库解析
- 2025年卡丁车教练员考试通关秘籍模拟题集与答题技巧
- 2025年化学初级工无机题解
- 2025年市委党校教师招聘面试问题解答
- 2025年高压电工模拟题及答案
- 2025年AI智能语音技术实战指南及考试题库
- 辽宁2022年国家开发银行辽宁分行校园招聘考试参考题库含答案详解
- 办公家具供货安装及售后服务方案
- 积极心理学全套课件
- bc-6800产品中心医院
- GB/T 40565.2-2021液压传动连接快换接头第2部分:20 MPa~31.5 MPa平面型
- GB/T 38537-2020纤维增强树脂基复合材料超声检测方法C扫描法
- GB/T 11446.10-1997电子级水中细菌总数的滤膜培养测试方法
- 儿童生长发育监测课件
- 混凝土结构跳仓施工方案
- 页岩气开发地震监测技术要求DB50-T 1234-2022
- 实验室病原微生物危害 评估报告
评论
0/150
提交评论