从 Java 应用部署方式看 IT 思潮——从开发和运维到开发自运维

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介:

前些日子,我还在西溪园区上班的时候,如果不是忙得不可开交,我都会在午饭的时候尽可能选择一个离所在办公楼远一些的食堂吃饭。因为午餐和晚餐是一天的工作中难得的两个「放风」时间,如果碰到了有趣的话题还能在路上和同事交流一二。

有一次,同事问了我一个问题:「为什么 Spring Boot 应用倾向于打 fat jar 直接启动,而集团的应用倾向于打 war 包从应用容器启动?」当时我从 IT 主流思潮的角度给了一个解释,大意为 Spring Boot 是 DevOps 时代的产物,集团大多数应用是 Dev 和 Ops 分离时代的产物。

这种说法抽象程度略高,虽然也能做为一种解释,但是没能很好地把事情表达完整。于是我把当时的解释整理完善后,写下了现在这篇博文。

Java 应用部署于应用容器中,其实是受到 J2EE 的影响,也算是 Java Web 有别于其他 Web 快速开发语言的一大特色。通常我们在交付 Java Web 应用的时候,交付件是一个后缀为 war 的内部目录结构符合一定规则的 zip 压缩包,这个压缩包里(几乎)完整打包了 Web 页面(模板)、Web 站点描述、Java Web 的各个模块的 jar 以及依赖的第三方 jar。运维将这个 war 文件部署到应用容器中,站点就能被访问了。

在虚拟机在数据中心里开始流行以前,Java 应用是直接部署在物理机上的。但是单一的 Java Web 又很难将一个物理主机的全部资源有效利用,为了节省成本,我们通常会将多个 Java Web 同时部署在一台物理机上,确切的说,是将多个 war 文件部署在一个应用容器里。

在一个应用容器中部署多个 war 文件,就能实现在一个 Java 虚拟机进程中为多个站点提供服务,这能有效地节省内存资源,特别是在那个内存比较金贵的年代,这种特性意义重大,甚至应用容器还能动态地部署和卸载 war 文件而无需重启 Java 虚拟机。

刚才我们说 war 文件是一个 zip 压缩包,其实我们更常见的做法不是部署这个压缩包,而是部署 war 文件解压之后的目录。那是一个运维和开发分离的年代,开发交付 war,运维部署 war(解压之后的目录)。随着公司业务飞速发展,Java Web 承载了巨大的流量,应用容器开始暴露一些寻常难以发现的问题,甚至有时候这些问题会导致线上故障。于是渐渐的,开始有团队专门去维护开源的应用容器,修复漏洞,提升性能。

由于研发团队交付的是 war 文件,当应用容器需要更新的时候,运维团队能够在研发团队不需要介入的情况下完成 Java Web 的重新部署。甚至当一些常用的底层框架出现了安全漏洞的时候,运维团队也能扫描全部机器全部 war 解压出来的目录中的 jar,将有问题的依赖替换之后重启应用完成修复。

随着硬件性能逐步提升,也随着虚拟机技术被数据中心广泛使用,之前一个物理机上混合部署的十几个 Java Web,摇身一变成了一个物理机上虚拟出来的十几个虚拟机,每个虚拟机里部署一个应用容器和一个 Java Web。

虚拟机技术的广泛使用,给应用运维带来了极大的便利,再也不用担心机器环境被破坏,再也不用担心应用之间依赖冲突,只需要几行命令几个脚本,一个配置完善的开箱即用的 Linux Server 就唾手可得。再也不用纠结哪些应用可以混合部署哪些应用需要独立部署,流量低峰期就超卖来压缩成本,流量高峰到来之前再将虚拟机飘到空闲主机上避免资源争抢。

后来开发杀入运维领域,诞生了一种新的工种,DevOps。当开发和运维都是一个团队甚至一个人的时候,将应用和应用容器分开来部署,就显得十分繁琐了。因为无论是升级容器还是升级应用,对于 DevOps 来说,都是一次没什么明显差别的升级任务,最好能用一套统一的部署流程去完成。也许 embedded servlet containers 就是在这种需求背景下诞生的,应用容器不再是独立于应用之外的容器,而是作为应用的一部分,伴随应用一起部署和升级。

