维护旧项目_维护旧版应用程序的实用技术

维护旧项目

遗留应用程序很少如下所示:

在这张美丽的图中,层和块清晰地分开并通过定义明确的通道进行通信。 可以轻松移动,更换或添加块,以支持那些重要的“功能”:可扩展性,可伸缩性,可维护性……

在现实生活中,旧版应用程序可能看起来像这样:

而且,如果您是一个不幸的开发人员,负责维护旧版应用程序,则有时您会感到迷宫中的老鼠; 每次您转弯时,都会有更多意想不到的角落和角落,甚至还有死亡陷阱。

我已经负责维护这样的遗留应用程序两年以上了,在本文中,我想分享一下我如何实用地维护大型遗留应用程序的经验。

我强调“务实”一词; 由于遗留应用程序可能承担很多技术债务,因此偿还所有技术债务既不可行也不经济; 选择正确的战斗必须具有战略意义。

监视敌人

我正在维护的大量旧版应用程序的简要说明:

大房子是JBoss 4.0。 由于某些原因,JBoss 4.0进行了一些神秘的调整,使其难以升级。 因此,房屋的建造不是很坚固(因此正在下雨)。 这两个小屋代表部署在JBoss上的两个Web应用程序(两个WAR)。 一所房子要小得多,目的也更小。 每个页面必须由两个机构提供服务。 有三个连接池,两个事务处理机制,一个自制缓存,一个自制集群机制,一个自制RMI机制等。

维护旧版应用程序的第一步是了解它。 对我们来说,了解应用程序的每个细节都是不切实际的,但是我们需要了解全局:

  1. 为什么要在一个页面上放两个WAR? 两个WAR如何相互影响? 开销是多少? 我们如何合并它们?
  2. 交易如何处理? 两个WAR,三个连接池和两个事务机制之间的交互是否存在事务损坏的风险?
  3. 我们如何知道性能瓶颈是在数据库中还是在代码中? 如果在代码中,我们如何向下追溯?

静态分析代码是不充分或不准确的。 我们开发了几种工具来在运行时监视应用程序以回答这些问题。 我们小心地将这些工具实现为附件:它们不会与应用程序代码纠缠在一起,因此它们不是我们必须维护的额外代码。 有关这些工具的更多技术细节,请访问我的博客

SQLTracer

可以为每个网页打开此工具,并跟踪发出哪些SQL查询,每个SQL查询多少次以及经过的时间。 非常重要的是,它会为这些查询生成tkprof,以进行性能故障排除。

技术细节

SQLTracer使用以下逻辑监视JDBC操作:当页面请求到达时,javax.servlet.Filter检查是否为该页面打开了跟踪并将页面信息存储在ThreadLocal中。 当从连接池中获取连接时,它们的动作会被AspectJ建议介入,该建议跟踪SQL语句,调用时间和经过时间。 使用Oracle dbms_session.set_identifier()将连接标记为相同的标识符,并使用dbms_monitor.client_id_trace_enable()跟踪其操作。 此技术允许跟踪不同的连接。

性能

PerfSpy是运行时日志记录和性能监视工具。 我们使用它来监视各个页面,它将记录方法调用,经过的时间,方法参数和返回值–简而言之,它会进行逐步调试并存储所有内容以供以后检查,而无需您实际上在IDE中进行逐步调试。 它进行运行时代码分析并找出性能瓶颈。 它具有一个UI应用程序,该应用程序将方法调用显示为树,并提供了操作树的方法-隐藏节点,搜索节点,标记节点等。方法参数和值也显示为树。 这是屏幕截图:

使用此工具,我们可以回答以下重要问题:

1)两个WAR如何协同工作? 我们可以得出结论,不需要两个WAR; 它使部署复杂化,并增加了内存和性能开销,并且将两个WAR合并在一起非常容易。

2)三个连接池和两个事务处理机制如何一起工作? 我们最初认为,当某些代码启动事务时,它将向下传递事务,因此所有操作将在单个事务中完成。 但是,我们发现在某些情况下,事务不会传递下来,并且操作不会在单个事务中完成,这解释了我们在用户实例中看到的许多数据损坏问题。 Perfspy能够提供见解,因为它记录了方法参数和返回值(包括其系统哈希码)的详细信息。 因此,在方法调用树中,我们可以看到何时以及在何处启动新的连接或Hibernate会话或新的事务。

3)某个网页的性能瓶颈是什么? SQLTracer在数据库方面显示了性能问题,PerfSpy通过显示重复的调用和经过的时间在代码方面显示了性能问题。

技术细节

PerfSpy使用AspectJ进行运行时监视。 PerfSpy具有抽象的方面,可以进行日志记录,监视和跟踪。 一旦这方面付诸实践,它将查阅配置文件来决定应收集多少信息以及应执行哪些代码分析。 要使用PerfSpy,您需要编写一个从抽象PerfSpy方面扩展的方面,在该方面中,您指定要捕获的代码流以及代码流中的哪些方法。

