Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在许多微服务中轻松更新构建依赖项_Java_Spring Boot_Architecture_Microservices_Software Design - Fatal编程技术网

Java 在许多微服务中轻松更新构建依赖项

Java 在许多微服务中轻松更新构建依赖项,java,spring-boot,architecture,microservices,software-design,Java,Spring Boot,Architecture,Microservices,Software Design,在微服务中使用共享库是一种糟糕的做法。但是每个微服务都依赖于框架和库:Spring Boot、Kafka Java客户端等 如果一个系统由30个基于Spring Boot的微服务组成,并使用Gradle或Maven作为构建工具并作为Docker映像分发,那么有没有一种简单的方法可以在所有微服务中更新Spring Boot版本?一个接一个地更新所有的微服务需要很多努力。一个系统拥有的微服务越多,需要付出的努力就越多 更新的原因可能是某些依赖项中存在安全漏洞。 例如,依赖于具有漏洞的Tomcat 9

在微服务中使用共享库是一种糟糕的做法。但是每个微服务都依赖于框架和库:Spring Boot、Kafka Java客户端等

如果一个系统由30个基于Spring Boot的微服务组成,并使用Gradle或Maven作为构建工具并作为Docker映像分发,那么有没有一种简单的方法可以在所有微服务中更新Spring Boot版本?一个接一个地更新所有的微服务需要很多努力。一个系统拥有的微服务越多,需要付出的努力就越多

更新的原因可能是某些依赖项中存在安全漏洞。 例如,依赖于具有漏洞的Tomcat 9.0.27,例如。该漏洞已在Tomcat 9.0.31中修复,因此更新到将解决该问题

解决方法是将build.gradle中的Spring启动版本声明为2.2.+。但仍有人需要重建所有的微服务,例如Jenkins上的微服务

此外,通过这种方法,您可以放松对版本管理的控制,并将其委托给Gradle—始终尽可能使用最新版本。为了仍能控制依赖关系,Jenkins可以在gradle.properties中声明版本并将其装入工作区:

spring.version=2.2.4.RELEASE
如果该漏洞非常严重,则没有时间等待具有修复程序的新Spring引导版本,并且必须在build.gradle中显式更新Tomcat。或者甚至替换为Undertow,这也需要对build.gradle进行更改

使用独立的Tomcat而不是嵌入式也没有多大帮助,因为微服务是作为Docker映像分发的,而不是作为部署到servlet容器中的WAR文件分发的


在JavaEE中,安全更新在理论上非常容易。您可以更新应用程序服务器,例如WildFly或应用安全补丁,如果应用程序仅使用Java EE API,则无需采取进一步的操作。至少在理论上,微服务是否也有类似的易依赖性更新概念?

作为旁注,微服务通过使组件更加自治和可维护而带来价值,但这也有成本:集成它们并维护它们并不便宜。因此,微服务粒度也应该在这一方面加以考虑

如果系统由30个基于Spring Boot和 使用Gradle或Maven作为构建工具并作为Docker分发 图片,是否有一个简单的方法来更新所有的Spring启动版本 微服务?一个接一个地更新所有的微服务需要很多时间 努力。一个系统拥有的微服务越多,付出的努力就越多 必需的

使用Jenkins所引用的CI工具,在每个microservice应用程序中进行相关的自动化测试,更新其pom/gradle文件的spring版本,甚至在集成环境中部署自动化IT基础设施工具(如Ansible)并不难。 一般来说,如果项目属于多模块项目maven版本插件,那么可以使用maven/gradle插件更新所有项目的依赖版本,gradle版本插件可以这样做。 如果项目不属于多模块项目,还有其他选择,但您应该添加手动SCM检索步骤。 整个任务可以通过shell脚本完成,或者更好地通过jenkins作业完成,使用spring引导版本,您可以按需执行。对于Jenkins来说,这仍然更好,因为您可以编写一个管道作业,集成SCM检索、docker代理、构建执行和shell执行(如果需要)。总的来说,在团队使用的工具中,您将执行步骤成功的所有细节都保留为失败

在JavaEE中,安全更新在理论上非常容易。你更新了一个 应用服务器,例如WildFly或应用安全补丁,如果 应用程序只使用JavaEEAPI,无需进一步操作

在我最近的记忆中,在所有环境中更新JavaEE服务器从来都不是一件容易的事情,不像更新文件中的版本那么简单。
更新Weblogic和Websphere的官方程序非常挑剔,更新也需要花费很多时间,因为这些服务器是如何说。。。膨胀,回滚到以前的版本也并不总是容易的

