Java Web 程序部署方式发展史

news/2024/6/3 18:44:27 标签: java, 开发语言, 容器, 云原生, docker, devops, 后端

一、物理机时代 📒


        在虚拟机出现于业务环境中以前,应用往往部署在物理机器上,但无论是哪种服务器都缺乏相应技术手段保证一台服务器上可以稳定且安全的同时运行多个应用,因此,这样部署方式存在弊端是:空闲资源难以得到复用,部署异构系统时需要重新采购物理资源,大量中小容量的机器使得运维成本提升。

        此时Java Web 程序被打包成 WAR(Web Application Archive)文件,需手动将应用程序和其依赖项复制到目标服务器,并进行配置和启动。这种方式需要手动处理依赖关系、环境设置和管理,容易出错,且不易扩展和迁移。开发人员需要手动配置并管理Servlet 容器(如 Apache Tomcat)进行部署和运行应用程序,部署过程相对繁琐。

        在这样的情况下,手动部署需要手动处理依赖关系、环境设置和管理,容易出错,且不易扩展和迁移。如何降低基础设施的管理成本便成为急切的需求。

二、VM(Virtual Machine)时代 📝


        为解决上述问题,VMware 推出了他们的产品——虚拟机(Virtual Machine),虚拟机的出现使得用户在一台物理机上能够独立运行多个相互隔离的系统,虚拟机提供了更好的隔离性和资源管理,可以在物理服务器上运行多个独立的虚拟机,每个虚拟机都有自己的操作系统和运行环境。通过对资源的抽象化使得主机资源能够被有效复用。

        此时的部署方式逐渐演变为在虚拟机中部署应用程序。将应用程序和其依赖项打包成一个独立的虚拟机镜像(如虚拟硬盘文件),并在虚拟化平台上创建和管理这些虚拟机实例。这意味着每个Java Web应用程序都运行在自己的虚拟机中,拥有独立的操作系统和资源。

虚拟机方式的部署提供了以下优势:

  1. 隔离性和资源分配: 每个Java Web应用程序运行在自己的虚拟机中,相互之间完全隔离。这样可以避免不同应用程序之间的冲突和相互影响,同时可以更好地分配和管理资源(如CPU、内存和磁盘空间)。

  2. 环境一致性: 通过虚拟机方式部署,可以确保每个Java Web应用程序拥有相同的运行环境和配置,不受底层物理服务器环境的影响。这提供了一致的部署体验,并简化了应用程序的迁移和维护过程。

  3. 弹性和可扩展性: 使用虚拟机方式部署的Java Web应用程序可以根据需要进行水平或垂直扩展。通过添加更多的虚拟机实例或调整虚拟机资源配置,可以快速满足应用程序的需求。

        虽然这种方式比手动部署更灵活,但仍存在资源占用和管理复杂性的问题。

        大量独立系统的运行会占用许多额外开销,消耗宿主机器资源,资源竞争时可能会严重影响系统响应;此外每运行新的虚拟机都需要重新配置一遍环境和在物理机上的情况基本无异,重复的环境配置操作则会消耗开发和运维人员的工作时间。此时需求便关注到如何减少虚拟化时的资源损耗,同时还能保证隔离性,以及使应用的上线周期更短,这便引导了容器技术的发展。

