【ArchSummit】如何通过AIOps推动可量化的业务价值增长和效率提升?>>> 了解详情
写点什么

应用程序现代化的挑战和机遇

  • 2020-09-02
  • 本文字数:4652 字

    阅读完需:约 15 分钟

应用程序现代化的挑战和机遇

本文要点


  • 应用程序现代化(modernization,m11n)是一个活跃的领域,需要新的工具和技术来促进技术债务重构。

  • 基本的处理组合,比如以开发者为中心的迁移模式文档和示例应用程序,大幅缓解了向云端迁移的痛苦。

  • 创新者正在采用自动化或半自动化的应用程序现代化,而随着工具的成熟,将会跨越技术采用曲线的早期采用者和早期大众阶段。

  • 遗留应用程序是多样化的,应用程序现代化的机会可以被分为六个领域。对于企业来说,应该选择具有最大影响力和机会的领域。

现状

应用现代化现在是一个类似 DevOps、SRE 或云原生的流行词。这个词对不同的人来说具有不同的含义。如果问一个平台工程师,他会把现代化解释为虚拟机从私有云向公共云的迁移。


如果问一个开发人员,他会把现代化称为遗留应用程序的容器化,而软件架构师会将现代化定义为将应用程序重构为12 factor或15 factor类型的微服务。


所有主要的企业供应商都急于帮助企业现代化 IaaS、CaaS 和 PaaS 工作负载。那么该如何分解这些市场机会?


以下这几种市场条件会触发应用程序的重构和向云原生迁移。

1. 遗留的中间件

很大一部分客户应用程序是运行在私有应用程序服务器上的非云原生应用程序,而且没有使用微服务框架。这些应用程序可能是大型的 Struts 单体应用程序,后端逻辑运行在 WebSphere 或 WebLogic 上。


Jakarta EE开发者调查显示,85%用户使用的是 3 年多前的编程模型,差不多 50%使用 7 年前的模型。遗留服务器上的单体应用程序降低了新功能的发布速度,并显著增加了交付时间。


一个应用程序重启需要 1 到 5 分钟,被绑死在旧 JavaEE 框架和服务器库上,这些让开发者感到厌倦。虽然应用程序重启和内存占用问题现在已经基本得到解决,但是,将现有应用程序迁移到最新的 Eclipse Glassfish 或 OpenLiberty 还是需要时间的。



图片来源:Jakarta EE 2020年开发者调查


专有应用服务器对于企业业务来说意味着高成本。在企业基础设施层和开发层的应用服务器专家离开后,寻找 IT 人员来维护这些系统的成本越来越高。系统、应用服务器和 JDK 版本没有更新,给审计和治理带来了挑战。使用旧 J2EE 框架技术(如 Struts、EJB、JAX-RPC 等)构建的 Java 应用程序很难升级,并且积累了大量技术债务。应用程序还使用了自己开发的底层服务或自定义框架。

2. 遗留的 Java

大多数企业工作负载仍然在使用 Java 8、Java 7 和 Java 6,并且正在迁移到 Java 11/14。客户需要我们的帮助,将他们的应用程序迁移到 Java11 和 Java14,这样就可以使用新版 Java 提供的容器化钩子。旧版本的 Java 给平台升级带来了麻烦,并且从内存使用的角度来看,通常难以进行容器化。旧版本的 Java 还是安全漏洞的来源。



图片来源:Jakarta EE 2020年开发者调查

3. 遗留的 Spring

Spring 框架和 Spring Boot 是排名第一的 Java 微服务框架。因为缺乏 CI/CD 实践和应用程序架构治理,导致应用程序仍在使用旧版本的 Spring Framework(版本 5 以下)和 Spring Boot(版本 2 以下)。企业在升级 Spring 版本方面需要获得帮助。Spring Boot 2.1.x 将于 2020 年 11 月 1 日退役,而 Spring 1.x 早在 2019 年 8 月 1 日就退役了,所以这对于企业来说就是一个问题。重视安全问题的企业希望尽快升级到 Spring 和 Spring Boot 的新版本。旧版本的 Spring 和 Spring Boot 导致企业无法使用最新的框架,如 spring-cloud 和其他有助于加速微服务开发的下游 Spring 项目。



