作者:Edwin Biemond、Ronald van Luttikhuizen 和 Demed L'Her
一系列务实的最佳实践,用于部署可随业务需求的增长不断扩充的简单、可靠的 SOA 规模。
2012 年 1 月发布
理想情况下,大家都希望以非常系统和战略的方式开始构建面向服务的架构 (SOA):聘请开发人员和架构师团队、调查企业中的现有资产、提出全面的企业级架构并从中得出相应的软硬件需求。可以想像,这种全面的方法需要大量时间、资源和前期规划,而这不是大家都办得到的。我们经常看到一些公司希望以更灵活、更战术性的方式部署集成基础架构,比如说,他们只以互连两个应用程序为目标。同时,他们希望借此机会奠定最终可以成长并支持更全面 SOA 的基础。好消息是这两个目标并非不可调和的。
本文重点介绍几个简单而务实的最佳实践,以帮助大家为将来构建坚实的基础。这些实践跨多个领域:管理、基础架构、开发和架构。
您可能会觉得有些奇怪,既然 SOA 工作一般是从开发或架构方面开始着手进行,为何本文首先提到管理方面的考虑事项?遗憾的是,运营团队通常太少或太晚介入 SOA 项目。开发人员经常在最后一刻才将项目甩到运营团队手上,要想满足最终期限是不现实的。通常,这会导致大幅修改项目时间表,或者在不具备所要求的基础架构的情况下匆忙将项目投入运营,使经年累月小心翼翼的开发工作暴露于风险之下。
具体的建议是,从一开始就至少让一位系统管理员加入您的虚拟团队。确保运营团队接受技术培训,且该团队介入实际运营的规模调整、安全性、可管理性和验收标准方面的工作。
记住,最终您的管理团队将按照您对端到端项目时间表的遵守情况以及应用程序的稳定性和性能(而不是内部组合与 BPEL 设计是否优美)来衡量您是否成功。任何 SOA 项目的成功都与一支有能力、有意志的运营团队分不开。
不同组织的管理员的技能和职责各不相同。管理诸如 Oracle SOA Suite 和 Oracle Service Bus (OSB) 之类的中间件组件完全不同于管理数据库、网络或文件系统。请确保贵组织聘请了解其中间件的管理员,即便是小型易于管理的环境。由于 SOA 组件在 Oracle WebLogic Server 中运行并使用 Oracle 数据库,因此应用服务器管理员或数据库管理员通常是最终接管 SOA 管理职责的人。理想情况下,生产环境的管理不应留给开发人员,这是出于技能、重要性和责任制的考虑。
部署 SOA 组合应用程序有三种可选的方法:
管理员在其环境中很少有(或需要)IDE,这就使第一种部署方法仅限于开发人员使用。在测试、验收和生产环境中,管理员可以使用 Oracle Enterprise Manager 或 Ant 和 WebLogic Scripting Tool (WLST) 脚本。尽管通过 Oracle Enterprise Manager 进行部署在仅处理少数组合时可能是可行的,但首选方法始终应是编写脚本。通过部署对话框一步一步地进行可能很快就使人厌倦,但更要紧的是,它增加了出现人为错误(错误的分区、错误的配置计划等)的机率。请在项目早期开始为构建、部署、测试和启动服务组件架构 (SCA) 组合和 Metadata Services (MDS) 信息库创建 Ant 和 WLST 脚本。Oracle JDeveloper 的 integration 目录和 Oracle SOA Suite 主目录的 bin 目录包含可用于此目的的自定义 (SCA) Ant 任务。WLST 也有针对 SCA 组合的特定命令。有关详细信息,请参见针对 Oracle SOA Suite 和 Oracle Business Process Management Suite 的 Oracle 融合中间件管理员指南 [5]。
SOA 组合依赖于许多其他服务和资产,如数据库、Web 服务、Enterprise JavaBeans (EJB) 或消息传递提供程序(如 Advance Queuing (AQ) 或 Java 消息服务 (JMS))。随着组合从一个环境流向另一个环境(开发、测试、验收和生产 — DTAP),必须同步更新对这些依赖项的引用。在测试环境和生产环境中,从特定组合调用的 Web 服务可能运行于不同端口上。最佳实践是使用随取随用的 Oracle SOA Suite 配置计划来捕获所有环境特定的信息,如 Web 服务端点、Java EE 连接器架构 (JCA) 设置和 Oracle Web Services Manager (OWSM) 策略),将这些信息保存在一个单独的配置文件中,而不是将其硬编码到组合中。Oracle WebLogic 还支持 WebLogic Server 部署计划,但这更多地是针对 Java 2 Platform Enterprise Edition (J2EE) 和 Oracle WebLogic 部署描述文件,不能用于 SOA 组合。
另一项最佳实践是避免为每个环境中的每个组合创建一个单独的配置计划。例如,假设您部署的 SOA 组合的数量增加到 145 个(此数字并非不切实际)。然后您就将有 (145 * 4 =) 580 个单独的配置计划需要维护!更好的办法是将这些计划整合成每个环境一个配置计划。随着这些文件慢慢增大到难以维护的程度,您可能需要开始寻找某种更精细的办法,例如,让每个环境中的每个 SOA 分区有一个计划。同一计划将用于将所有 SOA 组合部署到该特定环境。这最终将提高项目之间的一致性,大大减少出错的几率。
SOA 环境通常由不同组件和中介(如 OSB、Oracle SOA Suite、数据库和 Java/JEE 应用程序)组成。它们各自的配置并非集中式的,而是分散到各种文件和信息库中。这些配置可以是安全设置(LDAP、WS-Security 标头)、消息传递设置(JMS、AQ)、数据库设置 (JDBC)、日志设置、端点设置 (WSDL URL) 等。如果您手动配置每个系统,配置工作很快就会变得难以跟踪了。此外,当您扩大 SOA 规模,需要提供新的环境时,您将希望它们尽可能接近于现有环境,以便进行维护和故障排除;没有什么比环境特定的问题更令人沮丧和耗时了!
解决一致性问题的办法是编写脚本:从一开始就要将尽可能多的配置任务编写成脚本。尽管这需要一些前期投入,但会确保您的供应过程保持一致,并且这会带来所有预料之中的好处:更轻松的维护和故障排除、更快的周转时间、更简单的更新。同时,配置还应记录在众所周知的中央位置,如团队 wiki,以便所有利益相关方可以随时从该位置获得这些配置。
下面是应考虑编写脚本的具体任务示例:
WLST 是完成这些任务的极佳工具。有关 WLST 的更多信息,可在 Oracle 融合中间件 Oracle WebLogic Scripting Tool [6] 中找到。
有时,业务用户或管理员希望了解进入系统的特定请求发生了什么,或者希望得到有关特定流程的状态信息。在低容量环境(几个 SOA 组合和几十个实例)中回答这些问题可能相当轻松。当您有几十个或上百个 SOA 组合以及成千上万甚至数百万个实例时,这样的任务就变得非常困难了。如果业务用户知道故障或请求的确切日期,将很有帮助。但通常您希望能够使用特定数据(如发票编号或员工姓名)来找到信息。
组合传感器是一种方便的、随取随用的机制,允许基于有效负载中包含的特定字段搜索特定实例。可将组合传感器看作数据库索引。
与数据库索引一样,不要弄过头了,您应该只添加必要的组合传感器。要逐个组合地对需求进行评估。对于频繁调用的同步及生命周期很短的组合,应考虑关闭审计线索,只在出错时才重新调用该服务。在这些情况下,搜索特定实例并没有什么更多的用处,反而徒增开销。而长期运行的流程则非常适合使用组合传感器。
附带提一句,可以使用 bpel:exec 活动通过 BPEL 组件设置组合实例的标题。此类实例名称也可用于定位实例。但由于以下种种原因,用这种方式设置实例标题可能有点危险:在编译和部署时不会验证 bpel:exec 活动内部的 XPath 表达式,您需要对它们进行彻底测试。更改实例标题所基于的命名空间或元素名称可能导致运行时故障,最重要的是,这种嵌入式代码难以调试和管理。
以下可能是本文中最重要的一条建议:确保对生产中可能遇到的问题进行广泛的测试。90% 的情况下,随着最终期限的临近,人们忙于对设计进行润色和反复推敲,挤压了留给测试的时间。因此要抵制诱惑,将这些锦上添花的内容留到下一里程碑去完成,因为使您的项目无懈可击要重要得多!至少您应针对以下情况测试和设计恢复过程:
重要的是要了解系统在上述情况下会如何反应,以及如何对这些情况进行补救。按照墨菲定律,这些问题通常发生在您外出度假的时候,因此请确保记录:
这可以保证您睡一个安稳觉并且保证业务不会中断。要记录这些重要信息,wiki 是一个完全可接受的地方,只要确保及时更新并且管理员人员随时可以访问。理想情况下,还应编写补救过程的脚本(Ant 或 WLST),但记录是绝对最低要求。
EIS:企业信息系统 此术语表示系统(集成点),包括消息传递中间件(AQ、JMS、MQSeries)、打包的应用程序 (EBS) 以及其他系统和平台(如 FTP 服务器、文件系统、邮件服务器)。 |
使用 OSB 或 Oracle SOA Suite 中众多 JCA 资源适配器中的一个时,您需要创建一个资源适配器计划,其中包含该适配器的所有 EIS 连接。此计划(XML 文件)将在管理服务器上的文件夹中创建。还需要使其对每台托管服务器可用。除了在每台本地托管服务器上创建副本,还可以使用共享存储,如 NFS 共享。
Oracle SOA Suite 11g 包含 SOA 分区(有些类似于 Oracle SOA Suite 10g 中的“BPEL 域”,不过没有调优部分)。从架构和管理角度来看,分区很有用。分区是一种将组合划分为各种组的机制,非常类似于以文件夹的形式组织文件。如何对组合进行分类完全取决于您,可以根据功能、业务领域等进行分类。分区还有其他用处,它们让您可以对分区内包含的所有组合执行各种任务,比如批量激活和部署。您应考虑使用分区来简化管理。
在基础架构方面,您的总体目标应该是构建一个无需重新设计整个系统就可以轻松扩展的基础系统(以处理更多负载或提升故障切换功能)。强烈建议您抽时间阅读和熟悉内容全面的 Oracle 企业部署指南 [2] 和 Oracle 融合中间件高可用性指南 [3]。现在,下面简要列出了一些必须考虑的事项。
尽管当前的需求可能不要求消息的完全高可用性 (HA) 或高吞吐能力,但将来情况可能会发生变化。如果您部署成功(对此我们毫不怀疑!),将很快发现有更多的服务需求。那时您将需要确保可以横向扩展以处理负载并且可能需要实现非功能性要求,如高可用性。
要实现 HA 和更高的吞吐能力,有两个可选的方法:
一旦 SOA 平台上有了更多的服务,并且这些服务的使用更加频繁,HA 将不再是一个可有可无的功能:它将成为一个绝对必需的功能。
需要注意的是,没有什么捷径能使一台服务器的安装配置扩展为集群,您必须重新安装。正是由于这个原因,始终从集群开始至关重要。如果您没有足够的硬件支持一个 2 节点集群,甚至可以构建一个单计算机集群;这也可以正常工作,并确保您在将来能够扩展。
更多的几点提示:
在此假定您已经熟悉 WebLogic Server 域的概念。域的拓扑结构形式多样,在最简单的情况下,管理服务器和托管服务器位于同一台服务器上,无 Node Manager;在最复杂的情况下,管理服务器与托管服务器分离,有 Node Manager,使用多个 WLS 域将应用程序和服务划分到各个功能域,等等。没有一种“通用”的域拓扑结构;各个项目之间存在太多的可变因素:可用硬件、功能要求等。尽管如此,在这一方面我们仍然可以给您几点提示和指导原则:
有关域拓扑结构及其选择的深入信息,建议您阅读 Oracle 企业部署指南 (EDG) [2]。记住,EDG 指南展示了一个非常全面的部署架构,其复杂程度可能超出了您的实际需要。
运行 Oracle SOA Suite 的最佳操作系统通常是您最有经验的操作系统:从 Windows 到 Linux 和 Solaris。在本文撰写之时,运行 SOA 的典型服务器是 64 位四核计算机,带 16 至 32 GB 的 RAM。Linux、Solaris 和 Windows 是我们最常遇到的操作系统。
数据库是 Oracle SOA Suite 的一项重要要求,更具体地,对于需要持久保存状态的组件(如 BPEL)来说非常重要。(另一方面,Oracle Service Bus 很少用到数据库,除非您使用报表和 OWSM 策略。)尽管 Oracle SOA Suite 支持各种数据库作为其基础架构,且可通过适配器与更多数据库集成,但强烈建议部署在 Oracle 数据库上。这是目前采用得最多的方案,Oracle SOA Suite 包含许多针对该平台的优化,如支持分区等。此外,在数据库服务器上使用 RMAN 和 Data Guard 始终是个好主意。
设法在验收环境中复制预期的生产负载(应是生产环境的完全克隆)。这将确保系统不仅可以满足预期的业务要求,而且也是培训管理员的最佳地方。
在负载测试期间,确保记录一些关键统计信息。例如,给定服务的平均和最大响应时间,或者给定调用应导致给定下游组合的 X 个实例化的事实。您还应监视测试期间数据库的增长,并使用这些结果推断生产环境中将需要的数据库大小。由于要脱水的数据量特定于您的组合,因此测试是进行此项评估的唯一可靠的方式。
每次调用 SOA 组合时,就会将数据添加到数据库中的脱水存储中。这是持久保存状态的地方,对于事务性、审计等很关键。脱水存储的增长速度与 Oracle SOA Suite 正在处理的数据量直接相关。有一件事情是肯定的:到了某种程度您将必须进行清除。清除过程应及早测试,并作为验收标准的一部分;不要到实时运行并用光数据库空间之后才想起这件事!
清除是一个复杂的主题,不在本文讨论范围内。但这里告诉大家,主要有四种方法可用于从脱水存储中删除实例,下面按最简单到最高级的顺序列出:
EM Console 方法主要用于逐个删除特定实例 — 它本质上并不是一种清除方法。高容量环境应认真考虑使用数据库分区,需要注意的是,此方法需要精心的前期规划(它将需要数据库级的分区许可以及对模式进行重新分区,因此避免在实际运行之后采用此策略)。低容量至中等容量环境可以定期(例如每 24 小时)使用循环清除或并行清除。
即使拥有最快的硬件、最好的基础架构、极棒的运营团队,软件编写得不好一样会限制性能。本节我们来看看设计时考虑事项,以确保 SOA 组合性能良好、可维护。
服务重用对于利用 SOA 的好处非常关键。为了使用给定服务,您的项目必须可以访问该服务的接口(通常由 WSDL 和 XSD 来定义)。最简单的方法是导入这些构件并将其保存在本地,即保存在项目中。但这最终将导致需要维护这些构件的许多副本,即每存在一个项目使用这些构件,就要维护一份这些构件的副本。只要服务的合约、接口或版本发生变化,每个使用它的项目将需要重新导入和重新部署关联的 WSDL 和 XSD。从长远来看,将这些共享资源存储在本地并不是一个很牢靠的办法:复制构件不仅会使管理和同步更复杂,而且会影响服务器上的整体内存使用率。Oracle Metadata Services (MDS) 是一个随 Oracle SOA Suite 现成安装的运行时信息库,可用于集中存储和共享可重用构件,如跨越多个组合的服务合约 (WSDL)、规范数据模型 (XSD) 和故障处理配置(故障策略和故障绑定)。组合和组件可以使用逻辑 URL(以 oramds:// 开头)引用 MDS 构件。
最佳实践是使用 MDS 保存这些构件的单一版本,在多个组合之间共享(而不是将其复制到每个组合)。这将避免不必要的重新部署、提高服务更改的速度、降低整体内存使用、帮助避免无效的组合并节省大量的构件维护时间。
本文档的后续各节将重点介绍 MDS 在各种特定目的下的用法。
即使您开始只有少数几个服务,也有可能会遇到一些核心(业务)对象,这些对象将在您的组合和各种来来的项目中反复遇到。例如,如果要将客户门户连接到 CRM,您应花一些时间考虑客户对象应采取何种模式。您不必大费周章地为这第一个项目中将要使用的每个实体定义规范模型。对于较少使用的外围实体,依赖 1:1 映射是完全可以接受的。还要记住,使用规范模型将对性能产生一定影响:要从格式 A 转到格式 B,您将需要从 A 转换到规范然后从规范转换到 B,因此引入了额外的转换。但核心对象有一个规范模型很重要,认真进行一些规划可长期确保未来的重用和一致性:
另一最佳实践是使服务接口定义尽可能保持简洁。不要整个传递组合所操作的所有业务实体,只传递这些实体的逻辑标识符。可以在组合内部使用这些标识符检索使用基本服务的业务实体。此机制称为“声明检查”模式。这会促进松耦合(因业务实体 (XSD) 中的更改不会改变服务接口),可以降低审计线索和脱水存储中有效负载的大小,并确保所操作的业务实体是最新的。如果需要,我们将检索实际数据,而不是在服务中拖延使用可能陈旧的实体。
本文至此对 SOA 采用的是自下而上 的方法,这是一种有组织的、受集成项目驱动的方法,没有大量的前期规划。对于那些向外界公开的接口,考虑采用合约优先 或中间会合 的方法。有许多很好的文章和博客讨论了这些方法。[10]
当遵循自下而上的开发方法时(例如,通过公开由 JCA 适配器向导生成的 WSDL),您对某些属性(如命名、命名空间、操作等)基本没有控制。对于内部接口这样做可能不错,但对于需要长期生存的、逻辑的、自描述的(命名方式)且不经常更改的外部接口,这样做就不太理想了。当您以合约优先或中间会合方式开发服务时,可以控制 WSDL 和 XSD 构件的命名约定,且可以轻松为每个服务添加多个操作。以合约优先和中间会合方式进行开发还允许您引用规范数据模型而不是最后采用自动生成的模式。
下面是其他一些最佳实践:
每个软件开发人员都有自己的风格;每个行业都是这样的。一种风格并不一定比另一种更好,团队为了具备一定的多样性可以接纳某种不同的风格,只要这种风格不会导致根本性的不一致和代码难以管理。底线:每个开发团队应对基本编码约定达成一致。
其目标是随着 SOA 工作的进展,使新加入的开发人员尽可能顺利、快速地进入角色。编码风格的一致对此很有帮助,因为新的开发人员知道对他们的期望。这还可以帮助可能需要钻研代码或只是跟踪各种组合的审计线索的运营团队。
以下是 SOA 项目中风格的两个重要方面:a) 如何设计服务(哪些组件一起形成组合),以及 b) 组合、组件、服务和引用的命名约定。
建议您的编码约定至少应包括以下几个方面:
并不需要 40 页的编码约定文档 — 一页 wiki 页面通常就可以满足要求。
SOA Suite API 的设计是非常通用的,有非常充分的理由。其目的是允许通过多个工具、多个平台、多种方式使用这些 API。但通用性是有代价的:出现可能与特定环境无关的选项、命名可能过于抽象等。
将通用的随取随用的 Oracle SOA Suite API(尤其是 TaskQueryService 和 TaskService)包装在自己的 API 中然后可以向客户端提供,很快就可见到效果。如果可能,请为这些 API 指定自描述性名称并使它们用于单一目的。这将简化开发人员的工作,降低出错的潜在风险。另一个积极的作用是,当随取随用的 Oracle SOA Suite API 升级到更新版本的 Oracle SOA Suite 时,包装器 API 将对客户端屏蔽这些 API 中的潜在更改。
在您的环境中,同一组合有过多不同版本可能会难以管理。同一服务有两三个版本不会有任何问题,这可以支持向后兼容性和敏捷性(不强制服务使用者全部立即迁移到新版本)。但十个或二十个版本就太多了,会导致失控。遗憾的是,用同一版本号重新部署意味着该组合的运行中实例将被标记为陈旧。如果您还有运行中的实例,就要考虑部署为新版本。
部署新的组合版本并不总是因为添加或更改了功能。小的设计更改或更新也有可能导致新的版本部署。
最佳实践是使用域值映射 (DVM) 和业务规则来封装快速变化的逻辑(业务规则)或值和查询 (DVM)。这些组件可以在运行时更新而不必重新部署组合 [17],因此不必停止所有运行中实例。如果可以预见到未来可能需要进行更改,请在开始时使用 DVM 和业务规则。不要将这样的逻辑硬编码到 BPEL 和 BPM 活动或中介器中。
考虑一个服务示例,该服务获取一个文件并将其内容提供给另一个服务。最初我们可能需要从 PDF 文件开始,读取扩展名为 *.PDF 的文件并将其内容映射到 application/pdf mimetype。这个值对可以硬编码在中介器中,但当需要支持其他扩展名/mimetype 组合时,将需要更改 XSLT 并重新部署组合。相反,如果使用 DVM,则可以使用 SOA Composer Web 控制台在运行时添加任何新的扩展名/mimetype 组合,而不必修改和重新部署组合。
另一个示例是基于客户状态评估折扣级别。这些级别将来很可能会发生变化,变化速度可能比组合中实现的整个业务逻辑还快。最佳对策是使用业务规则。这将允许更新各种折扣率而不必重新部署组合。考虑使用新的 11g 决策表来捕获这些规则,这些决策表更直观,非常强大,足以应付各种使用情况。
在这种情形下,业务规则的另一个有用特性是能够指定规则的有效起始日期。有些业务规则(及对现有业务规则的更改)只应在特定日期(如规则或法规生效的日期)之后生效。
在服务和流程建模过程中,如果将处理所有异常行为的逻辑与“正常”流程逻辑混放在一起,则会产生一种常见的缺陷。
以发票处理流程为例。在发票金额超过批准金额的情况下,我们可以添加人工任务并将其指派给财务部门。这类情况可称作业务故障。这些“异常”涉及到业务,且随每个业务服务而不同。在 SOA 组合中对这些活动进行建模是完全合理的。
另一方面,还有另一类故障:技术或系统故障(有效负载错误、端点不可用等)。处理这些故障的逻辑也可以纳入到同一 SOA 组合内。但这样的逻辑与功能或业务需求无关,可能对一些(或所有)组合都一样。向每个组合添加相同的对技术错误的故障处理逻辑,会导致在这些 SOA 组合中存在重复的逻辑并且样板化代码和功能逻辑相混杂。样板化代码充斥 SOA 组合,可让它们的设计看起来像高度复杂的印刷电路板。
如果通用故障处理逻辑嵌入在所有组合中,则创建的 SOA 组合越多,越难更改此逻辑。同时,样板化代码和业务逻辑的混合导致难以维护监督。最佳实践是在 SOA 组件之外通过单独的故障策略文件实现对技术和系统故障的处理。Oracle SOA Suite 为此提供了随取随用的故障策略框架。
您可以为每个组合添加故障策略配置,也可以在 MDS 中集中添加。如果您关注的是低起步、高成长,建议您创建一个通用故障处理机制并将其存储在 MDS 中以便重用。这样可以更轻松地更改组合的故障处理(它只在一个地方定义),更轻松地为新组合添加故障处理功能(只需引用 MDS 构件)。
开始构建组合服务之前,请考虑可能会出现何种故障以及该故障的后果。如果可能,您是否需要修补以纠正重复的条目?或者,您可否使用 XA(全局事务)以便自动回滚事务?使用 XA 时,很重要的一点就是测试和检查每个组件是否都参与该事务。否则,适配器可能在全局事务被提交或回滚之前进行提交(可能通过重试),从而导致重复的条目。使用 AQ 或 JMS 作为全局事务的起点时,最佳实践是配置一个最大重试次数或错误队列以避免无限循环。
最后,您应从一开始就考虑哪些故障处理和预防功能应驻留在服务总线 (OSB) 层与流程层(BPEL 和 BPM)。[4]
Oracle SOA Suite 支持您连同组合一起部署单元测试。您需要 Java 开发人员为其所有代码提供单元测试,正是出于同样的原因,您应充分利用上述特性。此外,这些测试在确保基础架构补丁或升级不会带来任何退步方面至关重要。建议您使单元测试成为构建过程的一个不可或缺的组成部分,具体办法是,使用 Oracle SOA Suite 附带的特定 Ant 任务来运行单元测试。有关背景信息,请参见 [15] 和 [16]。
软件架构与设计之间并非总是界线分明。在本节中,我们将找出一些超越组合设计的最佳实践,并讨论构造、分类和治理服务的最佳实践。
在业务价值和粒度方面,一个返回两个日期之间的工作日天数的简单组合不同于一个实现银行抵押贷款业务流程的组合。
并非所有服务都是平等的。人们通常使用前缀来标明服务类型:业务服务、流程服务、基本服务、组合服务等等。
如果希望拓展 SOA 工作,您将需要一个结构来将服务划分为各种类别。这是必要的,因为不同类型的服务适用不同的原则。下面是这些指导原则的示例:出于性能的原因,两个自动化服务的简单服务组合应在 OSB 中完成;基本服务不应包含流程逻辑;而业务服务应在 BPEL 或 BPM 中实现。
最佳实践是在进行 SOA 工作之初有一个简单、具体的服务分类。勾画出服务类型的整体视图,将各种服务类型与实现它们的各种中间件组件相对应,并确定不同服务类型的治理原则。
您不必设计出完善的 SOA 治理方案,但几个命名约定和分类会十分有用。
服务应具有什么样的粒度?这是在 SOA 领域最常被问到的问题之一。对此没有唯一、确定的答案,但有几个指导原则可以帮助您找到适合您情况的答案。
从一开始进行 SOA 工作就考虑粒度非常重要。尽管重构是软件开发人员工作的一部分,但我们不希望只是因为我们没有想清楚组合应是多大或多小,就得在每个阶段从结构上重构所有组合。确定粒度时,最重要的方面是可能的可重用性:如果一段软件代码被(或将被)多个使用者使用,那么这段代码应是一个单独的服务。否则,我们可以将这段软件代码合并到一个大的组合中加以隐藏。
更具体地说,对于 SOA 组合这意味着:
这种方法还可以帮助隐藏外界不需要知道的小段软件代码 — 这也称为“封装”或“实现隐藏”。只有在组件被外界实际调用时,您才应将它们作为服务公开;而其他组件不应公开。[11]
尽管可重用性对于定义 SOA 组合的粒度至关重要,但它不是唯一的因素。您还应在组织和管理方面进行一些考虑。例如:
同步交互往往更易于理解,大多数较简单的集成项目通常都采用同步交互模式。但异步对于可伸缩性非常重要。此外,业务往往按事件来考虑:考虑收到一个新发票、在航班上检查行李包或雇佣新员工。让您的 SOA 模拟这种模式是明智之举。
考虑以下因素:
通过业务事件或消息传递来构建异步模式将提供应对以上问题所需的分离级别。更具体地说:
版本控制在 SOA 中可能有不同含义:构件版本控制(使用版本控制系统存储和管理软件构件)或运行时版本控制(给行为不同的服务标上不同标签)。尽管这两种并非毫无联系,但每种通常按自己的速度发展。本节重点介绍运行时版本控制。
考虑只能存储版本 1.0 的 PDF 文档的 DocumentService,添加对版本 1.1 的 DOCX 的支持,最终支持版本 2.0 的所有扩展。有趣的是,在生产中的任何一个给定时间点可能出现同一服务的多个版本共存的情况。这允许使用者按自己的速度进行升级:只要他们需要访问新的功能(对新文档类型的支持)且准备好在自己那端处理它们。
在版本方面,Oracle SOA Suite 是灵活的,允许您推出自己的喜爱的版本控制约定,无论是“3”还是“3.0.0”。这种灵活性还意味着您应准备一些约定以确保一致性。除了一致性问题之外,在该领域缺乏明确性可能导致更严重的问题:例如,引入不保留向后兼容性但其版本号并未明确反映此事实的新服务。
最佳实践是在合约 (WSDL) 和消息定义 (XSD) 中包括版本控制信息(即版本号)。将版本号包括在命名空间中是实现此目标的一个好办法。W3C 在 XSLT、XSD 等命名空间中也使用此方法。
一些版本控制提示和技巧:
SOA 环境由多个共同提供业务价值的服务组成。通常个人不可能完全了解整个服务环境和依赖关系。这正是注册表和信息库发挥作用的地方。注册表本质上是所有服务及其关键特征的列表,而信息库存储重要实体服务构件,如 WSDL、XSD、SLA 等。利益相关方可以使用注册表和信息库来深入了解可用服务以及如何使用它们。
对于您在启动 SOA 计划时应记录的服务信息,下面给出一些指示:
当您开始 SOA 工作时,您并不总是能够访问完整的治理信息库,如 Oracle Enterprise Repository (OER)。在这种情况下,wiki 可能是记录 SOA 环境的一个合适的选择。但随着您的 SOA 工作的增加,在简单的 wiki 页面中跟踪依赖关系之类的事物的难度将呈指数级增长。到那时您将可能需要升级到完善的信息库工具(如 OER),并将 wiki 上记录的信息提供给它。最重要的是,在将任何服务转入生产环境时,要通过强制进行更新来确保此信息始终保持最新。
本文介绍了读者在开始部署 Oracle SOA Suite 之前应考虑的一系列主题。所有这些问题,如果及早进行考虑,是相当易于解决的,但如果在 SOA 项目的稍后阶段才考虑,它们可能会麻烦得惊人。与通常的情况一样,认识、一致性和记录是成功实现面向服务的架构的最佳秘方。
截至本文写作之时,Oracle SOA Suite 的最新版本是 11.1.5.0 (11gR1 PS4)。以下所有 Oracle 文档链接均指向该版本的文档库。我们还提供了从顶级库开始的导航路径。我们鼓励您访问 OTN 上的 Oracle SOA Suite 产品页面:http://www.oracle.com/technetwork/cn/middleware/soasuite 并导航到“文档”选项卡以找到最新、最高版本的文档库。
Edwin Biemond — Amis Services B.V. 的架构师 ![]() ![]() ![]() |
Ronald van Luttikhuizen — Vennster 的执行合伙人和架构师 ![]() ![]() ![]() |
Demed L'Her — Oracle 产品管理高级总监 ![]() ![]() ![]() |