Spring Boot 就诞生在 DevOps 盛行的这几年。借助 embedded servlet containers,使用 Spring Boot 开发的应用将一个 Jetty 或者 Tomcat 嵌入在它的交付件中,整个 Java Web 应用连同应用容器打包成一个 fat jar,只需要一行 java -jar webapp.jar 就能完成应用的启动,我们甚至都感知不到应用容器的存在,仿佛只是在运行一个普通的 Java Application。于是升级容器的工作,就和升级一个第三方类库一样,修改 pom 文件,打包,发布,轻而易举。

再后来,伴随着以 Docker 为首的一众容器技术的兴起,我们正在渐渐进入 Immutable Infrastructure 的时代。

不可变基础设施,是 Chad Fowler 于 2013 年提出的一个很有前瞻性的构想:在这种模式中,任何基础设施的实例(包括服务器、容器等各种软硬件)一旦创建之后便成为一种只读状态,不可对其进行任何更改。如果需要修改或升级某些实例,唯一的方式就是创建一批新的实例以替换。

在容器时代到来之前,虽然我们已经在 Spring Boot 之类的框架的引导下,将 Java 应用打成了一个 fat jar 来分发和部署,但实际上我们分发到生产环境中的内容,远不止这个 fat jar。为了让应用代码能够在不同环境中部署,我们会将各个环境不一致的内容抽取出来,保存在配置文件中供 Java Web 应用启动时读取,比如数据库连接串、密码,比如 ZooKeeper 集群的 IP 列表。为了能够动态调节日志等级和格式,我们还会单独为 logback 等日志器提供配置文件,还要监听这个日志配置的变化。

这些 fat jar 之外的配置,给应用的部署、扩容带来了外的负担。容器想要为我们处理这一切。如果我们将配置文件打包进容器镜像中,我们就能得到一个随时可以部署的镜像,应用的部署和扩容变得简单起来。但是包含配置的镜像完全没有对环境变化的适应能力,在集群 A 上跑的好好的镜像,也许就没法部署在集群 B 里头。于是我们开始使用环境变量去描述各个环境不一致的内容,在启动 Java Web 之前先用环境变量渲染出一份适合当前环境的配置。于是,我们又得使用一个配置管理数据库来管理这许多环境中的许多环境变量,用一个中心化的 CMDB 去取代之前散落在各个集群的应用配置。

Java Web 应用部署的方式,从最初的应用容器 + 物理机 + 多应用混合部署,到应用容器 + 虚拟机 + 独立部署,再到 fat jar + 虚拟机,最后是如今的 fat jar + Linux 容器,伴随着业界运维自动化智能化的浪潮一路走来,也让我们看到了工程师从「术业有专攻」向 DevOps 乃至全栈工程师转变的趋势。通过提供随时随地轻松获取的 API 化的计算资源,云计算正在加速这一转变,云计算也让正处在转变过程中的工程师的工作越来越轻松有趣。

创业去做云计算并没有比之前任何一个时代轻松,真正变得容易的是基于云计算的创业

很幸运身处这样一个时代,能够参与到云的建设之中,为了无法计算的价值。据可靠消息,阿里云 ApsaraDB 管控团队近期正在招聘,加入团队就有机会在云计算环境下管理和自动化运维海量服务器,了解多机房容灾的原理,深度了解 MySQL、SQL Server、PostgreSQL、Redis 和 MongoDB 等各种数据库的原理和实战应用。我们希望你和我们一样,具备如下能力:

  1. 掌握扎实的 Java/Python 基础,熟悉集合类,I/O 及多线程/协程编程,理解各种容器类的内部实现
  2. 三年以上 Java 进行 Web,API 或中间件的全流程开发经验,熟悉 Spring,iBatis,缓存,连接池等常见基础框架的使用、原理和实现
  3. 熟悉常用设计模式,熟悉基本 JVM 原理、参数及问题排查,掌握 JVM 性能调优的常见方法及故障排查方法
  4. 熟练掌握 SQL 和 MySQL,对 SQL 优化有一定经验,掌握事务的基本原理及实现
  5. 熟练掌握 Linux 下常用的 shell 命令,掌握 Linux 基础性能指标及线上问题排查与解决方法
  6. 对分布式系统及分布式存储理论,如 CAP,一致性哈希,MVCC 等原理及算法有一定了解
  7. 熟悉日常开发流程,熟悉常用开发、调试工具、代码管理工具,如 Git、Maven、Eclipse 等
  8. 思路清晰,良好的沟通能力与技术学习能力
  9. 有线上大规模分布式系统开发、部署或运维经验者优先
  10. 有 Python、Perl 等其它脚本语言开发经验者优先

