背景

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

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

分析依赖包

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

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

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

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

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

if [ -n "$1" ] ;thenecho 'print console log when test. 'nohup java -Dloader.path=$loadPath -jar myapp.jar >out.log 2>error.log &
elseecho 'ignore console log when product.'nohup java -Dloader.path=$loadPath -jar myapp.jar >/dev/null 2>&1 &
fi

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

微服务项目实践总结

瘦身包部署,最重要的是依赖包的版本统一,最好能在项目搭建的时候就统一在父工程中统一管理版本,保证各模块中相同库的版本一致,这对共享 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。

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

SpringCloud 多模块部署瘦身包整理流程相关推荐

  1. Jenkins部署瘦身jar包

    更改项目打包方式 1.在要打包的项目pom文件夹加入以下语句,使依赖与资源文件与jar包分离 <build><plugins><plugin><groupId ...

  2. ttf字体包瘦身,ttf字体包提取指定字体,缩小ttf文件体积。

    ttf字体包瘦身 注:此方法只试用于只需要少数字体的情况. 需求 做APP时出现了一个需求,应用登录页面和主页面的系统名称需要根据用户所属行政区划进行动态调节. 为了突出系统名和样式的美观,系统名在显 ...

  3. 【SpringBoot】32、SpringBoot项目Jar包如何瘦身部署

    一.背景 SpringBoot 为我们快速开发提供了很好的架子,使得我们只需要少量配置就能开始我们的开发工作,但是当我们需要打包上传部署时,却是很神伤的一个问题,因为打出来的 Jar 包少则十几兆,多 ...

  4. 如何优雅的给SpringBoot部署的jar包瘦身?

    一.需求背景 我们知道Spring Boot项目,是可以通过java -jar 包名 启动的. 那为什么Spring Boot项目可以通过上述命令启动,而其它普通的项目却不可以呢? 原因在于我们在通过 ...

  5. Springboot-jar包瘦身部署

    目录 一.获取依赖的jar包 二.修改pom文件 三.运行命令 四.gradle版本 Springboot默认jar的方式打包,会把所有依赖都打包,有的jar比较大,变动很小,这样每次部署都整个发布, ...

  6. Maven打包(瘦身打包部署),不包含第三方依赖jar包

    方式1 pom 配置 <properties><startClass>com.answer.jaemon.Application</startClass> < ...

  7. SpringBoot 部署 Jar 文件,瘦身优化指南 !

    以下文章来源方志朋的博客,回复"666"获面试宝典 作者 | Java基基 来源 | https://mp.weixin.qq.com/s/Y5VK7TI1TQBN6O-k5O6h ...

  8. 不错!SpringBoot发布Jar包优化瘦身指南!

    概要说明 随着Spring Boot的流行,大家体验到只需构建输出一个jar文件,然后只需一个java -jar命令就能部署运行应用的爽快.常见一些单体应用随着项目规模的扩展单个jar文件的大小越来越 ...

  9. SpringBoot部署Jar文件,瘦身优化指南!

    作者:xautlx gitee.com/xautlx/package-optimize-demo 本文截取代码片段来自于对应的完整示例源码工程: https://gitee.com/xautlx/pa ...

最新文章

  1. 【汇总记忆:命令、语法、函数、等】
  2. 《精解Windows8》——2.6 Windows应用商店
  3. 从老板身上偷学的东西,你能吗?
  4. 理解sqlalchemy与ORM
  5. 解决popup不随着window一起移动的问题
  6. python转c报错no module named_python异常No module named 'win32com'
  7. Indian Buffet Process(印度自助餐过程)介绍
  8. Windows互斥锁的使用
  9. 水晶报表之创建子报表
  10. mysql 逗号 join_mysql – sql join表,其中1列有逗号
  11. JavaScript高级程序设计 总结(一)详细版
  12. 蓝桥杯之桥本分数式(全排列函数应用)
  13. 微信公众号接口调用php示例,php微信公众号js-sdk开发应用_php实例
  14. 洛谷P1600 天天爱跑步
  15. 5分钟通过水痘事件来认识系统架构
  16. 冒泡排序(Bubble Sort)含gif动图
  17. python-django(一)
  18. 峰会回顾 | 阿里云与StarRocks合作、开放、共赢
  19. VueHub:我用 ChatGPT 开发的第一个项目,送给所有 Vue 爱好者
  20. zigzag扫描matlab,ZIGZAG扫描的MATLAB实现

热门文章

  1. Android系统下载管理DownloadManager
  2. 导出Echarts图表
  3. 微型计算机首先同用户打交道,北京邮电大学网络教育计算机基础入学考试模拟题及答案(3)...
  4. html 页面标签转换效果实例
  5. css 多层ul li,css中的ul li ul li ul li ul li 实现四级菜单
  6. 软件定义雷达(SDR)和软件化雷达(SR)
  7. mysql 如何创建自定义函数
  8. 零中频接收机频率转换图_【收发器(Transceiver)架构2-接收机2,做射频的同学建议看!】...
  9. java-发送163邮箱
  10. 8155-XBL分析