图片来源:Stack Overflow Trends


在为现有 Spring 应用程序自动化升级框架和 Spring Boot 组件方面存在着机会。开发人员不需要阅读繁杂的升级指南,只需要运行一个 Spring Linter 就可以升级框架组件。

4. 从单体到微服务,再从微服务到模块化单体

Jetbrains 和 Jakarta EE 最近发布的开发者调查证实,微服务已经是云端实现 Java 系统的领先架构,但仍然还有企业在使用单体应用程序。领域驱动设计和建模技术,如SWIFTWardley MapsBounded Context Canvas,为创建微服务提供了技术和业务方面的启发。但微服务的复杂性和向更简单的部署架构(如模块化单体)转变的意愿导致这种趋势出现了反弹,具体可以参看这篇文章“迁移到微服务,再回退回来”。


开发库和框架可以通过事件风暴或拆解单体生成用户故事来填补空白。从事件风暴中生成用户故事是一项艺术工作,需要大量的引导,因为DDD已经“破碎”了。将业务能力划分为子业务能力很困难,实现微服务需要专家的判断。有助于理解现有应用程序运行时元数据的可观察性工具和框架与分析器相结合,从理论上说,这些工具和框架可以提供拆解单体所需的信息。vFunction就是解决这个问题的一个工具。



图片来源:JetBrains开发者调查Jakarta EE 2020年开发者调查


结合使用分析工具、CI/CD 指标和 SLO 度量,我们可以通过分析诸如变更故障率之类的指标来指导微服务的合理化。这个过程需要推动者来推动,比如像“这需要做成微服务吗”之类的研讨会。

5. Java EE、Jarkarta EE 和 Eclipse MicroProfile 的分化

Eclipse 和 Oracle 无法就 javax 包名称空间和商标的条款达成一致。因此,所有 Java EE 应用程序现在都必须迁移到 Jakarta EE。应用服务器供应商正在争先恐后地将 Jakarta EE 支持添加到他们的应用程序服务器中。Jakarta EE 要起飞了。使用了 javax 命名空间的应用程序代码可以不做修改直接运行在 TomEE、OpenLiberty 和其他应用程序服务器上,这些服务器使用了 Eclipse 转换器,进行了字节码重写,将 Jarkarta EE 8 引用转成 Jarkarta EE 9,并打上了插件补丁,基于 ASM 字节码转换来处理边界情况。另一种选择是使用像tomcat-Jakarta EE-migration这样的工具,使用 Jakarta EE API 重写应用程序。


对于保守的企业,从Java EE到Jakarta EE的迁移需要进行回归测试,并在新的供应商应用程序服务器上部署,还要进行一大堆字节码重写或代码重写,以解决 Oracle 造成的混乱。企业可以在其他方面投入,而不必担心新版本 Jakarta EE 的功能兼容性和回归问题。这为该领域的其他工具和产品提供了机会。



图片来源:从Java EE到Jakarta EE


Eclipse MicroProfile 的发展速度比 Jakarta EE 快。在不到两年的时间里,发布了 6 个主要 MicroProfile 版本和 16 个组件版本,而 JavaEE/Jakarta EE 却以跨标准组织达成共识的速度发展。似乎标准领域的大多数创新首先会出现在上游的 MicroProfile,然后再流到 Jakarta EE。在可预见的未来,Eclipse MicroProfile 将是独立的,并构建在 Jakarta EE 之上。Eclipse MicroProfile 联合领导和 EE4J PMC 成员 Kevin Sutter 在“MicroProfile和Jakarta EE的下一步是什么”这篇文章中表达了自己的看法。


在 Jakarta EE 允许 MicroProfile 项目进行快速的创新之前,MicroProfile 将保持自己的路线,它有别于 EE4J 项目。



图片来源:MicroProfile和Jakarta EE的下一步


Jakarta EE 和 Eclipse MicroProfile 框架之间的 API 分化需要进行简化。

6. 从虚拟机到容器(V2C)和 Kubernetes(V2K)