另一方面,微服务通过使组件更加自治和可维护而带来价值,但这也有成本:集成它们并维护它们并不便宜。因此,微服务粒度也应该在这一方面加以考虑

如果系统由30个基于Spring Boot和 使用Gradle或Maven作为构建工具并作为Docker分发 图片,是否有一个简单的方法来更新所有的Spring启动版本 微服务?一个接一个地更新所有的微服务需要很多时间 努力。一个系统拥有的微服务越多,付出的努力就越多 必需的

使用Jenkins引用的CI工具,在每个微服务应用程序中进行相关的自动化测试,这并不难升级 使用spring版本的pom/gradle文件,甚至可以在集成环境中使用自动化IT基础设施工具将其部署为Ansible。 一般来说,如果项目属于多模块项目maven版本插件,那么可以使用maven/gradle插件更新所有项目的依赖版本,gradle版本插件可以这样做。 如果项目不属于多模块项目,还有其他选择,但您应该添加手动SCM检索步骤。 整个任务可以通过shell脚本完成,或者更好地通过jenkins作业完成,使用spring引导版本,您可以按需执行。对于Jenkins来说,这仍然更好,因为您可以编写一个管道作业,集成SCM检索、docker代理、构建执行和shell执行(如果需要)。总的来说,在团队使用的工具中,您将执行步骤成功的所有细节都保留为失败

在JavaEE中,安全更新在理论上非常容易。你更新了一个 应用服务器,例如WildFly或应用安全补丁,如果 应用程序只使用JavaEEAPI,无需进一步操作

在我最近的记忆中,在所有环境中更新JavaEE服务器从来都不是一件容易的事情,不像更新文件中的版本那么简单。 更新Weblogic和Websphere的官方程序非常挑剔,更新也需要花费很多时间,因为这些服务器是如何说。。。膨胀,回滚到以前的版本也并不总是容易的 使用BOM BOM BOM表,这是一种特殊的POM,它捆绑了多个依赖项并提供了它们的版本

dependencies {
    implementation platform("org.springframework.boot:spring-boot-dependencies:${springBootVersion}")
    implementation platform("org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}")

    implementation 'org.springframework.boot:spring-boot-starter-web' //version is taken from BOM
    implementation 'org.springframework.cloud:spring-cloud-context' //version is taken from BOM
    //...
}
创建具有特定依赖项的自定义BOM表,如中所述

这样,在build.gradle中,只有BOM依赖项才会用版本声明。所有其他依赖项将使用BOM提供的版本。在gradle.properties中声明BOM表版本

要更新依赖项,只需在gradle.properties中更新BOM表版本。此任务可以使用sed自动化

可以创建更新版本的Bash脚本,例如../update-version.sh springBootVersion 2.2.6.RELEASE,并在参数化Jenkins作业中调用。存储库、版本变量名和新版本值可以作为参数提供

所描述的方法略微简化了更新库的过程,同时具有确定性的构建,您总是知道使用了什么版本的库。

< P>谢谢,我想出了一个我认为干净简单的解决方案。 总体思路是简单地手动更新库版本的过程,而不是使用变通方法,例如动态版本1+使构建不确定,在Jenkins上安装集中管理的gradle.properties等

使用BOM BOM BOM表,这是一种特殊的POM,它捆绑了多个依赖项并提供了它们的版本

dependencies {
    implementation platform("org.springframework.boot:spring-boot-dependencies:${springBootVersion}")
    implementation platform("org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}")

    implementation 'org.springframework.boot:spring-boot-starter-web' //version is taken from BOM
    implementation 'org.springframework.cloud:spring-cloud-context' //version is taken from BOM
    //...
}
创建具有特定依赖项的自定义BOM表,如中所述

这样,在build.gradle中,只有BOM依赖项才会用版本声明。所有其他依赖项将使用BOM提供的版本。在gradle.properties中声明BOM表版本

要更新依赖项,只需在gradle.properties中更新BOM表版本。此任务可以使用sed自动化

可以创建更新版本的Bash脚本,例如../update-version.sh springBootVersion 2.2.6.RELEASE,并在参数化Jenkins作业中调用。存储库、版本变量名和新版本值可以作为参数提供


所述方法略微简化了更新库的过程,同时具有确定性构建。您始终知道使用的库版本。

虽然不规范,但这是一个非常有趣的问题。这就是许多公司转向monorepo的原因。虽然不规范,这是一个非常有趣的问题。这就是许多公司转向monorepo的原因。
springBootVersion=2.2.4.RELEASE
springCloudVersion=Hoxton.SR1
myBomVersion=1.0.0
sed -i'.original' -E 's|(springBootVersion)=(.+)|\1=2.2.6.RELEASE|g' gradle.properties