阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

是时候考虑 SOA 建设的版本问题了

  • 2007-07-08
  • 本文字数:1478 字

    阅读完需:约 5 分钟

SOA 作为一个软件系统,如果说技术上有个不变的规律那就是——“总在变”,变化也向架构师们提出了如何对 SOA 实施有效版本管理的要求。最近 Boris Lublinsky 分别为微软架构师杂志(《Microsoft Architect Journal》) IBM developerWorks 撰文,介绍他的相关经验。

业务环境的变化常常需要 IT 服务的实现相应作出变化,虽然通过很多新技术或者模式化的实施经验可以帮助我们提供高质量的服务,尽量少的对实现做出变化,但是 IT 技术自身的发展——操作系统、开发工具、开发语言也常常会引发实现上的变化。SOA 自身是个可以有效适应变化的机制,因为它依赖的是抽象的“服务”而非具体的“业务处理”,因此当业务需求变化的时候,一般采用的是变化服务下面的业务处理——修改或者重建,也正因为这个原因,SOA 环境对服务的依赖丝毫不亚于组件开发中的接口。况且 SOA 中很讲究服务的自治性,也就是每个服务独立的修改和维护。当矛盾集中在“自治”与“集成”的时候,SOA 也就到了要考虑版本管理的时候。Boris Lublinsky 在文中提到 3 个引发这一问题的主因:

  1. 服务接口的变化。
  2. 消息的变化,可以进一步细分为“小”变化(“可选”/“必选”的变化、引入新的全局元素等)和“大”变化(修改全局元素、修改枚举值等)。
  3. 实现的变化。虽然理论上这个不会导致服务接口的变化,但是处理上总有些“预处理”和“后续处理”之类的操作,调用的顺序没有变化,但是上下文处理的变化一样会导致最终结果的不同。例如:增加了参数检查后,某些之前成功的调用会变成失败;安全上之前没有数据源(Data Origianl)限制,之后加上了,这样也会导致不符合安全策略调用的失败。

对于上述三种情况,Boris Lublinsky 提出了以下两种解决措施。

  1. 单一服务方法终端地址(EndPoint Address)加版本参数:也就是在调用服务的的时候,同时告诉服务终端一个版本参数,根据这个参数由服务终端决定调用哪个版本的服务方法。
  2. 不同版本服务方法有自己的终端地址:该方式下不需要服务方法前面增加一个版本调度机制,客户应用使用和自己“搭对”的服务方法。

前者虽然在引入新版本的服务方式时对客户程序影响很小,但会带来封装的复杂性,而且随着“坛坛罐罐”的增加,为每个服务方法维护这样一个 if then else 很麻烦。一个改进的办法就是把它们全都集中到一个 Broker 或者 Mediator 上,把判断版本取舍的工作推给它,不过改进方法因为要增加中间环节,所以性能上有损失。

后者实现了 Side-by-Side Execution 的目标,降低了客户程序与服务方法间的耦合。当然,这要付出代价,需要服务注册库在寻址上更加灵活,可以让 SOA 的使用者借助它找到适合它的那个版本的服务方法。

除了应用层面的 SOA 版本问题外,更复杂的是 SOA 基础环境的版本问题,包括:传输机制的修改(例如:HTTP 调用变成了队列调用)和消息编码方式的变化等,Boris Lublinsky 给出的答案很简单——Adapter。相比较“没完没了”的业务服务而言,基础环境中更多的是“相对有限”的技术机制,因此 Adapter 的开发量(或集成工作量)在一个时期内是稳定的。

虽然国内 SOA 的应用在很多企业还是起步阶段,可一旦上了这条船,后续的运行维护工作会越来越繁重,更何况对很多企业而言对 SOA 的定位就是用来“梳理”整个企业关键业务系统间的协作。为了协调好 SOA 环境,现在是该绸缪 SOA 版本管理的时候了。


作者简介:王翔,全国海关信息中心高级架构师,从事海关主要广域分布式系统的设计和实施,多次参与各业务系统的优化。此外,作为信息安全工作组副组长,他还一直致力于应用密码技术和公钥基础设施保障海关业务的安全运行。此外,他还是《程序员》杂志的专栏作者。

2007-07-08 23:05612
用户头像

发布了 61 篇内容, 共 96334 次阅读, 收获喜欢 0 次。

关注

评论

发布
暂无评论
发现更多内容

我的 Windows 利器

玄兴梦影

工具 Win

架构学习历程

关于区块链的“去中心化”,90% 的人都搞错了

CECBC

CECBC 区块链技术 去中心化 专制

[Redis] 你了解 Redis 的三种集群模式吗?

猴哥一一 cium

redis redis高可用 redis哨兵模式 群集安装

iOS 动画 - 窗景篇(一)

柯烂

ios objective-c swift 移动应用 动画

深入理解JVM类加载机制

SkyeDance

类加载 深入理解JVM

ARTS打卡 第2周

引花眠

ARTS 打卡计划

不想被下载限速,教你自建属于自己的云盘!

小傅哥

小傅哥 云服务 云盘 在线网盘

是公司养活了你,还是你养活了公司?

四猿外

生涯规划 程序员 个人成长

深入理解ClassLoader

SkyeDance

类加载 深入理解JVM ClassLoader

深入理解ContextClassLoader

SkyeDance

深入理解JVM ContextClassLoader

匆忙的一周 ARTS第二周

困到清醒

游戏夜读 | 2020周记(5.24-5.31)

game1night

【求锤得锤的故事】Redis锁从面试连环炮聊到神仙打架。

why技术

redis 分布式锁 分布式系统

MySQL实战笔记-事务隔离和MVCC

shiziwen

MySQL 学习 事务隔离级别

坏的开始是成功的一半

escray

除了直接看余额,谁更有钱还能怎么比(三)

石君

零知识证明 多方计算 同态加密

【大厂面试01期】高并发场景下,如何保证缓存与数据库一致性?

NotFound9

Java MySQL 数据库 redis 后端

机器学习算法评估指标——2D目标检测

做技术BP的文案Gou

从技术到管理,我在极客时间的成长历程

邓建春

Linux 自动化运维工具 ansible

杨仪军

Linux 运维自动化

信息的表示与存储-整数的表示

引花眠

java的时间利器:joda

毛佳伟🐳

Java

搞定 HTTP 协议(一):HTTP 与网络基础

零和幺

技术 大前端 HTTP

这些Java8官方挖的坑,你踩过几个?

牧码哥

Java 踩坑 加密 「Java 25周年」

深度解读 Flink 1.11:流批一体 Hive 数仓

Apache Flink

大数据 flink 流计算 实时计算

万字长文,助你吃透Eureka服务发现机制!

周果

分布式 微服务 Eureka

CPU的性能,编译器是这样压榨的!

GPU

算法 cpu 编译器 程序语言

啪啪,打脸了!领导说:try-catch必须放在循环体外!

王磊

Java 性能优化 性能 java编程

产品经理的商业能力

punkboy

程序人生 产品经理 商业 商业模式 商业价值

赢的境界 - 双赢思维

石云升

创业 创业心态 双赢思维

是时候考虑SOA建设的版本问题了_SOA_王翔_InfoQ精选文章