三、容器化 Docker 时代 📌


        容器技术起源于 Linux ,是很多人长期、持续的贡献产物,自 2000 年开始各家类 Unix操作系统厂商开始陆续推出容器相关的项目。

        2008 年 Google 的 Cgroups 贡献给 Linux kernel 2.6.24 后,创造了LXC( Linux Containers),实现了多个独立的 Linux 环境(容器)可运行在同一个内核。对于一个完整独立运行环境来说,需要包含三个关键:环境隔离、资源控制和文件系统。在 LXC 中则分别通过 Namespace、Cgroups、rootfs 来实现相应的能力:

        Namespace — 环境隔离:LXC 将内核全局资源封装,每个 Namespace 都有一份独立的资源,使得不同的进程在各自 Namespace 内对同一种资源的使用互不干扰,不会影响其他 Namespace 下的资源,实现了进程隔离;
        Cgroups - 资源控制:LXC 通过 Cgroups 对资源进行控制,限制和隔离一组进程对系统资源的使用。在 Cgroups 出现之前 OS 只能对一个进程做资源限制,而 Cgroups 可以对进程进行任意分组,如何分组由用户自定义,借此实现对于一个 Namespace 的资源调度管理;
        rootfs - 文件系统:rootfs 挂载在容器根目录上,用来为容器进程提供隔离后执行环境的文件系统。rootfs 包含一个操作系统所涉及的文件、配置和目录,在 Linux 操作系统内核启动时,内核会先挂载一个只读的 rootfs,当系统检测其完整性之后,决定是否将其切换到读写模式。

        在通过 LXC 构建容器后,一台宿主机能够实现多个相互隔离应用的运行。同时,共享内核使得每个容器又很轻量,解决了运行大量隔离应用时虚拟机资源消耗过重的弊端。

        然而,LXC 虽解决了应用隔离的问题,但却只是轻量的容器技术,没有解决各平台软件交付标准不统一的问题,如不同的软件交付工具、应用运行规范不统一、环境依赖复杂等带来的配置开销。这些问题使容器技术的推广依然比较有限,直到 Docker 的出现。

        随着 Docker 的出现,Java Web 程序可以被打包成 Docker 镜像,并在容器中运行。镜像包含了应用程序以及其所需的运行时环境和依赖项,可以在任何支持 Docker 的环境中轻松部署和运行,简化了配置和管理,提高了可移植性和扩展性。


        早期 Docker 是基于 LXC 开发,因此 Docker 容器也有着和 LXC 相似的特性,仅需要较少资源便可以启动。但不同于 LXC,Docker除了容器运行,还是一个打包、分发和运行应用程序的平台。Docker 允许将应用和其依赖的运行环境打包在一起,打包好的 “集装箱“(镜像)能够被分发到任何节点上执行,无需再进行配置环境的部署。这样使得 Docker 解决了开发和部署应用时环境配置的问题,规范化了应用交付和部署,降低了部署测试的复杂度以及开发运维的耦合度,极大提升了容器移植的便利性,便于构建自动化的部署交付流程。​​

        Docker 容器技术在快速部署、环境标准化、隔离性方面的优势得到了开发人员普遍认可,但是如果以一个完整 PaaS 平台为标准来衡量这些还不够。首先,Docker 提供了名为 “容器” 的隔离环境,但是面对多容器间有拓扑有关联的场景,Docker还难以应对;其次,虽然容器解决了应用交付规范问题,但难以实现完全应用托管;另外,随着基础设施规模的扩大,开发中心必将分布式化,调度问题就需要解决。

        2014 年 7 月 Docker 宣布收购单机容器编排软件 Fig(后来命名为 Docker Compose),同年 12 月推出了自己容器集群编排项目 Docker Swarm。Docker Swarm 成功打造了两方面能力:

①、多容器编排能力,支持通过 YAML 文件声明多容器应用,并定义容器之间的关系;
②、分布式调度能力,允许跨集群节点调度容器。Docker Compose 和 Dockers Swarm 可以基本满足开发人员对于 PaaS 平台的需求,对于Docker向平台化发展的规划具有基石一般的意义。至此,Docker未来的发展似乎很乐观,但是随着Google加入,容器市场的局面发生了重大改变。

四、Kubernetes(K8S)时代 🌴


        2014 年 Google 开源了名为 Kubernetes(简称K8S)的项目,它是由 Google 内部 Borg 项目而开源出来的容器集群管理系统。Kubernetes 继承了 Google 丰富的大规模集群运维的经验和基因,能够提供复杂的、大规模的容器编排管理服务。2015 年 Google 发布了 Kubernetes 第一个商业版本,代表 Kubernetes 进军生产级容器规模管理,也意味着开始与 Docker 竞争 PaaS 平台的未来版图。

        Kubernetes 集群由两类节点构成:Master Node 和 Worker Node。Kubernetes 采用声明式的设计,任何操作指令都通过声明式 API 与 Master 通信。Master Node 可响应 API 声明,进行集群管理和容器调度。容器则运行在 Worker Node,Worker 负责响应 Master 指令,执行容器启停等维护操作。

        除了紧密的容器关系,一个面向生产的编排系统必然应当支持更多的容器关系,所以 Kubernetes 还提供了 Deployment 无状态多副本关系、StatefulSet 有状态多副本关系、Job 一次性长任务等许多对象以满足多样的编排需求。这些对象的基础调度单元还是 Pod,由控制器 Controller 控制 Pod 对象的状态来实现声明的编排关系。

        Kubernetes 使开发人员和工程师拥有了快速处理大型项目所需的管理工具和基础架构。从负载测试或创建过渡环境,到将业务和在线应用程序移至生产环境,Kubernetes 集群都可以对其进行管理。

五、部署方式的比较和总结 🔎

Docker 和虚拟机都是资源虚拟化发展的产物,但二者在架构上又有区别:​​

        虚拟机通过 Hypervisor 虚拟化主机硬件资源,然后构建客户机操作系统,由宿主机的管理程序管理;
        Docker 直接运行于主机内核,应用在主操作系统的用户空间上执行独立任务,不需要从操作系统开始构建环境,赋予了应用从交付到部署再到运维的独立性。
虚拟机的启动时间可能是分钟级的,而 Docker 容器创建是秒级别。对于硬盘的使用 Docker 一般为 MB 级别,远小于包含操作系统的虚拟机 GB 级磁盘使用量。对于操作系统来说,能支持运行的 Docker 容器数量远多于虚拟机。

