SCMLife.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5340|回复: 1

[推荐] 利用RSA定义应用程序架构,第 2 部分: 迭代优化架构

[复制链接]
发表于 2012-4-23 13:29:38 | 显示全部楼层 |阅读模式
本帖最后由 技术狂人 于 2012-4-23 13:37 编辑 4 E8 ]5 l$ ?5 N
5 |7 s% u' j6 i% E) G/ V
简介
7 \. s  r) x' T+ [2 ]* g( ]" P, F" X8 G4 X# A5 f- a: @
架构构想是一个灵活的最佳实践,可以概述用于指导软件密集型系统的开发和测试的技术决策。软件架构师通常使用以下步骤来勾勒软件密集型系统的目标架构(请访问本系列第 1 部分,参阅 参考资料 部分):
. _2 C6 e8 O' W3 {. M5 I" m
  • 确定重要的需求
  • 确定候选架构
  • 定义初始部署模型
  • 定义域模型
    & x5 \; A5 g+ ~8 y
% Y3 W, y: S: I+ ~/ Q
但架构思考并不是一次性的活动。它是经验丰富的敏捷团队融入其开发工作的一项持续性工作。在您的团队逐步构建系统的过程中,您会发现新的技术挑战,并制定出新的架构决策。
7 b5 T* W* o  n+ a( s" I以下架构活动通常在开发迭代过程中执行:5 \5 `1 X, ^8 w! E9 _1 x
3 {$ h9 `9 b5 M5 d8 a! `* z$ D
  • 优化架构机制:可以满足在第一步中确定的架构性重要需求的技术概念。
  • 优化设计元素:架构性重要设计元素
  • 优化部署架构:部署单元和拓扑
    2 v  S5 G8 X" ~! m

/ g: @' Y" Z& V* u4 K& c

; E  S7 L" e( A/ B& D+ D以迭代的方式优化架构
/ @( a9 _( t' ^0 W2 m# U像我们了解的那样,通常您并不需要为系统的所有部分指定设计。就像项目中的其他部分一样,只有某项工作会为您带来价值时,您才会执行它。但软件密集型系统的某些部分必须比其他部分指定得更详细。这可能是因为某些组件非常难以理解和实现,或者因为它们影响了其他子系统的关键元素。有些组织需要制定更详细的规定,然后才能将开发转交给业务合作伙伴或地理分布的开发团队。有些团队必须更仔细地指定并记录他们的架构,以满足合规要求。9 W- a. N! O# N9 b* F1 N0 v# q- i  G8 k
优化架构机制% c- K2 v: a% [* X# }
可用的电子书从作者的博客文章下载电子书 "Evolutionary architecture with Rational Software Architect v8"。 5 o5 a2 Q0 a( j2 y# x( U
2 k8 p; C$ J. z- Z6 O0 w) q" I
如果您的团队需要指定一个组件的设计,那么您可以从定义架构机制开始实现该目的。9 w9 F6 o& O7 T
这一阶段的目标是,对实现系统的重要需求所需的分析类进行定义。换句话说,您要确定满足特定业务需求所需的所有元素。0 a: n. J' ~# F8 e9 w% K
为了获得更好的可视化表示,可以选择将这些类与一个分析构造原型 (stereotype) 相关联。使用 Boundary 构造原型来代表一个类,作为系统的接口。使用 Control 类描述一个组件,执行对其他类的控制。使用 Entity 构造原型指定承载数据的类。
; F. n2 y4 J: ]8 l这些分析构造原型的图形表示如图 1 所示。$ U% D5 ^' W+ v" O2 Z+ U; r, S  s

# {7 ^5 v! Y( j( a& F' L, F图 1. 分析构造原型
! z. U0 l4 s9 g' d$ I
- ]4 ]! L  r- n- g图 2 显示的分析构造原型适用于系统的一个重要需求。在 Yummy Inc. 的示例中,订单业务涉及一些元素(分析类),如顾客、菜单和支付处理。/ ?4 _, Z1 Y6 X  w6 m, Y
2 A8 e. F$ g& \. o* J

9 ]. a* U/ z2 ]4 ~图 2. 订单包的分析元素
( h# E* I7 r$ b$ A1 {8 z4 q1 U + E! U4 d+ R- N& |
在确定分析类(参见图 2)之后,您可能还需要定义某些重要需求的静态和动态方面。
) y3 K# g2 `0 y/ j这一步的目的是,为每个重要场景定义其静态和动态两个方面。Rational Software Architect 通过提供一个用例实现模板来帮助架构师完成这项任务。( G5 f, S' B. v- L4 c  q2 g
默认自带的模板(图 3)有一个记录静态方面 (Participants) 的类图,以及记录动态行为的一组序列图(Basic Flow、Alternative Flow 等等)。
& u& r2 S6 e5 S* Q2 A$ y7 Z0 Z$ c" E' x; x. [/ k
图 3. Order Menus 功能的用例实现模板
6 h) m2 Q2 o: i2 ~0 {
+ A, o8 [1 V; ^每个图分别解决组件的一个不同方面。类图(图 4)描述在用例实现(动态)中所涉及的所有类,而序列图(图 5)则说明它们之间的交互(动态)。
: C7 I) Q& ^; l: n7 z7 h+ y0 j2 k0 Z( }2 _- _+ V) I4 Q
图 4. Order Menus 功能的类图
% I' m3 Z: R9 c & x* {' d4 `9 u  A: c

$ B0 b/ y' `/ n+ z6 h- ]# q6 K图 5. Order Menus 功能的序列图/ n" {& ^( \8 Z4 b

