通用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 包;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章