使用 Docker 容器部署的好处有以下几点:

  1. 环境一致性: Docker 提供了容器化的环境,可以在不同的主机上运行相同的容器,确保应用程序在不同环境中的一致性。
  2. 隔离性和安全性: 每个容器都是相互隔离的,一个容器的问题不会影响其他容器。这提高了安全性并减少了潜在的依赖冲突。
  3. 易于管理和部署: Docker 提供了一套方便的命令行工具和 API,使得容器的管理和部署变得简单和可重复。
  4. 资源利用效率: Docker 允许在主机上共享操作系统内核,因此可以更高效地利用系统资源,避免了虚拟机所带来的额外开销。

区分物理机、虚拟机和容器_物理机虚拟机_白白白鲤鱼的博客-CSDN博客

这些部署方式不断迭代演变的原因主要有:

  1. 灵活性和便捷性: 部署方式的发展是为了提供更高的灵活性和便捷性。比如,传统的WAR部署需要手动复制文件并进行一些配置,相对繁琐。而使用容器化技术,如Docker,通过打包成独立的镜像,并使用容器管理工具,可以快速部署和运行应用程序。

  2. 资源利用和成本效益: 迭代的部署方式也考虑到资源利用和成本效益。虚拟机方式部署允许在同一物理服务器上运行多个独立的虚拟机实例,并且可以根据需要分配资源。这样可以更有效地利用硬件资源,降低运行成本。

  3. 技术发展和需求变化: 部署方式的迭代也受到技术发展和需求变化的影响。随着容器化技术的兴起,容器部署成为一种趋势,因为它提供了更高的可移植性、环境一致性和弹性。

        总结起来,Java Web程序部署方式不断迭代演变,是为了提供更高的灵活性、便捷性、资源利用和成本效益。随着技术的发展和需求的变化,新的部署方式出现并逐渐取代旧的方式,以满足不断变化的应用程序部署需求。

 


http://www.niftyadmin.cn/n/4979693.html

相关文章

前端面试话术集锦第一篇

🚗前端面试集锦目录 💖前端面试话术集锦第一篇💖 💖前端面试话术集锦第二篇💖 文章目录 1. 前端需要注意哪些SEO2. \<img>的title和alt有什么区别3. HTTP的⼏种请求⽅法⽤途4. 从浏览器地址栏输⼊url到显示⻚⾯的步骤5. 如何进⾏⽹站性能优化6. HTTP状态码及其…

面试现场表现:展示你的编程能力和沟通技巧

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Tensoeboard的一些坑与技巧

安装 pip install tensorboard 安装过程中遇到tensoeboard.exe找不到&#xff0c;参考解决&#xff1a; https://blog.csdn.net/weixin_44532467/article/details/123525891 3.启动tensorboard 默认路径 &#xff08;&#xff09; tensorboard --logdir logstensorboard -…

机器视觉工程师永不为奴,他们是肯干肯出差肯加班肯拼命肯被使唤肯被叼

​ 永不为奴&#xff0c;为什么这样呐喊&#xff0c;真的很难做到。我们职业机器视觉工程师&#xff0c;本身职业具有一大特点就是专业性。 但是我们机器视觉工程师是专业技术绝不苟同于不是技术人员言语&#xff0c;我们很专业。 肯出差&#xff1a; 设备去那里&#xff0c;…

Qt读写ini配置文件(QSettings)、XML

1、ini相关的 总结&#xff1a;Qt读写ini配置文件(QSettings) - 布丁Plus - 博客园 (cnblogs.com) Qt读写ini文件&#xff08;含源码注释&#xff09;_qt ini文件读写_lw向北.的博客-CSDN博客 2、XML相关的 Qt读写XML文件&#xff08;含源码注释&#xff09;_qt写xml_lw向北…

匿名内部类、Lambda、方法引用 的总结

在今天的项目中看到这样一行代码 Integer syncCount consumer.consumerInfo( Collections.singletonList(KafkaTopicConst.Event_BMS_SYSLOG_ROLE),consumer::handle); 直接傻眼&#xff0c;无法理解consumer::handle这种用法&#xff0c;因此总结如下 consumer::handle这种写…

JavaScript—BOM

BOM是什么&#xff1f; Browser Object Model是浏览器对象模型 官方&#xff1a;浏览器对象模型提供了独立于内容的、可以与浏览器窗口进行互动的对象结构&#xff0c;BOM由多个对象构成&#xff0c;其中代表浏览器窗口的window对象是BOM的顶层对象&#xff0c;其他对象都是该…

Linux centos7 bash编程(break和continue)

在学习shell知识时&#xff0c;简单编程要从格式入手。 首先学习好单行注释和多行注释。 先学习简单整数的打印输出&#xff0c;主要学习echo命令&#xff0c;学习选项-e -n的使用。 下面的练习是常用的两个分支程序&#xff1a;break和continue。 #!/bin/bash # 这是单行注…