发表于: 2017-12-09 21:15:48
0 834
一.今日完成
今天准备小课堂,整理SCA SOA相关知识点
一、背景介绍
基于分布式架构的系统是一组相互独立但并行协同工作的计算机集合;对系统的用户来说,系统就象一台计算机一样”这两层意思。从硬件角度,每台机器都是自治的、独立的;从软件角度,用户感受是整体的、一致的。
分布式架构设计的核心理念是“并行拆分与横向扩展”,即按照一定维度将系统进行拆分,系统各部分松耦合并行运行,并建立起较为完善的横向扩展与容错恢复机制。
分布式架构应具备以下特征:一是物理部署分布式,即用多台计算机来共同承载业务;二是处理过程分布式,系统各环节各司其职、并行处理,通过特定机制有效协同关联;三是数据存储分布式,将数据分散存储,但不影响数据运算结果的完整性和一致性。
分布式架构也存在一些不足。例如,在对系统进行拆分后,如何协调各部分之间的并行处理,确保最终处理结果的一致性;如何应对跨网络访问过程中可能存在的信息丢失和通讯延迟,确保信息系统服务水平;如何确保在单个节点异常情况下系统正确切换与恢复,确保系统整体可靠性等等,这都需要在系统设计与实现层面制定有针对性的解决方案。再如,分布式系统由于其数据分开存放,不同功能并行处理,为了确保系统整体可靠性,往往采用“数据最终一致性”的原则进行设计,需在产品功能设计层面同步予以考虑。
所有基于服务的架构的一个共性是他们一般都是分布式架构,也就是服务组件都是通过远程访问协议来实现的,例如REST、SOAP、AMQP、JMS、MSMQ、RMI或者.NET Remoting。相对于单体式架构和分层式架构,分布式架构有很多优势,包括可伸缩性、解耦能力以及对开发、测试和部署的可控性等。分布式架构中的组件更趋向于自包含,因此其变更管理和维护也更容易,从而使得相应的应用也更稳定,响应也更快。分布式架构也非常适用于各模块之间耦合度较低、更加模块化的应用。
二、知识剖析
1. SOA定义
Service-architecture.com将SOA定义为:“本质上是服务的集合。服务间彼此通信,这种通信可能是简单的数据传送,也可能是两个或更多的服务协调进行某些活动。服务间需要某些方法进行连接。所谓服务就是精确定义、封装完善、独立于其他服务所处环境和状态的函数。”
满足以下全部3个基本要素的应用被称为SOA的编程
1)松散耦合;
2)粗粒度
3)位置和传输协议透明。
(1)松散耦合是指相互之间的依赖程度,包括三个方面:1)服务之间的松散耦合:不同服务的功能不要互相依赖, 相对独立而完整,所谓自包含;这样就比较好管理各个数据2)接口和实现之间的松散耦合: J2EE或.NET只需WSDL就可以调用WEB SERVICE的服务接口;3)业务组件和传输协议之间的松散耦合:传输协议和位置的透明。(2)粗粒度的意义是SOA中服务的接口应该比面向对象的编程的API要大一些。以ATM取款机的取款功能来说明这个问题.取款功能的实现可能实际要包括下面的3个API:1)身份校验: 系统确认用户输入的卡号和密码是否正确;2)余额查询:账户是否有足够取款数额;3)取款: 以上两项都满足后,才真正付给用户现金。
作为SOA的业务接口,就不能将“身份校验”和“查询余额”这两个API公布给用户,因为这样太细了。如果让用户必须操作完两个接口,最后再操作“取款”接口,则不符合用户的操作习惯。所以系统只能给出符合用户操作习惯的一个服务接口“取款”,它里面包含前面两个API功能 。
(3)位置和传输协议透明是SOA最根本的区别于目前面向组件编程的地方。目前的服务组件如EJB、WEB SERVICE、JMS的发布都是和特定的应用服务器绑定在一起的。如果某个服务组件的URL位置修改了,客户端程序必须要做相应的修改,否则整个集成不能工作了。这就是位置组件的不透明。
所谓位置的透明,就是指不论服务组件的实际位置URL如何变化,客户端的调用程序的URL都不需要改变。所谓传输协议的透明,就是指不管服务组件的传输协议如何变化,客户端的调用程序的传输协议都不需要改变。
与优点相伴的缺点则是复杂性的增加和投入的增长。维护服务合约、选择正确的远程访问协议、处理不响应的或不可用的服务、加密远程服务和管理分布式事务,这些还只是构造基于服务的架构时许多复杂问题中的一部分。
2.SOA核心理念
在SOA架构风格中,服务是最核心的抽象手段,业务被划分(组件化)为一系列粗粒度的业务服务和业务流程。业务服务相对独立、自包含、可重用,由一个或者多个分布的系统所实现,而业务流程由服务组装而来。一个"服务"定义了一个与业务功能或业务数据相关的接口,以及约束这个接口的服务契约。接口和契约采用中立、基于标准的方式进行定义,它独立于实现服务的硬件平台、操作系统和编程语言。
这使得构建在不同系统中的服务可以以一种统一的和通用的方式进行交互、相互理解。除了这种不依赖于特定技术的中立特性,通过服务注册库(Service Registry)加上企业服务总线(Enterprise Service Bus)来支持动态查询、定位、路由和中介(Mediation)的能力,使得服务之间的交互是动态的,位置是透明的。技术和位置的透明性,使得服务的请求者和提供者之间高度解耦。
3.SCA概述
SCA (Service Component Architecture)是为实现 SOA 而产生的一种规范。它提供了一种编程模型,能够十分方便、快速地来构建 SOA 所需的系统和应用。SCA 提出了一种组合应用(composite applications)的概念,这些组合可以是各种符合 SOA 规范的服务,或者是已经构建好的其他组合应用。通过这种灵活的编程方式,它可以很快地组装出各种所需的应用程序。
SCA基于这样的理念:将业务功能作为一系列的服务而提供,并由这一系列的服务组装起来的解决方案来满足特定业务需求。这些组合的应用既包括为应用而新创建的特定服务,也包括源自已已存在系统和应用的业务逻辑,这些业务逻辑作为组合构件的一部分被复用。
4.SCA装配模型
SCA的基础工件就是component,它是SCA的构成单元。构件(component)由一个实现的可配置(implementation)实例所组成。在该构件中,实现是提供业务功能的程序代码片段。该业务功能作为服务(service)而提供,为其他构件所使用。实现也许依赖于由其他构件所提供的服务,这些依赖被称作”引用”(reference)。实现可以有一个可设置的属性(properties),该属性是可以影响业务功能操作的数据值。构件通过提供属性值和连线(wire)到由其他构件提供服务的引用来配置实现。
SCA把在装配应用中的内容和联接称为组合构件(composite)。组合构件能包含构件,服务,引用,属性声明以及描述这些元素间连接的连线(wire)。组合构件可以分组并连接以不同技术实现的构件,其允许为每个业务任务使用相应的技术。反过来,组合构件能作为完整的构件实现来使用:提供服务,依赖引用以及可设置的属性值。
这样的组合构件实现能用于其他组合构件中的构件,支持业务解决方案的分层构建。在该解决方案中,高层服务内部是由一系列的低层服务实现的。组合构件的内容能作为元素组来使用。该元素组通过包含于高层的组合构件中发挥作用。
(1) Component是SCA组合件中业务功能的基础元素。其通过SCA组合构件联合成完整的业务解决方案。
Component是实现的可配置实例。构件提供和消费服务。多个构件可以使用和配置为同一个实现,而每个构件又可以对实现有不同的配置。
(2) 构件实现(service)是提供服务或引用其他地方所提供的服务的业务功能的具体实现。另外,某个实现可以有一些可设置的属性值。
SCA允许你从广泛的实现类型中选择任何一种技术,比如Java、BPEL或C++。这每种类型都代表了特定的实现技术。该技术不仅仅简单定义实现语言,如Java,而且也可以定义使用某个特定的框架或运行时环境。例如包括使用Spring framework或Java EE EJB技术的Java实现。
(3) Interface定义了一个或多个业务功能。这些业务功能是通过服务提供或通过引用来使用的。为了其他组件的使用,一个服务提供了严格的单一接口的业务功能。每个接口都定义了一个或多个服务操作,每个operation都有0个或1个请求(输入)消息和0个或1个响应(输出)消息。请求和响应消息可以是简单类型,如string 值,也可以是复杂类型。
(4) SCA 组合构件被用于在逻辑分组中装配SCA元素。其在SCA 域中是组合的基本单元。SCA 组合构件包含一系列的构件,服务,引用以及内连它们的连线,外加上用于配置构件的一系列属性。
组合构件可以在更高层的组合构件里作为构件实现的形式。换句话说,高层的组合构件可以包含由组合构件实现的构件。
(5) 组合构件的引用是通过提升其内部构件所定义的引用来定义的。每个被提升的引用都指示其内部构件引用必须解析为组合构件外部的服务。通过使用组合构件的reference元素,来提升其内部构件的引用。
(6) Wire组合构件中的SCA连线将源构件引用连接到目标构件服务。定义连线的方法之一是通过使用target属性来配置一个构件引用。用解析引用的服务连线目标URI配置reference元素。当引用的multiplicity为0..n或1..n时,多个目标服务是有效的。
(7) 绑定.绑定被服务以及引用所使用。引用使用绑定来描述用于调用服务的访问机制(此服务可以是另一个SCA组合构件提供的服务)。服务使用绑定来描述客户端(可以是来自于另一个SCA组合构件的客户)要调用服务必须使用的访问机制。
SCA支持多种不同绑定类型的使用。举例来说,包括SCA service,Web service, stateless session EJB,database stored procedure以及EIS service。SCA运行时必须为SCA service以及Web service绑定类型提供支持。SCA提供扩展机制。通过此扩展机制,SCA运行时可以添加对附加绑定类型的支持。
三、常见问题
SOA vs 微服务
四、解决方案
1.目的不同
SOA 服务化涉及的范围更广一些,强调不同的异构服务之间的协作和契约,并强调有效集成、业务流程编排、历史应用集成等,典型代表为Web Service 和ESB 。
微服务使用一系列的微小服务来实现整体的业务流程,目的是有效地拆分应用,实现敏捷开发和部署,在每个微小服务的团队里,减少了跨团队的沟通,让专业的人做专业的事,缩小变更和法代影响的范围,并达到单一微服务更容易水平扩展的目的。
2. 部署方式不同
微服务将完整的应用拆分成多个细小的服务,通常使用敏捷扩容、缩容的Docker 技术来实现自动化的容器管理, 每个微服务运行在单一的进程内,微服务中的部署互相独立、互不影响。
SOA 服务化通常将多个业务服务通过组件化模块方式打包在一个War 包里,然后统一部署在一个应用服务器上。
3.服务粒度不同
微服务倡导将服务拆分成更细的粒度,通过多个服务组合来实现业务流程的处理,拆分到职责单一, 甚至小到不能再进行拆分。
SOA 对粒度没有要求,在实践中服务通常是粗粒度的,强调接口契约的规范化,内部实现可以更粗粒度。
五、代码实战
Java类如何提供SCA构件的实现
1.服务
基于Java类的构件实现可以提供一个或多个服务。
基于Java的实现所提供的服务,可以有一个按下列方法之一定义的接口:
Java接口
Java类
产生自Web Services Description Language [3] (WSDL) portType的Java接口
Java实现类必须实现服务接口定义的所有操作。如果服务接口是用一个Java接口定义的,那么基于Java的构件要么实现此Java接口,要么实现接口的所有操作。
由Java类定义接口的服务(与Java接口相对)不是远程的。产生自WSDL portType的Java接口是远程的
2.引用
引用可以通过注入或ComponentContext API获得。推荐尽可能使用注入方式来访问引用。
1) 引用注入, 通过使用@Reference注解,Java实现类型可以显式地指定其使用的引用.
2) 动态引用访问, 引用可以通过ComponentContext.getService()和ComponentContext.getServiceReference(..)方法来动态访问。
3. 属性
1) 属性注入, 属性可以通过注入或ComponentContext API来获得。Java实现类型可以通过使用@Property注解显式地指定其属性
2) 动态属性访问,属性可以通过ComponentContext. getProperty ()方法来动态访问。
4. 实现实例的实例化
Java实现类必须提供一个public或protected的构造函数,SCA运行时用此构造函数实例化实现的实例。构造函数可以有参数,当存在参数时,SCA容器会在调用构造函数时传递可用的属性或引用值。未通过构造函数设置的任何属性或引用值,都将会在任一服务方法被调用之前,被设置给属性域或被传递给与其关联的setter方法。
按照如下方式,由容器选择要用的构造函数:
1. 用@Constructor注解标注的显式构造函数
2. 无二义性地标识了所有属性和引用值的显式构造函数
3. 无参数的构造函数
5. 实现作用域与生命周期回调
Java实现类型支持《SCA Java通用注解和API规范中》定义的所有作用域:STATELESS, REQUEST, CONVERSATION和COMPOSITE。实现通过使用@Scope注解指定它们的作用域. 当实现类未指定@Scope注解,则其作用域默认为STATELESS。
Java构件实现通过使用@Init和@Destroy注解分别指定init和destroy回调。
6. 指定构件类型(component type)
对于Java实现类,构件类型一般都是直接由Java类内省而来。
在配置文件中对构件类型的指定是可选的。component type配置文件由加载Java类的同一个类加载器发现。配置文件必须在与实现的命名空间一致的目录下,并与Java类名相同,且以.componentType扩展名替代.class扩展名。
六、扩展思考
SCA 与 Spring
与 Spring bean 类似,SCA 组件可以包含到其他组件所提供的服务的引用,并且有一些属性可供配置。与 Spring 形成对比的是,SCA 是一种跨语言的分布式组件架构,它支持多种组件通信机制。通过将 Spring beans 发布为可由其他组件访问的服务并为 Spring beans 提供关联到其他(可能为远程)组件的服务的引用,SCA 可以扩展 Spring 组件的功能。
要将 SCA 与 Spring 相结合,一种有效的方法是使用 Spring 来构建 “粗粒度” 的服务组件实现,并引入到 SCA 中以便公开服务、关联服务组件以及处理异构和分布式系统。
易于测试组件是 Spring 的一项优异的特性。缺少 API 和注入技术导致您只能使用简单的模拟对象进行测试。SCA 在服务方面对此进行了补充,因为关于服务组件的 SCA 复合集可以方便地切换到模拟配置以进行测试。.
七、参考资料
1.《AssemblyModel 装配模型规范》,《JavaComponentImplementation JAVA构件实现规范》,《JavaAnnotationsAndAPIs JAVA通用注解和API规范》(https://cwiki.apache.org//confluence/pages/viewpage.action?pageId=96720)
2.IBM developerworks技术专栏《SCA 专题》(https://www.ibm.com/developerworks/cn/webservices/lp/sca/)
3.《SOA:原理•方法•实践,第 1 部分: SOA 的基本概念》(https://www.ibm.com/developerworks/cn/webservices/0708_xinsheng/index1.html#ibm-pcon)
4.《三剑客:Spring、SCA 和 Apache Tuscany》(https://www.ibm.com/developerworks/cn/opensource/os-springsca1/index.html#artrelatedtopics)
5.《微服务与SOA架构》(http://dockone.io/article/1646)
二.明日计划
1.向大佬请教,生成代码测试跑通后,接下来的进度安排应该怎么弄?
2. 根据DB,调整接口文档里不合适的地方.
三.遇到问题
暂无.
四.收获
以上.
评论