容器和应用程序:扩展、重构或重建?

技术领域是不断变化的,因此,任何应用程序都可能在很短时间内面临过时甚至淘汰,更新换代的速度之快给人的感觉越来越强烈,我们如何使传统应用程序保持活力不落伍?工程师想的可能是从头开始重建传统应用程序,这与公司的业务目标和产品时间表通常是相悖的。如果现阶段正在运行的应用程序是正常工作的,这时候你很难找到正当而充分的理由让技术人员花六个月重写应用程序。代码债似乎注定意味着失败。

众所周知,产品开发向来都不是非黑即白那么简单,必须要权衡各方妥协折衷进行,虽然完全重写的可行性不大,但应用程序现代化的长远利益仍然值得重视。虽然许多组织尚未能构建全新的云本地应用程序,但通过使用一些技术比如Docker等容器技术,仍然能够实现传统应用程序的现代化。

这些现代化技术最终可以归纳为三种类别:扩展,重构和重建。在开始介绍它们之前,让我们先来谈谈关于Dockerfile的一些基础知识。

Dockerfile基础知识

对于初学者来说,Docker是一个容器化平台,它包含了基本上可以安装在服务器上的所有东西,即“在一个完整的文件系统中包含一个软件运行所需的一切:代码,运行时,系统工具,系统库”, 而且没有虚拟化平台的开销。

虽然容器的优点和缺点不在本文的讨论范围之内,但还是不得不提,Docker的最大优点之一即只需几行代码就能够快速轻松地启动轻量级、可重复的服务器环境。这种配置是通过一个名为Dockerfile的文件完成的,Dockerfile本质上是Docker用来构建容器镜像的蓝图。在这里,Dockerfile启动了一个简单的基于Python的Web服务器以供参考:

# Use the python:2.7 base image
FROM python:2.7

# Expose port 80 internally to Docker process
EXPOSE 80

# Set /code to the working directory for the following commands
WORKDIR /code

# Copy all files in current directory to the /code directory
ADD . /code

# Create the index.html file in the /code directory
RUN touch index.html

# Start the python web server
CMD python index.py

这个例子比较简单,但已经很能说明关于Dockerfile一些基础知识,涵盖扩展预先存在的镜像、暴露端口以及运行命令和服务。只要基础源代码架构设计合理,此时只需几个指令就可以启动非常强大的微服务。

应用程序现代化

从根本上说,传统应用程序容器化并不困难,困难在于并不是每个应用程序都是建构在容器化的基础上。Docker有一个临时文件系统,这意味着容器内的存储并不持久。如果不采取一些特定措施,保存在Docker容器中的任何文件都可能丢失。此外,并行化是应用程序容器化的面临另一个难题,因为Docker的一个最大优点就在于它能快速适应日益增长的流量需求,这些应用程序需要能够与多个实例并行运行。

综上所述,为使传统应用程序容器化,有以下几种路径:扩展、重构或者重建。哪种方法最适合,则完全取决于组织的需求和资源。

扩展

一般来说,扩展非容器化应用程序的已有功能在这几种办法中最为简便,但如果处理不好,所做的更改可能会导致技术债显著增加。利用容器技术扩展传统应用程序的最好办法是通过微服务和API。虽然传统应用程序本身并没有被容器化,为使产品实现现代化,可将新特性从基于Docker的微服务中隔离,同时开发遗留代码,易于将来重构或重建。

从高层面来说,对于那些在不久的将来很可能变得落后或必须经历重建的应用程序而言,扩展是很好的选择——不过代码库越老,为适应Docker平台,应用程序的某些部分就越需要彻底重构。

重构

但有时,通过微服务或API扩展应用程序是不实际甚至不可行的。无论是欠缺要添加的新功能,还是通过扩展添加新功能很困难,重构旧代码库的某些部分都可能是必要的。将当前应用程序的各个现有功能从容器化的微服务中隔离出来,就能轻松完成重构了。例如,将整个社交网络重构到Docker化的应用程序可能是不切实际的,但通过退出运行用户搜索引擎,就能够将各个组件作为单独的Docker容器隔离。

重构传统应用程序另一途径是用于写入日志、用户文件等内容的存储机制。在Docker中运行应用程序的最大障碍之一是临时文件系统。这种情况可以通过几种方式进行处理,最常见的是通过使用基于云的存储方法,如AmazonS3或Google云存储。通过重构文件存储方法以利用这些平台,应用程序可以很容易地在Docker容器中运行而不丢失任何数据。

重建

当传统应用程序无法支持多个运行的实例时,不从头重建的话,可能无法添加Docker支持。传统应用程序服务周期可以很长,但如果应用程序的架构和设计决策在初始阶段就不够合理的话,则可能影响将来对应用程序的有效重构。意识到即将发生的阻碍对于识别生产率风险至关重要。

大体来说,利用容器技术实现传统应用程序的现代化并没有硬性规则。至于哪种才是最佳决策则要视产品需求和业务需求而定。但是,要想确保应用程序稳定运行而不损失生产力,充分了解哪些决策会如何影响组织长期运行,是至关重要的。

K8S中文社区微信公众号
分享到:更多 ()

评论 抢沙发

评论前必须登录!