Kubernetes 是一个可以自动从虚拟机创建出容器的工具,不仅仅是系统容器,还包括应用程序级别的容器。Kubernetes 可以发现、分析和重新打包已有的应用程序,从而利于云计算的弹性、容错、密度和升级补丁能力。Kubernetes 能够理解应用程序和特定的编程语言框架,从而容器化并构建出符合 OCI 标准的镜像。Kubernetes 就像是一只神奇的独角兽。


现在有很多用来从S2ICloud Native Buildpack构建镜像的工具,还有一些 Maven 插件(如jib)以及 Maven/Gradle 的 task 和 goal(如build-image),不过这些都需要一定程度的人工干预。基于基础设施驱动的自下而上的现代化方式倾向于在不需要开发人员干预的情况下处理工作负载,最理想的情况是不修改代码,并把风险降到最低。平台工程师们希望 VM2Containers(V2C)或 VM2Kubernetes(V2K)产品能够满足基础设施团队的需求,在尽可能不让开发人员干预的情况下处理最多的工作负载。谷歌的Anthos Migrate和 Docker 已经为解决这个问题做出了巨大的努力。最近,亚马逊也加入了这个行列,并带来了大量的工具,比如 AWSapp2containerdocker2awsco-pilot,帮助进行应用程序的容器化,从而将它们部署到 ECS 和 EKS 上。

挖掘价值

供应商如何利用这些优势,创建出一套产品来满足应用程序现代化开发人员目前未被满足的需求和所面临的挑战?哪些产品能够让开发人员更快地将应用程序迁移到云原生架构和微服务架构,并减轻上述的那些痛苦?

1. 实践指南

应用程序现代化实践指南“App Modernization Recipes”和“AWS架构完善”聚集了过去多年迁移应用程序的经验,可以作为开发人员的参考。模式文档可以帮助云架构师在迁移时使用结构良好的方法进行应用程序现代化,并提供可靠的应用程序迁移实践,让开发人员不至于总是徘徊在 StackOverflow 网站上,并提高大型系统集成商迁移的效率。由专业作者和应用程序现代化团队的领域专家共同编写的应用程序迁移指南将提升迁移的质量和数量,让普通开发人员可以轻松地将应用程序迁移到云端,而无需进行大量咨询。一些对遗留组件框架的迁移进行分类的高质量实践指南也可以作为迁移工具的一部分。

2. 超级(重写)linter

打包成 linter 或命令行可执行文件的命令行工具,包含了重写引擎和 DSL,用于进行代码转换。重写工具就是一个超级 linter,自动将遗留应用程序重新平台化,并减少技术债务。linter 使用JavaParser库来解析 Java 源文件,并直接修改源文件,包括 Java、XML 和 YAML 代码。修改是直接对抽象语法树进行的,因此从语法上看,结果始终是正确的,并进行了序列化处理,目的是将迁移工作自动化,并让应用程序处于可编译状态。open rewrite就是一个开始实现这个概念的工具。

3. 对抗性互操作性

超大规模的云提供商利用这种技术来提供特定于某些领域或产品的 API(比如 Cassandra 或 mongo),但底层实现由原生产品提供。例如,Azure Cosmos DB 为 MongoDB 提供了一个 API,兼容 MongoDB 有线协议。新框架可以通过这种方式向现有框架发起挑战。例如,Quarkus 通过 spring-di 扩展的方式为 Spring 依赖注入提供了一个兼容层。Quarkus Spring API 兼容 Spring DI、Spring Web 和 Spring Data JPA。更多的 Spring API 正在计划当中,比如 Spring Security 和 Spring Config。更多内容可以参阅Quarkus Spring开发者文档

总结

一份来自 Stripe 的问卷调查显示,开发人员平均每周花费 13.5 小时来偿还技术债务。维护在生产环境中运行的应用程序以及将它们迁移到云端,这两大压力压在了开发团队和平台团队身上。应用程序现代化需要通过文档、产品和框架来扩展和提高效率。现在是时候了,供应商们应该加快步伐,企业也应该在迁移和转换服务上加大投入,以便加速将部分或全部应用程序工作负载迁移到云端。专注于将工作负载迁移到云端的企业将通过提高开发人员生产效率、减少技术债务和利用云计算成本效率和灵活性来解决他们所面临的竞争威胁。