通常,应用程序使用某种框架来满足通用目的,并且该应用程序对该框架进行扩展以执行特定的操作。 例如,Struts 1.2具有org.apache.struts.action.Action,可以对其进行扩展以提供网页操作。 PerfSpy旨在监视此类框架。 例如,要使用PerfSpy监视Struts动作,可以编写一个继承自PerfSpy方面的方面:

@Aspect
public class PerfSpyStrutsAsepct extends AbstractPerfSpyAspect {
        //specifies which code flow to spy on 
        @Pointcut ( "cflow (execute(* org.apache.struts.action.Action.execute(..)))" )
        public void cflowOps() {
        }

        //specifies which methods in the code flow to spy on
        @Pointcut ( "execution(* com.myCompony.myPk1.myPk2.*(..))" )
        public void withinCflowOps() {
        }

}

配置文件可以指定要监视哪个具体的Struts操作类。 通过这种方式,可以打开或关闭各个页面的监视功能。

BLSpy

BLSpy代表业务逻辑间谍。 通常,我们的用户(有时甚至是我们自己)可能会对我们的旧版应用程序产生的数字感到困惑; 他们想知道应用程序如何计算这些数字。 用户可以为各种类型的公司号码打开间谍功能。

使用此工具,用户现在可以解决此类混乱,而无需与我们联系。 而且我们自己甚至已经使用此工具检测到一些计算缺陷。

技术细节

BLSpy是在PerfSpy之上开发的。 PerfSpy允许我们捕获计算代码流,但是我们想以商业术语向用户展示计算。 例如,我们想要传达这样的信息,例如“计算部门A的本周人力资源成本,我们从部门A提取了人力资源的时间记录,发现Jason从事数据库维护工作了20个小时,他的时薪是30美元...”。 为此,我们对计算流程中涉及的方法的含义进行注释,并在运行时提取含义并与PerfSpy捕获的方法结合,然后向用户提供有意义的信息。

挑战

传统应用程序可能像雷区。 您想挖掘的每个地方,可能会发现比预期更大的问题。 堵塞每个Kong是不可行或不经济的。 通常,管理层喜欢缩小工作团队的规模,以维护旧版应用程序越来越小,因此必须计算每笔投资。

有一个自然度量可以衡量每个功能区域的缺陷。 该应用程序被许多用户使用,遇到问题时,他们会向我们记录票证。 他们在故障单中选择发生问题的功能区域。 但是,此指标不足,因为:

  1. 此指标不能提供有关体系结构级缺陷的广泛视图。 对功能问题进行分类很容易。 另一方面,诸如性能问题,可伸缩性问题和稳定性问题之类的非功能性问题,尽管它们可能会在功能区域中表现出来,但其根本原因却可能跨越功能性区域边界。 例如,在订单模块中创建订单的缓慢或在投诉模块中的投诉缓慢可能是由相同的基础排队机制引起的。
  2. 它激发了使用“快速而肮脏的”策略扭转数字的动机。 例如,我们的交易机制会导致很多肮脏的问题。 通常的“快速且肮脏”的策略是直接从数据库中删除肮脏的数据,或者解决代码中的肮脏数据,这可以快速地解决该指标,但根本无法改善系统的运行状况。

我们决定在此自然指标的基础上创建一个指标,我们称之为“高影响力”指标。 该指标从本质上突出了困扰遗留应用程序的最有影响力的问题,并要求高层管理人员支持以改善遗留应用程序的体系结构。 我们将“性能”,“稳定性”,“脏数据”和其他一些非功能性问题定义为“严重影响”,因为它们需要较长的时间来解决或经常导致用户升级。 我们将每个用户报告的问题归为以下几类。 以下是此指标的简化图示:

在此图中,尽管功能性问题最常发生,但它们更易于解决,用户也不经常升级。 相反,稳定性问题尽管很少发生,但经常升级,并且难以解决。 稳定性问题往往会激怒用户,因为它们是随机发生的,甚至宽容的用户也可能不知道何时以及如何为随机事件做准备。 脏数据是稳定性问题的一种,我们将其隔离开来,因为过去经常发生脏数据问题。

用户愤怒(升级)是吸引上级管理人员注意技术债务并说服他们投资以改进遗留应用程序体系结构的好方法。

战斗

我们知道我们要使用“高影响力”度量标准解决的问题,并且我们知道如何通过各种间谍工具更深入地探究遗留应用程序的黑暗秘密,我们随时准备参与其中。

重构遗留应用程序可能会让人感到恐惧,因为遗留应用程序往往几乎没有单元测试。 本文介绍了我们的方法。

结论

维护旧版应用程序是一场持续的战斗。 使用“高影响力”指标,我们选择了下一个要打的大战。 使用各种间谍工具,我们可以发现敌人的来龙去脉。 并使用我们不断构建和完善的测试框架,我们可以征服敌人(重构旧代码)。

翻译自: https://www.infoq.com/articles/Pragmatic-Legacy-App-Maintenance/?topicPageSponsorship=c1246725-b0a7-43a6-9ef9-68102c8d48e1

维护旧项目

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值