如何在 OpenShift 上部署多模块 maven spring boot 应用程序

Posted

技术标签:

【中文标题】如何在 OpenShift 上部署多模块 maven spring boot 应用程序【英文标题】:How to deploy multi-module maven spring boot application on OpenShift 【发布时间】:2016-12-30 10:47:03 【问题描述】:

我有一个多模块 spring-boot 项目,我想在 Openshift 上部署它,我也在那里安装了 Jenkins。源代码托管在 Github。 每个模块都包含在一个战争中,以便拥有一个微服务结构:

    <modules>
        <module>xyz-common</module>
        <module>xyz-data-services</module> <!--a REST service to interact with mongodb-->
        <module>xyz-batch-importer</module> <!--a service to import files into Mongo-->
        <module>xyz-frontend</module>
    </modules>

我找到了部署单个 spring-boot 应用程序的教程,但我无法弄清楚这如何应用于多模块 maven 项目。

【问题讨论】:

这是微服务架构的主要目标之一:独立部署每个应用程序! 那我该怎么办?为每个模块创建不同的项目? 【参考方案1】:

如果您想在 openshift 上使用多模块 maven 项目,那么您必须告诉 openshift 如何构建它们。您可以通过定义构建环境变量或编写可由 Openshift 解释的自定义构建脚本来完成此任务。

这两种方法你都可以按照this教程:

如果您想使用第一种方法,您可以通过为构建配置定义“MAVEN_ARGS_APPEND”变量来告诉 openshift 在构建过程中使用额外的 maven 命令。

所以当构建操作在 openshift 上开始时,它会告诉 Maven 使用这些附加参数构建应用程序。

定义下面列出的其他构建环境变量以独立部署战争模块:

MAVEN_ARGS_APPEND: -pl 模块名 --also-make

ARTIFACT_DIR:模块名/目标/

MODULE_DIR:模块名称

在这里,“-pl”命令提供构建“xyz-data-services”及其所有依赖项。因此,如果您的“xyz-data-services”模块依赖于“xyz-common”,那么 maven 将构建“xyz-common”,为“xyz-data-services”创建相关工件,将它们打包在一起并部署“xyz-数据服务”作为 pod 上的战争。

在您的情况下,假设您要将“xyz-data-services”模块和“xyz-front-end”模块打包为war并部署它们。

案例一:

如果您想让这些模块可以自我部署,那么您必须创建两个将在不同的 pod 上运行的应用程序。

第一个应用程序将具有以下构建环境变量:

MAVEN_ARGS_APPEND:  -pl xyz-data-services --also-make
ARTIFACT_DIR:       xyz-data-services/target/
MODULE_DIR:         xyz-data-services

第二个会有这些家伙:

MAVEN_ARGS_APPEND:  -pl xyz-front-end --also-make
ARTIFACT_DIR:       xyz-front-end/target/
MODULE_DIR:         xyz-front-end

案例 2:

如果你想将这些模块部署到同一个 pod 中,那么你可以在你的项目中添加一个额外的模块,它将两个战争打包到一个耳朵中,并为这个耳朵定义变量。

所以让这个耳朵成为“webapp”,你的父 pom 会是这样的;

...
<modules>
     <module>xyz-common</module>
     <module>xyz-data-services</module>  
     <module>xyz-batch-importer</module> 
     <module>xyz-frontend</module>
     <module>xyz-webapp</module>
</modules>
...

xyz-webapp pom 看起来像;

....
<artifactId>xyz-webapp-</artifactId>  
<dependencies>
    <dependency>
        <groupId>$project.groupId</groupId>
        <artifactId>xyz-common</artifactId>
        <version>$project.version</version>
        <type>jar</type>
    </dependency>
    <dependency>
        <groupId>$project.groupId</groupId>
        <artifactId>xyz-data-services</artifactId>
        <version>$project.version</version>
        <type>war</type>
    </dependency>
    <dependency>
        <groupId>$project.groupId</groupId>
        <artifactId>xyz-frontend</artifactId>
        <version>$project.version</version>
        <type>war</type>
    </dependency>
</dependencies>
.... 

所以你的构建环境变量将是;

MAVEN_ARGS_APPEND:  -pl xyz-webapp --also-make

ARTIFACT_DIR:   xyz-webapp/target/

MODULE_DIR:    xyz-webapp

如果您只想使用单个战争和单个 pod;

案例3:

您可以将前端应用程序打包为war,并声明对其他模块的依赖关系,这些模块都打包为“.jars”

您可以继续处理您想要的情况。重要的是,它取决于您的“微服务”实现。由于“微服务”术语和实现没有明确定义,并且可能因架构或某些业务需求而异,因此您可以决定将前端、api、后端打包在一起还是独立管理。

【讨论】:

以上是关于如何在 OpenShift 上部署多模块 maven spring boot 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

OpenShift中的持续交付

在裸机上部署openshift4.3

在 Openshift 上部署战争文件后未找到合适的驱动程序错误

无法在 openshift 上部署 nodejs 套接字 io 应用程序

CentOS7.9上部署OpenShift3.11集群

CentOS7.9上部署OpenShift3.11集群