作者简介


Rohit Kelapure 是将应用程序迁移到云端和任务关键型系统现代化方面的专家。Rohit 为应用现代化制定了 GTM、营销和产品战略。Rohit 正在不断改进产品和系统,以支持销售、交付和开源社区,交付有价值的成果。Rohit 活跃在云计算、Kubernetes、单体重构和应用程序现代化战略等博客上。Rohit 最近参与的网络研讨会涉及各种各样的主题,如中间件现代化、大型机迁移以及将单体应用程序迁移到现代云的工具和方法。Rohit 是 Spring 和 Java EE 技术方面的专家,并在他的 WebSphere 和 All Things Cloud 博客中广泛地讨论了这两个主题。


原文链接


The Opportunity in App Modernization


2020-09-02 14:282448

评论

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

在线常用crontab表达式大全验证解析

入门小站

工具

个全中文注释的迷你Spring!

程序员阿杜

Java spring springboot

AppCube快速开发问卷调查应用在WeLink发布上线

DS小龙哥

3月月更

web前端技术Mongoose详解

编程江湖

java高级用法之:在JNA中使用类型映射

程序那些事

Java 程序那些事 3月月更 JNA

架构实战营6&微信业务架构&学生管理系统方案

唐诗宋词

在线HTML压缩工具

入门小站

工具

vivo 商品中台的可视化微前端实践

vivo互联网技术

可视化 前端特效

[Day2]-[回溯] N皇后问题

方勇(gopher)

LeetCode 动态规划 数据结构算法

解决报错:SSL certificate problem: certificate has expired

liuzhen007

git

Linux常用命令分享:有手就会,但能解决95%以上的问题

优麒麟

Linux 开源 计算机 优麒麟

架构实战营-第6期 模块一课后作业

乐邦

「架构实战营」

成为 DevOps 工程师需要具备哪些能力?

SoFlu软件机器人

【Git教程】Git最全使用指南

阿里云云效

git 云计算 阿里云 DevOps Codeup

Apache Impala架构解析及与Hive、SparkSQL的性能比较

编程江湖

如何建立高效的质量保障机制

老张

软件测试 质量保障 交付能力

CPU的“花招”已耍完?无指令集架构颠覆旧套路

OneFlow

人工智能 机器学习 深度学习 英伟达 芯片

分布式事务详解:分段提交与最终一致性

分布式事务 可靠消息最终一致 TCC 构架 最终一致性

【研讨会报名截止最后一天】全程参会,还有惊喜奖品等你拿!

龙智—DevSecOps解决方案

CI/CD 在线研讨会

摩尔定律的现在及未来

科技新消息

Linux之time命令

入门小站

Linux

什么是404页面?

源字节1号

404

React Router 6 (React路由) 最详细教程

蒋川

React react rout

Echarts 折线图完全配置指南 - 手把手教你设置 Echarts 折线图详细教程

蒋川

Vue eCharts

TDengine 和 InfluxDB 查询性能对比测试报告

TDengine

数据库 tdengine

赋能创新,深开鸿重磅发布面向金融行业KaihongOS发行版

科技汇

DiDi Kafka-Manager安装和简单使用

云原生

kafka spring kafka manager

Video.js 使用教程 - 手把手教你基于 Vue 搭建 HTML 5 视频播放器

蒋川

Vue video.js

【躲过裁员,成功上岸】发现小公司有不好的苗头,赶紧学习!

小傅哥

面试 小傅哥 中间件 项目

【ELT.ZIP】OpenHarmony啃论文俱乐部——轻翻那些永垂不朽的诗篇

ELT.ZIP

OpenHarmony 数据压缩 ELT.ZIP

微信业务架构图&学生管理系统架构设计

高山觅流水

架构实战营 「架构实战营」

应用程序现代化的挑战和机遇_DevOps & 平台工程_Rohit Kelapure_InfoQ精选文章