如何在不同的微服务之间共享jar层?



我目前正在做一个基于spring-boot的微服务项目。目前,每个微服务都有自己的分层罐,并使用默认的spring引导层配置。这已经减少了同一微服务的小版本变更中不同层的数量。但是,当需要将容器映像推送给客户时,许多不同的微服务加在一起。

然而,许多微服务共享它们的大部分依赖。例如所有使用弹簧芯和弹簧引导功能。它们中的大多数使用spring-data-jpa。其中一些使用消息代理、solr进行搜索或spring集成。还有一些特性是一个微服务独有的,比如有一个微服务需要生成pdf文件,或者另一个微服务需要发送电子邮件。

我是否能够在不同的微服务之间共享公共层?就像有一个层包含了弹簧核心和弹簧引导以及它们的传递依赖关系。然后有一个层包含spring-data-jpa及其传递依赖项,不包括来自spring-core和spring-boot层的依赖项。等等…

如果需要缩小交付成果,可以尝试以下方法:

  • 没有将SpringBoot应用程序打包到一个fat jar中,而是将包含所有依赖项的库保存在某个公共文件夹中。
  • 在为容器映像构建应用程序时,很可能必须将库类型设置为provided,以便它不会被打包到最终组装中(这将使本地开发变得复杂)。
  • 每个微服务都将cp选项作为引用该文件夹的参数传递给JVM。
  • 如果使用docker构建,则应该将libs文件夹的复制定义为单独的步骤,或者甚至创建一个基本映像,将所有库包含在特定文件夹中(由JVM进一步引用)

注意事项:

  • 所有这些步骤都会使容器映像构建阶段复杂化。
  • 通常,节省的空间将无法补偿所需支持的工作量和复杂性。

可以有多个选项

  • 选项1使用多级Dockerfile?

    • 这样团队就可以有一个公共层,可以首先运行

    • 尽管它可能会迫使你为所有的微服务使用一个单一的构建管道

    • 我们可以在映像构建阶段利用--target参数来减少在特定阶段停止的步骤

    • 为spring-data-jpa, broker等单独的基映像。这听起来不那么富有成效

    • 这个选项会比较慢,我认为下面的第二个选项更好。

  • 选项2创建一个公共的(单个或多个)基于父spring (java)的pom.xml

    • 公共层可以对应一组公共jar/依赖项,可以作为基础映像提前构建,可以通过某种版本控制引入
    • 版本控制将需要彻底的查找,文档&;跨团队沟通。
    • 这样就可以为data-jpa、消息代理等提供不同的基本映像。

注意-肯定会更新答案以获得更多想法

相关内容

  • 没有找到相关文章

最新更新