我目前正在做一个基于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、消息代理等提供不同的基本映像。
注意-肯定会更新答案以获得更多想法