现在每个人都在谈论微服务。关于如何在企业层面应用这些原则,有很多意见和想法,但很少有例子。有一件事是肯定的,即使在几天前的会议上,我也很少发现有人在生产环境中运行 Docker 容器。当我询问第一次体验以及是否有人玩过它时,至少有相当多的人举手。看看运行容器化基础架构所需的所有操作级别知识(操作系统、网络等),我就能理解所有这些。要使企业 Java 开发人员更容易做到这一点,还需要做很多工作。我们确实有一些方法可以使用日常工具并将它们与最新技术相结合来教育自己。其中之一是 WildFly Swarm,它是构建完全包含的 Java EE 应用程序的一种轻量级且简单的方法。这篇博文将向您展示如何在 Docker 上本地运行它。
什么是野蝇群?
WildFly 是一个重量轻、灵活、功能丰富、符合 Java EE 7 的应用程序服务器。 WildFly 9 甚至引入了一个 27MB 的 Servlet-only 发行版 。两者都是您的 Java Enterprise 项目的坚实基础。最新版本的 WildFly 10.CR2 将成为 Red Hat 下一个受支持的 Java EE 服务器产品 Enterprise Application Platform 7 的基础。
WildFly Swarm 摆脱了各种配置文件的静态捆绑,并允许您构建自己的自定义功能 Java EE 运行时。但 WildFly Swarm 不仅仅是一个定制的应用服务器,它是关于将您的应用程序(包括相关的应用程序服务器组件)捆绑在一个单一的可执行文件中。这也称为“fat-jar”,可以简单地使用 java -jar 运行。当我们谈论它时:微服务通常将完整的应用程序及其堆栈带入其中,因此您可以将每个 WildFly Swarm 应用程序视为一个独立且完全包含的微服务。
将 Java EE 应用程序变成 Fat-Jar
通过添加 Maven 依赖项和插件,可以将 Java EE 应用程序打包为 WildFly Swarm fat-jar。这个简单的 JAX-RS 示例的完整源代码可在 https://github.com/myfear/WildFlySwarmDockerSample/ 获得。应用程序本身公开了一个端点 /rs/customer ,它只输出一些文本。真正的魔力在于 pom.xml 文件。我们现在正在走过它。
首先, Java EE 7 API 的依赖性 ,然后是:
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>wildfly-swarm-jaxrs</artifactId>
<version>${version.wildfly-swarm}</version>
</dependency>
WildFly Swarm 插件 负责应用程序的打包:
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>wildfly-swarm-jaxrs</artifactId>
<version>${version.wildfly-swarm}</version>
</dependency>
这就是所有的魔法。您可以使用“mvn package”构建应用程序。您会在目标文件夹中找到 war 文件本身和附加附件“swarm-sample-1.0-SNAPSHOT-swarm.jar”。如果你打开它,你会发现一个 m2repo 文件夹,其中包含所有依赖库和你的应用程序本身捆绑在 _bootstrap\ 文件夹中。您可以直接在您的 maven 项目中从命令行运行它(Windows 用户可能会遇到 此问题 ):
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>wildfly-swarm-jaxrs</artifactId>
<version>${version.wildfly-swarm}</version>
</dependency>
将浏览器重定向到 http://localhost:8080/rs/customer 将显示一些 json:
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>wildfly-swarm-jaxrs</artifactId>
<version>${version.wildfly-swarm}</version>
</dependency>
Dockerizing WildFly Swarm
WildFly Swarm 项目在 github 上有一些 Docker 示例。主要是 bash 脚本和一些包装器来 dockerize 你的项目。但还有更好的东西:Roland Huss 的 Docker Maven 插件 。我之前已经用过几次了,在这个例子中也用到了。您所要做的就是将 插件添加到您的 pom.xml 中 。
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>wildfly-swarm-jaxrs</artifactId>
<version>${version.wildfly-swarm}</version>
</dependency>
配置有点棘手。 (感谢罗兰在过去几天给我的所有电子邮件支持!)。首先,基础很简单。将图像添加到插件配置并相应地命名。我继承自 jboss/jdk-base:8,图像获得名称和标签 myfear/swarm-sample:latest( 第 77ff 行 )。构建配置暴露了 8080端口 ,并定义了相关的 入口点 (启动java的命令带-jar参数)。图像的组装需要包括 项目附件 并将 附件作为依赖项 包括在内。确保 输出服务映射 和 basedir 与 入口点参数 匹配。
让我们试运行一下
确保您的主机上有 docker-machine 设置。创建一个开发机器并相应地配置您的环境变量。现在你可以运行:
<dependency>
<groupId>org.wildfly.swarm</groupId>
<artifactId>wildfly-swarm-jaxrs</artifactId>
<version>${version.wildfly-swarm}</version>
</dependency>
(注意:10.3.5 Docker Maven 插件中的一个错误实际上现在无法拉取基本映像。您需要在执行 maven 运行之前手动执行“docker pull jboss/jdk-base:8”。)
项目已构建,容器已从映像启动。
恭喜,现在您的本地 Docker 实例中有一个正在运行的 Java EE 微服务。下一篇博客将实际研究如何获取此图像并在 OpenShift Origin 上运行它并根据您的需要对其进行缩放。