郑晔:一说起Java应用的部署,大家直觉上就会想到“打个包,部署到应用服务器”。这也是几乎十多年前就定型下来的开发方式。但对于开发人员来说,这就几乎就意味着各种开发的噩梦。为了在开发阶段定位一些问题,我们就不得不在“本地”进行用上“远程”调试。
应用服务器是一个“老大哥”年代的产物,那时候大公司要卖应用服务器,更要卖硬件,所以,它们炮制出复杂的业务场景。但是,对于许多团队来说,你可能一辈子都碰不到这样复杂的情况。当年,EJB的破产已经让我们见识了这种虚幻的需求在程序员社区里是站不住脚的。现在,轮到应用服务器本身了。我在演讲里曾经举过一个例子,说明这个应用服务器中一个虚幻的需求,在一台应用服务器上部署多个应用。现在我们看到,大多数应用多个应用服务器都不够,一个应用服务器部署多个应用除了测试玩玩,在实际的场景中,几乎就是站不住脚的。开源社区的兴起让普通程序员有机会见到高手是如何工作的,高水平程序员总会追求更“简单”的工作方式,吸引更多程序员走入这种方式中。我很高兴地看到,我们的开发方式不再是由老大哥主导了。
最近几年,随着云和移动开发的兴起,微服务的概念逐渐进入了我们的视野,随之而来的就是社区对于开发和部署的反思。前面提到的DropWizard的就是一个很好的例子,通过它,我们只要打出一个JAR包,和传统的方式不同的是,这个JAR包直接就是一个可运行的应用。是的,它是有Main函数的。有Main函数就意味着,我们可以很方便地在IDE里做我们想做的一切,包括调试。这样一来,对比从前那种笨拙的方式,开发人员可以做到“易者易为”。
关于部署,现在的一个方向是部署的自动化,有很多工具可以支持我们做到这一点,比如Chef、Puppet,我最近的一个项目上用了Docker。有了这些基础,我们可以一键式在一台空机器上建立起一个完整的应用。这就是持续交付中一个很重要的基础。再进一步,我们可以把这种部署同虚拟化和云结合起来,用自动化工具在云端一个节点部署出我们的应用。你可以想一下,如果我需要测试一下我的应用,或是在产品环境上增加一个新节点,我只要用一条命令,就会自动在云端的某个节点上建出我们所需的全部内容。传统做法仅仅是申请机器就是一个漫长的过程,遑论手工安装应用,配置参数这些麻烦事。这不是对未来美好生活的畅想,实际上,我们公司的许多项目已经做到了这一点。
把部署自动化和轻量级部署、微服务结合起来,我们的开发方式就是,在本地编写好一个服务,调测好,再部署到云端,由其它人进一步测试。这才是一种简单的开发方式。程序员应该追求简单,包括我们个人开发方式的简单。
微信扫描下方的二维码阅读本文