/ Q" d6 m( t, ?1 J在结束此步骤时,您已利用 UML 模型开发了系统的一些重要需求实现。当您需要描述软件密集型系统的静态结构和某些组件的行为时,这是架构中的一个重要组成部分。
0 Y2 J$ m# a/ X9 j. T" h
5 Z8 [( x. J. \6 H) e. J由于 Design Model 仍然是与技术无关的,所以您可以将它重用为多种实现的起点。# l  s2 y7 H) M3 I
优化 Design Model
$ u+ ?; I# N$ @2 P6 A# m+ R当您定义好您想如何在分析模型中实现重要需求之后,就可以深入研究组件的具体设计了。
" T2 ~( i) [/ h( J& m$ N' P8 G虽然 Design Model 是抽象的,但 Design Model 必须更接近于实际实现。软件架构师通常需要确定与实现解决方案所用的技术相关的一套目标和约束。Design Model 通常不是从头开始开发的,而是从您已经定义的分析模型演变而来(参见图 2 和图 3)。
' W' R. ^8 H$ [" O3 H3 Z% Q5 ]5 c在我们的示例中,Yummy Inc. Online Catering 是使用 Java EE 平台开发的。数据持久性利用了 Java Persistence API(参见 参考资料),应用程序逻辑通过 Session Beans 实现,而交付服务的访问则通过 Web 服务实现。
+ j2 |* u7 U7 ~9 U1 A: i; G在架构和设计中,广泛采用的最佳实践是:定义解决方案的不同层次,以及它们如何相互关联。Java EE 的 n 层架构在各层次之间促进了关注点的分离。. a+ n. q1 P7 w3 X: e, F! M
在 Rational Software Architect 的 Architectural Layers 透视图中,设计模板提供了一个视图,供您定义层与层之间的依赖关系(图 6)。
: n6 L1 W# F9 w2 _" |. Z
/ C8 C7 }0 D' G4 e6 F2 F& j+ v图 6. Online Catering 系统的 Architectural Layer Dependencies 视图
% K7 B% M4 p$ A2 e& k2 N( M4 @
9 W2 \3 Y6 u8 ~# I/ g利用已定义的架构层次,软件架构师可以生成设计的第一次迭代。Rational Software Architect 设计模板为该活动提供了一个预定义的结构。组件规范通常包含用来与组件进行交互的接口和数据(图 7)。它通常是软件架构师需要定义的第一个方面的内容。对于每个组件而言,需要指定它操纵的数据和接口(包括可用的操作),这是很重要的。- B) K! H/ ?3 U- L8 [
: c% B* J3 S- b+ B& ?! T7 a, J- O1 [
- F8 q8 v; K2 f, {  Z- A6 [
图 7. Online Catering 系统的设计包
! m  \  R' G3 ?( W4 N# Y
/ t3 `0 T- B) {# C0 H6 `请注意,因为在这个阶段已选定实现平台,所以我们可通过特定技术信息来丰富设计模型。在我们的示例中,持久性对象都标有一个JPA 构造原型,用于确定如何将对象模型映射到数据库。
  P% T# U. |! h对于软件密集型系统的某些组件,您可能会更详细地指定设计。请记住,只有在可以帮助您的团队实现和交付应用程序的情况下,才可以在设计中添加细节。在图 8 中,已针对特定目标创建了详细的类图。团队希望使用由 Rational Software Architect 提供的一些转换,根据设计模型生成 Java 代码(有关转换的更多信息,请参阅 参考资料 )。& C5 \% B* p; t4 y6 p0 o

0 e5 o' ?5 i2 G7 d图 8. 用于代码生成的一些详细的类图) F0 m  r9 E4 E% W0 P( X! m" q) _

4 _3 A+ z" S4 m0 n为某些组件创建具体设计并不总是软件架构师的责任。根据项目团队的规模和技能,可以相应地将软件设计师承担的任务分配给一个或多个不同的人,如高级开发人员(架构、设计和开发之间的界限有时并不那么清晰)。- I8 T+ C$ y( m+ Z
优化部署架构
$ V/ J! x# i- d' V架构师负责建立满足业务需求的系统。软件密集型系统的重要方面之一是,如何在物理架构上部署它们。初始部署模型通常是在构想架构时定义的(请参阅 参考资料 部分,访问本系列第 1 部分)。随着项目的进展,架构师会优化部署架构,以整合与生产环境相关的非功能性需求和约束。* ~7 M3 Z9 j7 ]" S0 a
利用 Rational Software Architect 的部署规划工具,您可以创建拓扑来显示信息技术资源之间的关系。您还可以规划和验证部署场景(有关利用 Rational Software Architect 实现部署规划和自动化的更多信息,请参阅 参考资料 部分)。4 W8 b7 V' J" ^! W2 F
Rational Software Architect 有助于在抽象的不同层次实现部署分析。您可以创建逻辑拓扑,从而捕获与软件密集型系统的运作架构有关的决策(图 9)。在逻辑拓扑中,您可以高度抽象地描述某个系统。您可以指定如何组织和连接应用程序的组件,将它们放置和托管在哪个地方。请注意,代表解决方案的单元并不总是从头开始创建的,而是从 UML 元素派生的,以便可以实现更好的可追溯性。2 G9 k9 J7 Y7 U& n4 a3 K8 E) z: x

6 a( ?" `7 j& s% ~图 9. Online Catering 系统的逻辑拓朴示例9 _5 P9 I+ U" v6 G- a! \/ s
0 O6 v4 f$ J' J: `

3 d1 h  _5 w2 W9 q; m架构师也可以定义一个拓扑来描述如何部署应用程序。这种类型的模型描述了应用程序的具体、完整的部署实例,以及部署应用程序的相应具体基础架构(图 10)。1 S# m; d% o+ O$ k/ d) w

7 l$ c) n' C9 k- W  H1 E' Z9 @图 10. Online Catering 系统的详细部署模型示例1 w! x! B) f+ y6 t9 e: H/ N
( ^& J6 E1 c, j

9 n8 D4 r& r, q- X  W6 M

" q8 W" o2 w9 y+ y7 ^以递增的方式构建系统/ F* n4 ?9 Y- b1 D
致力于交付软件密集型系统的团队必须始终牢记,可用的软件是进度的首要衡量标准。开发应用程序所需的活动已经超出了本文的范围,但您需要重点记住的是,成功的团队都将架构和设计融入了其开发工作中。" j8 R6 a, z+ [6 z- {; y. q; T
持续的架构思考是开发工作的一部分,如果没有考虑到变更对整个应用程序所产生的影响,那么团队不应该编写新的代码,亦不应该修改现有的代码。修改现有代码的一项流行技术称为重构(有关重构的更多信息,请参阅 参考资料)。Rational Software Architect 中提供了大量的工具集,有助于代码的开发和重构。您可以使用重构协助,改变代码的结构(图 11)。您还可以使用架构发现功能来确定应用程序代码中的模式和反模式(图 12)。这两种特性都可以帮助您编写更好的代码,并在软件开发的早期阶段发现问题。0 q, Z& d) G2 k
* ^8 r' q( o3 M: a( r* V8 h' J$ f) o
图 11. Rational Software Architect 中的重构协助
! w, ]. M% ~, J0 s, [2 S
$ n( e3 ~, s/ v% z) ]! W& S! [5 O+ B" s' n3 ~$ m1 C
图 12. 确定模式& h. N/ P; T1 K! Y7 t; u
3 D( V, o, v: r$ V
如果您已经在架构思考活动中创建了一些模型,那么您也可以决定是否将它们转换成代码。Rational Software Architect 自带了一组转换,可使用它们生成 Java 代码、Java EE 元素或 SOA 构件(参见图 13)。您还可以从现有的源代码中生成模型。9 |& T8 Y% Q$ f2 s

$ e* ~- `4 ~2 d! q图 13. Rational Software Architect 中的转换
2 [- r8 Y. ?' n1 o% E
, @4 ]# C8 R! r  Y+ u在您以递增方式构建系统的过程中,您将创建一些可用的软件,这些软件应符合在架构思考活动期间制定的设计决策。  F$ j' `; J/ a( m9 X8 G* @


7 x% S3 O: j+ X/ l4 X, o. F" g% Y! ^. r
; X: u$ b1 ~, A+ N7 P+ r- u结束语) d1 J4 P8 f$ n4 a
敏捷方法促进了用来逐步构建系统的短迭代的采用。虽然主要在瀑布模型中采用的 Big Design Up Front(请参见 参考资源 了解有关 BDUF 的信息)已被证明是一个低效的方法,但这并不意味着必须在敏捷项目中禁止架构和设计活动。设计必须是有意识的和紧急的。说设计是有意识的,是因为在项目开始时,需要根据产品库预测一些技术需求(架构构想)。而说设计是紧急的,则是因为在开发迭代过程中,您会根据团队发现的新技术挑战来调整和丰富设计。
- p# U+ a, s1 F% H! b% g在本系列的 利用 Rational Software Architect 定义应用程序架构,第 1 部分:构想架构 中,我们将重点放在概括架构以及根据开发需求调整技术愿景的典型任务上。在第 2 部分,我们介绍了在开发迭代中如何优化架构。Rational Software Architect 为整个项目生命周期提供了模型模板,从不同的视角指定软件密集型系统的架构(图 14); k+ Z3 B7 b; P
( N% f, n1 b# V8 _

# v' [# ?% R* E$ {8 d4 j7 a图 14. 适用于各种架构视图的模型
1 F4 B' @- Q) T1 `; i
* r% a9 t- q1 m: U9 S/ t4 y4 R架构思考是经验丰富的敏捷团队在其开发工作中进行的一项持续性工作。它并不总是产生正式的图表。请记住,在您的环境中,如果 UML 不是正确的方法,那么没有什么能够阻止您改用 Rational Software Architect 草图,就像您在白板上进行操作一样。与 UML 图相比,Rational Software Architect 草图没那么正式,但对于特定项目,它们可能是一个不错的选择。
5 G" {* b  t! J) @6 [5 C  g( @
) n  D, f. X! [7 i* i- m

( P) [7 o5 J" b  W2 E! [. y) @* u' }2 X5 S5 \( X3 d4 Y2 P" p1 i

$ k7 r/ k" B# p, S7 d  w% x

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
 楼主| 发表于 2012-4-23 13:32:30 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

SCMLife推荐上一条 /4 下一条

QQ|小黑屋|手机版|无图版|SCMLife.com ( 京ICP备06056490号-1 )

GMT+8, 2018-10-22 08:23 , Processed in 0.062046 second(s), 6 queries , Gzip On, MemCache On.

Powered by SCMLife X3.4 Licensed

© 2001-2017 JoyShare.

快速回复 返回顶部 返回列表