通用java后台服务

瘦Jar包

java 生成 jar 包一般都默认采用 fat 模式,导致生成的 jar 包很大,因为包含了所有依赖包,传输的时候如果网速慢的话会很不太方便。通常,正式包发布后,依赖 jar 包就不会太变化,变化的一般是业务逻辑,所以如果能把业务 jar 包和依赖 jar 包分开,即 thin 模式,那么只需要每次更新业务 jar 包就行了。但 fat 也方便了本地部署,因为就只有一个 jar 包,所以在正式版发布前,内网测试还是应该采用 fat 模式。

项目构建文件

build.gradle

task expDepJars(type: Sync) {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
    from System.properties['java.home'] + '/lib/ext'
    from configurations.runtimeClasspath
    into "$buildDir/libs/lib"
}

bootJar {
    excludes = ["*.jar"]
    dependsOn expDepJars
}
  • 采用 Sync 类型,而不是 Copy,这样每次会删除已经弃用的依赖 jar 包;
  • System.properties[‘java.home’] + ‘/lib/ext’ :标准 jre 额外依赖 jar 包;
  • 采用 configurations.compileClasspath 会少包,所以这里用 configurations.runtimeClasspath。

同步远程依赖包

rsync -v -r --ignore-existing --delete build/libs/lib 192.168.12.34:/home/cloud/file/test
  • ignore-existing 表示如果远程中已经有同名 jar 包,则不重复传输,因为同名依赖 jar 包一定是一样的文件;
  • delete 表示以本地为主,对远程进行同步,多则删之,少则补之;
  • 本地依赖 jar 包目录 build/libs/lib 对应远程依赖 jar 包目录 /home/cloud/file/test/lib。

镜像制作

项目构建文件

build.gradle

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath('se.transmode.gradle:gradle-docker:1.2')
    }
}

apply plugin: 'docker'
group = 'java'
version = '1.8'

jar {
    archivesBaseName = 'base'
    archiveVersion  = '1.8'
}
// use `sudo gradle build buildImage`
task buildImage(type: Docker, dependsOn: build) {
    push = false
    applicationName = 'base'
    dockerfile = file('src/main/docker/Dockerfile')
    doFirst {
        copy {
            from jar
            into stageDir
        }
    }
}
  • 只需配置Docker镜像生成任务相关;

Docker镜像生成文件

src/main/docker/Dockerfile:

FROM openjdk:8u181-jre-alpine
VOLUME /tmp
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-Dspring.security.strategy=MODE_INHERITABLETHREADLOCAL", "-Dspring.config.location=/src/main/resources/config/application.yml", "-Djava.ext.dirs=/applib", "-jar", "/app.jar"]
  • 业务 jar 包为 /app.jar,额外依赖 jar 包在 /applib,配置文件都放在 /main/resources/config,这里的路径都是容器中的路径;
  • 这里之所以把 application.yml 放在 /main/resources/config,是因为项目数不多,采取每个项目一个库,即多mysql数据源切换连接方式;
  • 生成的镜像为:java/base:1.8。
    本地生成离线镜像:
docker save java/base:1.8 | gzip > javabase.tar.gz

主机加载离线镜像:

docker load < javabase.tar.gz

运行实际业务

docker run -u root -d --name test -p 8080:8080 -h 192.168.12.34/test \
    --restart=always --log-driver=json-file --log-opt max-size=20m --log-opt max-file=5 \
    -v /home/cloud/conf/test:/src/main/resources/config \
    -v /home/cloud/file/test/test-0.0.1.jar:/app.jar \
    -v /home/cloud/file/test/lib:/applib \
    -v /etc/localtime:/etc/localtime:ro \
    java/base:1.8
  • /home/cloud/file/test/test-0.0.1.jar 一般是生成的 springboot 业务 jar 包;
  • /home/cloud/file/test/lib 放额外依赖 jar 包;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章