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

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

众所周知,产品开发向来都不是非黑即白那么简单,必须要权衡各方妥协折衷进行,虽然完全重写的可行性不大,但应用程序现代化的长远利益仍然值得重视。虽然许多组织尚未能构建全新的云本地应用程序,但通过使用一些技术比如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支持。传统应用程序服务周期可以很长,但如果应用程序的架构和设计决策在初始阶段就不够合理的话,则可能影响将来对应用程序的有效重构。意识到即将发生的阻碍对于识别生产率风险至关重要。

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

原文来源:Rancher Labs

时间: 2024-10-19 18:54:32

容器和应用程序:扩展、重构或重建?的相关文章

容器中Java 程序OOMKilled原因浅析

背景: 业务的容器化刚刚搞完,线上开始告警,容器重启,容器重启.describe pod 查看原因是OOMKilled 分析: OOMKilled 是pod 中的进程使用的内存超过了.spec.containers[*].resources.limits.memory中定义的内存限制,在超出限制后, kubernetes 会向容器中的进程(pid=1)发送kill -9 信号.kill -9 信号对于进程来说是不可捕捉的,进程无法在收到-9 信号后优雅的退出. 这对于业务来说是有损的.那么为啥进

容器使用笔记(扩展篇)

前两篇文章分别介绍了几种容器,他们之间的区别与联系也做了简单的介绍,这篇文章主要在存储机制和工作效率上来扩展一下. 我们从数据的角度将它们分为两类一维集合和二维集合(这里不讨论数组),一维集合主要包括ArrayList.List,二维集合主要包括HashTable.Dictionary<K,v>,其它类型(使用较少)不做讨论. 首先说一维集合,来源于数组,他们在内存中的存储机制也是来源于数组,以顺序存储的方式存放在内存中,以下标为索引查找数据,效率较高. 再来谈谈二维表,HashTable和D

常见的web容器与应用程序服务器区别及对比

tomcat 类型:servlet容器和HTTP web服务器 功能:实现了一些J2EE特性包括Java Servlet.JSP页面.Java EL和websocket,还有纯java的http web server. 重要组件: catalina是一个servlet容器 coyote是连接器 Jasper是tomcat JSP引擎,解析编译JSP称为servlet,运行时,可以检测JSP的改动并且重新编译它们. Cluster用来管理大型应用,用来做LB WAS(Wephere Applica

phpStorm中使用xdebug工具调试docker容器中的程序

前提准备 phpstorm开发软件 + dnmp(docker + nginx + mysql +php) 配置好hosts 映射比如 /etc/hosts      127.0.0.1 tp5.dev 为现有的php环境安装好xdebug扩展,安装成功之后可以通过页面输出phpinfo()查看是否安装成功xdebug 安装能够进行调试的ieda环境,一般对于php程序开发者来说,使用phpStorm较多,本文也是通过这个讲述. 成熟的docker构建的环境. 可以使用https://githu

Windows程序代码重构

代码重构:在程序功能实现之后,对代码进行一定规模的整理,使之符合"高内聚.低耦合"的软件设计原则,便于维护和使用. ①用函数封装消息处理代码--对Windows程序窗口函数中的每一个case程序段进行封装以形成一个消息处理函数,而在case中调用这个函数. ②利用数组或链表实现消息映射表进一步实现代码的隔离--因为窗口函数switch-case结构实质上实现的就是一个根据消息标识来查找消息处理代码的功能,故可以用消息映射表和一段查表程序来替代它,表中的每一项可以使用一个函数指针来指向消

Docker容器运行GUI程序的配置方法

0.环境说明 Ubuntu 16.04 docker 1.35 1.Docker的"可视化" Docker本身的工作模式是命令行的,因为主要的使用场景可能是做服务器后端方面的比较多. 但有时候我们会有在docker容器里运行一些图形界面的软件,或者要调用摄像头,输出图像等等一些需求,这个时候需要解决这个Docker "可视化"的问题. (这里的"可视化"不是很容易搜到的可视化管理的方法) 2.解决方案1-启动容器时添加配置选项 林帆:Docker

Rio手把手教学:如何打造容器化应用程序的一站式部署体验

11月19日,业界应用最为广泛的Kubernetes管理平台创建者Rancher Labs(以下简称Rancher)宣布Rio发布了beta版本,这是基于Kubernetes的应用程序部署引擎.它于今年5月份推出,现在最新的版本是v0.6.0.Rio结合了多种云原生技术,从而简化了将代码从测试环境发布到生产环境的流程,同时保证了强大而安全的代码体验. 什么是Rio? 下图是Rio的架构:  Rio采用了诸如Kubernetes.knative.linkerd.cert-manager.build

谈laravel容器延迟加载以及auth扩展

昨天按照手册教程,动手写一个Auth扩展,按照包独立性的原则,我不希望将Auth::extend()这种方法写在 start.php 中,毫无疑问,我选择了在服务提供器register()方法中注册扩展驱动.然而,事与愿违-- http://www.zroran.com/it/php/laravel/10.html 发现问题 当我在 LoauthServiceProvider 中这样写的时候: public function register() { // \Auth::extend('loau

如何用微服务重构应用程序

在决定使用微服务之后,为了将微服务付诸实践,也许你已经开始重构你的应用程序或把重构工作列入了待办事项清单. 无论是哪种情况,如果这是你第一次重构应用程序,那么您和您的团队必将在某个时刻面临一个显而易见的问题:如何重构应用程序以实现微服务? 这也正是这篇文章要思考和探讨的. 重构基础 在讨论如何将重构转化为微服务之前,退后一步,仔细观察微服务的内容和时间是很重要的.以下两个要点将会对任何微服务重构策略产生重大影响. 重构=重新设计 将一个单体式的应用程序重构为微服务,与重新设计一个基于微服务的应用