【转】谈基于SOA的应用系统设计和开发
注:在网上看到这篇文档,觉得写得很好,清晰实用。该博客其它文章也写得不错
前面已经有很多文章谈到过,SOA思想的核心根据定义可以拆分为两个重要的内容,一个是根据业务建模和架构设计过程找寻到粗粒度的可重用的服务;其二是这些服务可以组合,可以组装和编排以满意业务流程的需求。前者重点对应的是ESB服务总线,而后者重点对应的BPM和BPEL相关业务能力。
对于一个基于SOA的架构的业务系统,应该符合以下这些最基本的特征:
首先是业务系统是组件化和模块化的,需要在业务系统构建过程中体现CBM和业务组件化,组件能力化的思想。一个完整的业务系统通过业务建模和架构分析应该根据松耦合的原则拆分为多个业务组件,业务组件最终转换为应用系统实现中的应用模块(服务组件+技术组件)。每一个组件都相对独立,都可以独立进行分析设计,开发,测试,部署和后续运维的管理。
在应用开发中,我们经常可以看到一个业务系统划分为多个模块,但是各个模块之间仍然是完全混乱的交叉调用,不符合松耦合的思想。也完全约束了各个组件可以完全独立部署和管理。同时虽然有时候进行了组件的划分,但是数据库没有完全拆分开,应用层和逻辑层划分了组件做了拆分,但是到了数据库又完全混在了一起,也导致组件模块之间无法拆离。
组件划分的粒度,组件应该内聚的功能需要仔细分析,这些是组件之间能够松耦合的基础。组件之间的交互或者说组件向外暴露的能力只能以服务的方式进行,这个服务需要满足粗粒度服务的基本特征。即对于服务的消费方完全不需要了解组件内部的实现逻辑和细节,而只需要根据业务场景调用组件朝外暴露的能力。
组件以暴露粗粒度服务为原则,能够使用组合服务的就尽量使用组合服务,不能使用组合服务的时候才使用更下层的业务和数据的原子服务。这些服务构成一个组件核心的领域层。但是要注意的是不是领域层所有的服务都需要朝外部暴露,而仅仅是涉及到跨组件交互的服务才需要朝外部暴露。在这里还要注意的就是暴露的服务是领域层的能力,而不是数据库级别的CRUD,我们很多时候看到为了减少服务的数量,全部暴露为通道形式的DAL类服务,这本身是完全违背原则的。
服务本身就是轻量的API,因此服务具体实现是采用soap webservice还rest或其它方式并不重要,重要的是服务接口和契约只要不变更,即对于消费该服务的模块就不应该造成各种重新编译或部署的影响,这些轻量API或服务需要达到的一个基本的要求。
其次,服务本身需要是可复用的,服务的目的不仅仅是为了解决组件间的交互,这仅仅达到了服务能够松耦合各个组件的目的。而为了满足服务的可复用性,即需要考虑在各个业务模块的基础上,应该有一个更加底层的提供共性能力的基础公共模块,这个模块提供共享的可复用的服务能力出来。
前面曾经谈到过对于业务系统一般分为两个大的类型,一个是数据驱动型的,一个是流程工单驱动型的。对于资产管理,资源管理属于前置;对于OA,ITIL类业务系统完全属于后者。而对于前者往往都有一个核心的底层共享数据模型,这个共享数据模块上层的业务模块都需要用到。这个底层则提供共享的可复用的能力。即使对于流程驱动的应用,往往也存在架构分析设计中识别出可复用的内容进行提取。
对于安全,消息,缓存,文件,日志,异常,4A,流程引擎等技术类组件,更加是所有模块都需要复用的内容,在一个业务系统中的设计中这些需要抽取为独立的技术组件,提供可共享的技术服务。如果在实现过程中再结合AOP的思想将更好,这样业务系统构建和实现过程中将更加简单。
再次,业务流程的实现或复杂业务逻辑的实现应该体现服务组装或服务编排的思想。在这里和是否使用BPM工具,使用BPEL没有太必然的关系。在这里不是指的工作流引擎自动处理的审批流,而更多的是指需要程序自动化处理的业务流或复杂业务规则。如资产调拨可能需要调用多个原子服务来完成,这就是一种最简单的服务组合和编排,你可以看到在你复杂业务逻辑实现过程中基本都是调用的各个业务服务,数据服务,技术服务来组合完成的,在这种模式下虽然没有可视化的BPEL服务编排,但是已经体现了通过服务组合来实现业务的思想。
服务本身无状态,因此很难通过调用多个服务来控制事务,因此对于组合服务的实现尽量下移到领域服务层来完成,在领域服务层通过类似spring事务处理机制来控制事务。或者说组合服务不是去调用原子服务,而是直接调用底层的API进行组合,以避免太多的分布式事务处理。服务本身粗粒度,在服务中传递的对象更加强调是一个完整的业务对象,完全业务对象具有完整的事务属性和生命周期,引出也方便应用对于完整的业务对象进行完整的事务控制。
最后,一个业务系统内部可以选择实现一个最简单的服务总线,也叫做系统内部轻量ESB。实现这个目的并不是为了UDDI统一的服务目录库。而是业务系统本身服务化后,组件之间会出现大量的服务消费和调用,一个业务系统需要对这些业务访问调用进行统一的管控,包括服务运行监控,安全和鉴权,统一服务地址等。这些是基本的需求。
当然没有真正意义上的服务总线也不要紧,一个业务系统服务化后,在一种标准的模块化服务架构下,是很容易的实施和接入到一个ESB上面的。这个并不是基于SOA架构的业务系统的重点。包括现在的OSGI框架,也并不是完全的符合轻量ESB总线的要求。而对业务系统引入了更多在实现上的复杂性。
以上是最基本的要求和原则,最难的还是在如何划分业务组件,如何抽象粗粒度和可复用的服务。
【转】谈基于SOA的应用系统设计和开发的更多相关文章
- (转)也谈基于NodeJS的全栈式开发(基于NodeJS的前后端分离)
原文链接:http://ued.taobao.org/blog/2014/04/full-stack-development-with-nodejs/ 随着不同终端(pad/mobile/pc)的兴起 ...
- 也谈基于NodeJS的全栈式开发(基于NodeJS的前后端分离)
前言 为了解决传统Web开发模式带来的各种问题,我们进行了许多尝试,但由于前/后端的物理鸿沟,尝试的方案都大同小异.痛定思痛,今天我们重新思考了“前后端”的定义,引入前端同学都熟悉的NodeJS,试图 ...
- 基于NodeJS的全栈式开发(基于NodeJS的前后端分离)
也谈基于NodeJS的全栈式开发(基于NodeJS的前后端分离) 前言 为了解决传统Web开发模式带来的各种问题,我们进行了许多尝试,但由于前/后端的物理鸿沟,尝试的方案都大同小异.痛定思痛,今天我们 ...
- 基于SOA分布式架构的dubbo框架基础学习篇
以需求用例为基,抽象接口,Case&Coding两条线并行,服务(M)&消费(VC)分离,单元.接口.功能.集成四层质量管理,自动化集成.测试.交付全程支持. 3个大阶段(需求分析阶段 ...
- 面向服务体系架构(SOA)和数据仓库(DW)的思考基于 IBM 产品体系搭建基于 SOA 和 DW 的企业基础架构平台
面向服务体系架构(SOA)和数据仓库(DW)的思考 基于 IBM 产品体系搭建基于 SOA 和 DW 的企业基础架构平台 当前业界对面向服务体系架构(SOA)和数据仓库(Data Warehouse, ...
- 基于 SOA 的组件化业务基础平台
业务基础平台是业务逻辑应用和基础架构平台之间的一个中间层,解决 “应用软件的业务描述和操作系统平台.软件基础架构平台之间的交互与管理问题”.操作系统平台解决了“应用软件系统与硬件之间的交互与管理问题” ...
- 基于AgileEAS.NET企业应用平台实现基于SOA架构的应用整合方案-开篇
开篇 系统架构的文章,准备在这段时间好好的梳理和整理一下,然后发布基于AgileEAS.NET平台之上的企业级应用架构实践,结合具体的案例来说明AgileEAS.NET平 台之上如何进行系统的逻辑架构 ...
- 基于SOA的高并发和高可用分布式系统架构和组件详解
基于SOA的分布式高可用架构和微服务架构,是时下如日中天的互联网企业级系统开发架构选择方案.在核心思想上,两者都主张对系统的横向细分和扩展,按不同的业务功能模块来对系统进行分割并且使用一定的手段实现服 ...
- 基于SOA的银行系统架构
Part-1 [简述] 1.通过引入面向服务架构(SOA),企业服务总线(ESB),适配器(Adapter)及面向构件等技术,尝试打造一个统一业务流程服务平台,实现面向流程的服务集成. 2.传统银行 ...
随机推荐
- 【洛谷 P2346】四子连棋(状态压缩,搜索)
其实这题可以直接二进制状压做,1表示黑棋,0表示白棋,另外记录下2个空点的位置就行了. 具体看代码(冗长): #include <iostream> #include <cstdio ...
- NYOJ 127 星际之门(一) (数学)
题目链接 描述 公元3000年,子虚帝国统领着N个星系,原先它们是靠近光束飞船来进行旅行的,近来,X博士发明了星际之门,它利用虫洞技术,一条虫洞可以连通任意的两个星系,使人们不必再待待便可立刻到达目的 ...
- bzoj 3224 裸平衡树
裸的平衡树,可以熟悉模板用,写题写不出来的时候可以A以下缓解下心情. /************************************************************** P ...
- cdp协议通信并发编程基础之进程
一 . 基于UDP的套接字 udp是无链接的所以先启动哪一段都不会报错 udp服务端 import socket server=socket.socket(socket.AF_INET,socket. ...
- python面向对象之继承与派生
一.继承 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继承,如果是多继承的 ...
- pinctrl框架
pinctrl框架是linux系统为统一各SOC厂家pin管理,目的是为了减少SOC厂家系统移植工作量. 通常通过设备树初始化pinctrl,并提供调用io接口,以下为全志A64平台的实例: 在dri ...
- linux环境下的GUN make学习笔记(一)
第一章:概述 1.1:make概述 在linux环境下使用make工具能够比较容易的构建一个属于自己的工程,整个工程的编译只需要一个命令就可以完成编译.连接以至于最后的执行.不过我们需要投入一些时间去 ...
- [ Python - 9 ] 高阶函数map和reduce连用实例
1. 利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456: from functools import reduce def str2num( ...
- javascript中使用el表达式获取不到数据问题
我们通常会在jsp里面使用el表达式,把需要的值传递给 javascript 方法,例如: <p onclick="doSomething(${param})">< ...
- GenericAPIView类与几个扩展类的综合使用
五个扩展类 扩展类 作用 封装的方法 状态码(成功,失败) ListModelMixin 查询多条数据 list 200 CreateModelMixin 新增一条数据 create 201,400 ...