如果你愿意和我们一起打造最优秀的云数据库平台,请不要吝啬你的简历,发送邮件至 xile@alibaba-inc.com 尽情勾搭吧!

目录
相关文章
|
6天前
|
运维 Linux Apache
Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
21 3
|
10天前
|
运维 Linux Apache
,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具
【10月更文挑战第7天】随着云计算和容器化技术的发展,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具,通过定义资源状态和关系,确保系统始终处于期望配置状态。本文介绍Puppet的基本概念、安装配置及使用示例,帮助读者快速掌握Puppet,实现高效自动化运维。
32 4
|
19天前
|
运维 Kubernetes 监控
提升运维效率:容器化技术在现代IT基础设施中的应用
本文将探讨容器化技术如何优化企业的IT基础设施,提高部署效率和资源利用率。我们将深入分析容器技术的优势、实现步骤以及在实际运维中的应用场景。通过实例展示,帮助读者更好地理解并应用这一前沿技术,助力企业实现高效运维。
|
3天前
|
人工智能 运维 监控
智能化运维:AI在IT运维中的挑战与机遇###
本文探讨了人工智能(AI)技术在IT运维领域的应用,重点分析了AI如何提升运维效率、减少故障恢复时间,并预测未来发展趋势。通过具体案例展示了AI在实际运维中的应用效果,同时指出当前面临的挑战和解决方案,为读者提供一个全面了解智能化运维的视角。 ###
|
2天前
|
机器学习/深度学习 数据采集 人工智能
智能化运维:AI在IT运维中的应用探索###
随着信息技术的飞速发展,传统的IT运维模式正面临着前所未有的挑战。本文旨在探讨人工智能(AI)技术如何赋能IT运维,通过智能化手段提升运维效率、降低故障率,并为企业带来更加稳定高效的服务体验。我们将从AI运维的概念入手,深入分析其在故障预测、异常检测、自动化处理等方面的应用实践,以及面临的挑战与未来发展趋势。 ###
|
5天前
|
运维 Serverless 数据处理
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
Serverless架构通过提供更快的研发交付速度、降低成本、简化运维、优化资源利用、提供自动扩展能力、支持实时数据处理和快速原型开发等优势,为图像处理等计算密集型应用提供了一个高效、灵活且成本效益高的解决方案。
24 3
|
8天前
|
运维 关系型数据库 MySQL
自动化运维工具Ansible的实战应用
【10月更文挑战第9天】在现代IT运维领域,效率和可靠性是衡量一个系统是否健康的重要指标。自动化运维工具Ansible因其简洁、易用的特性,成为了众多企业和开发者的首选。本文将通过实际案例,展示如何利用Ansible进行日常的运维任务,包括配置管理、软件部署以及批量操作等,帮助读者深入理解Ansible的应用场景及其带来的效益。
|
15天前
|
运维 Prometheus 监控
运维中的自动化实践每月一次的系统维护曾经是许多企业的噩梦。不仅因为停机时间长,更因为手动操作容易出错。然而,随着自动化工具的引入,这一切正在悄然改变。本文将探讨自动化在IT运维中的重要性及其具体应用。
在当今信息技术飞速发展的时代,企业对系统的稳定性和效率要求越来越高。传统的手动运维方式已经无法满足现代企业的需求。自动化技术的引入不仅提高了运维效率,还显著降低了出错风险。本文通过几个实际案例,展示了自动化在IT运维中的具体应用,包括自动化部署、监控告警和故障排除等方面,旨在为读者提供一些实用的参考。
|
16天前
|
机器学习/深度学习 数据采集 运维
智能化运维:机器学习在故障预测和自动化响应中的应用
【10月更文挑战第1天】智能化运维:机器学习在故障预测和自动化响应中的应用
48 3
|
17天前
|
机器学习/深度学习 人工智能 运维
利用AIOps实现智能运维:提升IT运维的新策略
在数字化迅速发展的今天,传统IT运维已难以应对日益复杂的系统。AIOps通过融合AI、机器学习和大数据技术,革新了IT运维方式。其核心优势包括预测性维护、自动化处理、智能分析和资源优化。AIOps平台能自动检测、诊断并解决IT问题,显著提升运维效率。尽管面临数据质量、模型准确性和技术复杂性等挑战,但AIOps正逐步成为智能运维的重要趋势。