保持领先
VMware 提供培训和认证,助您快速进步。
了解更多欢迎阅读《也许你不需要为此再引入一个库》(#YMNNALFT
) 系列的另一篇!自 2016 年以来,我在我的 Spring Tips 视频中花费了大量时间来阐明 (或至少尝试阐明) Spring 生态系统中一些更重大的机遇。然而,今天,我以一种不同的方式与您交流,希望专注于那些虽然微小、有时隐藏,但却能做得很棒的事情,并且可能让您免于引入额外的第三方依赖及其隐含的复杂性。
您试过 Paketo 吗?它很棒!它缓解了当今云软件最大的痛点之一:Dockerfile。
插句题外话:当然,*最大*的痛点是 YAML。YAML 是人们离开 IT 行业的原因!YAML:当你想要 Python 那种对缩进敏感的背叛,却没有任何设计时验证,也享受不到 Python 的任何好处时,就用 YAML。YAML:显然,生活还不够艰难。十分之九的牙医都同意:YAML 会导致生产环境腐烂!
“确实有人说过,YAML 是最好的配置形式,除了那些时不时尝试过的其他所有形式。” - 非温斯顿·丘吉尔
调试 YAML 毫无压力 ;) pic.twitter.com/vwCCYKTZY2
— Arun Gupta (@arungupta) 2020 年 12 月 20 日
话说回来,YAML 是另一回事,就像“奥普拉脱口秀”那样,我们没时间深入探讨,所以我们继续:我们想简化 Dockerfile 的创建。Dockerfile 冗长乏味,要求我们重新指定在生产环境中运行应用所需的完整环境。虽然可以用相当少的代码行来实现功能,但正如我在躲避 COVID-19 病毒时学到的,“最少”不是“没有”!而且,能运行的东西并不等于生产环境。我们可以做得更好。
Paketo 是一个 Cloud Foundry 基金会项目,基于 CNCF(CNCF 代表“代码永不完成”,或者也许是“通用网络代码基金会”,还是“云原生计算基金会”?)的 buildpacks 项目。引用其网站的话:“buildpacks 将您的应用源代码转换为可在任何云上运行的镜像。Paketo Buildpacks 为应用提供语言运行时支持。它们利用云原生 Buildpacks 框架,使镜像构建变得简单、高效且安全。” 基本上就是:应用进去,容器出来。看到了吗?很棒!
Buildpacks 源自 Heroku 和 Cloud Foundry 的平台即服务(PaaS)产品。您将应用产物(例如,一个 Java .jar
文件)交给 buildpack,buildpack 就会将您的应用打包在一个容器中返还给您。更具体地说,它会创建一个合理的 文件系统,其中包含您的应用产物以及运行该产物所需的一切。因此,如果您给它一个 .jar
文件,它可能会创建一个文件系统,其中包含配置了合理内存边界的 JVM 以及任何所需的 Java agent。*所有这些*最终都会变成一个容器。您会对此感到*震惊*,几乎无需任何配置就能将应用容器化!Buildpacks 之所以奏效,是因为无论我们如何辩解,大多数应用其实并不特殊。对于每个人来说,一个 .jar
就是一个 .jar
,而一个 Node.js/NPM 项目对每个人来说构建方式都相同。Buildpacks 支持多种不同的语言和运行时(多得数不胜数)。您可以使用 Paketo CLI 轻松地将各种应用容器化,就像这样:pack build .
。
或者,总之,如果您*没有*使用Spring Boot 2.3 或更高版本,您*就会*那样做。但是,您*正在*使用,_ 不是吗_?Buildpack 支持现在已集成到 Spring Boot 自身的构建插件中了。
如果您使用 Maven,可以输入以下咒语
./mvnw spring-boot:build-image -Dspring-boot.build-image.imageName=bootiful/demo
如果您使用 Gradle,可以输入以下咒语
./gradlew bootBuildImage --imageName=bootiful/demo
退后一分钟,让它完成所有工作。工作完成后,它会导出 Docker 镜像。然后您可以 docker tag
并 docker push
将该镜像推送到您选择的容器仓库(VMware Harbor、Google Container Registry、JFrog Container Registry、DockerHub 等)。
您想将其部署到生产环境吗?那也很简单!这是 Kubernetes 的正确咒语,假设您的镜像在 Google Container Registry 上,并且 artifact ID 是 demo
。在 pom.xml
中指定的版本也会成为容器的版本标签。
kubectl create deployment demo --image=gcr.io/bootiful/demo
希望这些内容足以让您将应用部署到生产环境,甚至无需配置 Jib 或 Spotify Maven 插件,也无需编写冗长、复杂的 shell 脚本来执行 docker build
。当然,别误会。您*可能*出于某种原因仍然需要创建自己的 `Dockerfile`,因为您可能需要对特定层的顺序或内容进行控制,如果是这样,那么 Spring Boot 在这里也为您提供了支持。
好了,这些已经足够您开始了。前往 Spring Initializr(我在互联网上第二喜欢的地方,*仅次于*生产环境),生成一个新项目,然后将您的容器化应用部署到您选择的平台。
您喜欢这种“一瞥即宝石”的方法吗?您学到了什么吗?一如既往,我很乐意听取您的意见,所以请在 Twitter (@starbuxman) 上发表看法!本周晚些时候,我将带来 YMNNALFT 系列的另一篇,请务必不要错过。我将探讨的主题包括但不限于:简单的 RPC、*Utils
对象的花园、使用 Micrometer 进行维度指标测量,以及许多其他主题。