Spring项目服务部署方案
type
status
date
slug
summary
tags
category
icon
password
Quark框架打包部署说明
目前部署仍基于docker部署,使用maven插件的方式在maven的生命周期过程中构建镜像。
综合其他插件项目的优缺点,选用fabric8io/docker-maven-plugin(注:原shark框架的打包插件已不再维护更新)。
仓库地址:https://github.com/fabric8io/docker-maven-plugin
其功能比spotify更多、更强。不仅支持通过dockerfile和docker-compose文件进行docker镜像构造(build),镜像推送(push),还支持对容器操作(如run,stop,remove等),也就是说它可以实现对Docker从构建镜像到运行和推送完整的控制流程,这是它独树一帜的地方,fabric8io还可以用于远程主机build、tag、push(不推荐,该方式采用Docker Host,使用docker的api实现,但是一旦docker的host和port暴露,会有服务器安全问题,所以对连接需要配置各种加密)。
插件使用
由于插件的功能非常丰富,使用方式千奇百怪,不同配置也能实现同一种功能。目前采用Dockerfile + assembly.xml(这个文件是maven-assembly-plugin的自定义打包描述文件)方案实现,个人感觉这种方式比较灵活。
以Quark其中一个模块为例:

1.插件安装与配置
配置多环境打包时,可用profiles标签包括,定义不同环境下打包是否启用插件,详情见本文档多环境打包说明。
2.编写Dockerfile文件
build context:一个目录,所有和docker镜像相关文件的存放地。位于target/docker/项目名/模块名/版本号/build
3.编写assembly.xml文件
assembly.xml实际上是maven-assembly-plugin定制化打包的配置文件。(它可以将依赖lib、配置文件conf、原始jar文件、脚本分开)
而该插件使用了apache assembly的规范,和apache assembly略微不同的是没有id、formats标签。
详情参考: http://dmp.fabric8.io/#build-assembly https://maven.apache.org/plugins/maven-assembly-plugin/assembly.html
建议和docker构建有关的文件,一律使用assembly.xml管理,不用Dockerfile单独添加,否者可能会有路径问题
4.自定义jar包启动脚本
5.打包
多环境配置
这里的多环境,指两方面,分别是打包多环境和运行多环境(配置文件读取)
1.打包多环境
修改pom文件
maven打包时,带上打包环境名
2.运行多环境
目前关于环境配置,有两个环境,分别是local、prod(可自行增加)。
local环境,用于开发;prod环境,用户线上部署。
配置文件加载顺序为(yaml为例): bootstrap.yaml -> bootstrap-profiles.yaml − > application.yaml − > application − −{profiles}.yaml -> nacos配置(name.yaml -> name-${profiles}.yaml -> )
但是配置的优先级(覆盖)是反过来的

对于bootstrap.yaml,其加载顺序的优先级比application.yaml高,application.yaml是springboot的配置文件,用于ApplicationContext上下文。而bootstrap.yaml是由springcloud引进的(spring-cloud-starter-bootstrap),用于BootstrapContext上下文。
请注意,某些配置项必须放在本地或者通过实现EnvironmentPostProcessor接口直接设置,或者实现ApplicationContextInitializer类自定义配置刷新。
因为这些配置可能是在BootstrapContext上下文就开始加载,并且到达ApplicationContext时,从nacos上获取的配置没有刷新重新加载。
关于nacos上的配置,有以下问题(可能是官方bug,还是其他原因,目前并没有找到)。
官方给出nacos配置的dataId,由以下几个值组成: prefix−{spring.profiles.active}.${file-extension}
但测试发现,${spring.profiles.active}并没有拼接组成dataId。
FAQ
1.权限问题

这是由于执行mvn命令的用户不具备docker权限,请切换用户,或者添加sudo。

仍然是权限问题
2.maven拉取依赖问题

这是由于在打包过程中,从maven仓库下载依赖报错,请检查maven,随后重新执行打包命令。
3.字体缺失问题
某些使用了字体功能的服务,如system服务中的验证码,在docker环境下,由于基础镜像的原因,缺少字体报错。
java.io.IOException: Problem reading font data
解决办法,在对于服务的Dockerfile文件添加如下语句:
建议换一个基础镜像(可能镜像体积会变大),或者构建一个包含字体的基础镜像
4.构建上下文jar包不可执行,缺少依赖
在构建上下文(target/docker/项目名/模块名/版本号/build)目录下的jar包比target下的jar包体积小,且无法执行,这是其依赖没有打进jar包中。
产生这种情况的原因通常都是,插件和springboot本身的打包插件spring-boot-maven-plugin出现冲突。有两种解决办法: 1.移除插件自定义绑定的mvn生命周期
2.配置spring-boot-maven-plugin
5.内网环境如何打包
Jib 是 Google 开发的可以直接构建 Java 应用的 Docker 和 OCI 镜像的类库,以 Maven 和 Gradle 插件形式提供。
通过 Jib,Java 开发者可以使用他们熟悉的 Java 工具来构建容器。Jib 是一个快速而简单的容器镜像构建工具,它负责处理将应用程序打包到容器镜像中所需的所有步骤。它不需要你编写 Dockerfile 或安装 Docker,而且可以直接集成到 Maven 和 Gradle中 —— 只需要将插件添加到构建中,就可以立即将 Java 应用程序容器化。
由于jib不依赖于docker环境,并且其基础镜像可以是镜像tar包,那么只要本地环境maven有依赖(正常情况,你能用idea启动项目,本地仓库都是有依赖的),那么即可在本地打包,最后上传至服务器部署。
关于JIB的使用,请自行研究。
仓库地址:https://github.com/GoogleContainerTools/jib
- GitTalk