• SpringCloud 多模块部署瘦身包整理流程


    背景

    SpringCloud 的微服务架构的应用程序发布时,多个模块可能会统一部署在一台主机上,那么就面临引用依赖过多,部署包介质过大,占用磁盘空间过多,下载耗时、更新麻烦等问题。

    连续对两个项目进行依赖包整理后,本文将总结多模块单机部署时瘦身包整理的基本思路。

    分析依赖包

    首选,模块瘦身打包。 各模块依赖的包单独打到特定目录,编写脚本打印出各模块的依赖。

    其次,找出所有模块都共有的包。 Shell 计算交集感觉有点复杂,简单的方法是用 Java 的集合来计算,用第一步打印的各模块的依赖文件,Java 读取文件到列表后走集合的 retainAll 计算出公共文件。

    第三步,其他纯功能的依赖包抽取到一起。 在用 Shell 将各个模块的纯功能的 jar ,如 commons-lang、mybatis、okhttp、Spring-Cloud 等依赖移动到特定公共目录中。

    第四步,启动参数配置。 按各模块的引用情况,调整启动脚本,加上 -Dloader.path 参数,注意,它不能与 Java 的自身的参数 -Djava.ext.dirs 一起用,因为是冲突的。

    第五步,启动脚本支持输出控制台日志。 初期验证时,需要对各模块逐个启动,难免会报错,所以可以对启动脚本的控制台输出进行存储,通过参数控制:

    if [ -n "$1" ] ;then
      echo 'print console log when test. '
      nohup java -Dloader.path=$loadPath -jar myapp.jar >out.log 2>error.log &
    else
      echo 'ignore console log when product.'
      nohup java -Dloader.path=$loadPath -jar myapp.jar >/dev/null 2>&1 &
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    启动脚本参数控制,测试的时候就可以看到启动问题了;生产的时候关闭控制台日志,减少磁盘空间的浪费。

    微服务项目实践总结

    瘦身包部署,最重要的是依赖包的版本统一,最好能在项目搭建的时候就统一在父工程中统一管理版本,保证各模块中相同库的版本一致,这对共享 jar 包提供了安全,可以减少包冲突的风险。

    如果一开始没有做好版本管理,那么整理依赖包时,有两种思路:

    第一,保险的抽取公共包的方法是按 jar 包的功能抽取,除了特殊依赖自动注入的包外,引用该包对模块不会有影响。缺点是,各自模块自身还有依赖,存在一部分冗余。

    第二,激进的方法是,所有模块的 jar 包一股脑放在一起,这个方式适合各模块依赖几乎一致的情况。优点是,全部依赖放在一起,没有冗余,最节省空间。

    所有模块的依赖都放在一起,存在不可控因素,所以选择的是第一种按功能包的方式,大概将一个包含十个模块的包从 2G 多降到了800MB 左右。

    启示录

    这个抽取公共依赖的过程,是通过 Shell 脚本完成的,期间又温故了 Shell 编程的知识,对依赖包的冲突和兼容问题也有了一些新知。

    1. nohup忽略脚本的控制台输出 >/dev/null ,注意这个字符串之间不能有空格,否则会提示:nohup: 重定向标准错误到标准输出。
    2. MyBatis 的高版本的 3.4.0 的 Orderitem 不兼容低版本 3.2.2 的方法,但是低版本倒是可以兼容高版本,挺不可思议的。
    3. 抽取公共包时,自动创建包目录 mkdir -p 参数,比起手动创建各目录方便多了。
    4. slf4j-log4j12-1.7.31.jar 和 logback-classic 里面有配置冲突,需要删掉一个。
    5. lang-mustache-client-6.8.6.jar 属于 ES 的依赖包被 spring-boot-autoconfigure.jar 引用了,抽取 elasticsearch 的时候还需要加入这个包。
    6. logback 包版本问题,logback.xml 配置文件中的 M 单位不识别,是区分版本的,低版本的识别 M 或 MB ,但是高版本的不识别M,只能识别 MB。

    总之,多模块共享部署包,需要逐个模块启动验证依赖是否有问题,最好能在项目初期做好版本控制,而不是等到发部署包时才去瘦身依赖。

  • 相关阅读:
    网站更换域名、改版对网站有哪些影响,如何补救?
    高性能日志脱敏组件:已支持 log4j2 和 logback 插件
    【游戏分享】Stellaris.Galaxy.Edition.v3.5.3-GOG all dlc
    河南省文化旅游发展相关统计数据(2014-2023年)
    linux-文件权限
    线程安全案例 --- 线程池
    使用arduino编写mqtt客户端连接emqx服务器
    AWVS+BP+XRAY三层联动扫描漏洞
    四、综合——通信系统
    【深入浅出 Yarn 架构与实现】2-4 Yarn 基础库 - 状态机库
  • 原文地址:https://blog.csdn.net/wojiushiwo945you/article/details/126496874