java工程镜像瘦身

2022-07-30 22:24:43 浏览数 (1)

前言

从研发到发布,试图挖掘一下产品瘦身可能性,并提出“java公司化代码”思路来改造我们的代码。

现状

跟负责打包发布的同事了解咨询,镜像下载优化遇到瓶颈。

  • 慢:早10点高峰期,奇慢无比
  • 宕机:偶尔宕机1到2个小时
  • 优化走到头:申请更大的带宽,优化镜像仓库物理配置,杯水车薪,跟不上更多的项目更大的包,钱花了听不到响

镜像一般大小情况

  • 前端工程:10~20M
  • 后端工程:600~800M
  • 大数据工程:1~2G

解决方案

从项目代码工程出发,自身进行瘦身。将矛头指向自己,指向工程依赖引入的代码。

三种依赖操作

先说开发中的3种形态,受这3种思想影响,最终导致工程镜像的膨胀程度。

搬运

这种就喊口号“不要重复造轮子”,“节省开发时间,提高开发效率”,依赖进来,拿来主义,用就行了。

  • 工具类:字符串、日期、数组、类转换、类拷贝 第一是Apache下的Commons库。第二个是google开源的Guava库。依赖、依赖、依赖,引入、引入、引入,大而全,什么都有。甚至于,造成了开发选择困难症,这个字符串判空是哪个好?引入了大量用不上类——浪费,引入了重复功能的类——奢侈。
  • 版本兼容:平行冲突和兼容,垂直版本冲突和兼容 Log4j VS Logback VS Log4j2有何不同,查查大项目工程里,怎么3者都有,一个都舍不得不用?在查查httpclient有种? 为什么还有2个版本fastjson,1.2.54、1.2.83?jackson也有多个版本,还有很多例子 上面就是平行引入,同一功能多版本引入做了举例。一些额外工作产生,冲突问题,要去设置问题。任务制造很多工作。同时看到构建时,对父级模块管理不严格。
  • 预制件:springboot约定大于配置 “最少必要”,完整的预制件,经过打磨和大范围使用验证,简单初始化后就可以生产工式编程。这是个小可爱,管不到后面大力成长。

裁缝/雕刻

有一定的学习和积累,了解并分析依赖关系,会做一些设置和进行排除。

拼图/积木/泥塑

手敲代码,登记比对依赖,托管管控依赖。下面举3例说明下:

es的juice

ES使用Guice框架进行模块化管理。Guice是Google开发的轻量级依赖注入框架(IoC)。软件设计中经常说要依赖于抽象而不是具象,IOC就是这种理念的实现方式,并且在内部 实现了对象的创建和管理。摘自:《Elasticsearch源码解析与优化实战》_张超。

但是大家有没有注意到AbstractModule代码,在es和在Guice是一样?官方的讨论也可以佐证自2016后就是这种策略。[1]

黑鸭子

Intel公司使用Black Duck公司 提供的Protex解决方案,验证软件开发人员在使用开源代码/第三方代码过程中,是否严格地遵守公司所制定的软件许可政策。该解决方案帮助Intel公司大量地减少软件重新编写工作,并将可能面临的商业法律风险控制在最低程度。

Intel公司组成专门的Protex项目团队,代表成员来自不同业务部门、不同职能领域。项目团队工作的一部分就是增强开发人员关于软件许可证问题的培训。项目团队不断寻求改进的验证方案。它要求每个产品都使用经批准的遵从法规的软件代码。在寻找有关解决方案时,项目团队安排一些业务部门试用Black Duck的 Protex 平台,并评估它是否符合Intel的要求。经过评估,Intel认为Black Duck 的解决方案可以有效的帮助他们进行开源软件和第三方软件的合规性检查,并帮助他们有效的管理开发过程中对开源软件和第三方软件的使用。在选择Black Duck 之后,Intel已经在全球部署了多台Protex 服务器。他们经常使用Protex分析将要发布到公司外部的软件。Protex 已经和Intel 其他法规遵从实践相结合,成为Intel 软件开发管理流程的组成部分之一。[2]

阿里Pandora

父级模块管不了事,它管!

  • Pandora Boot基于Pandora和Fat Jar技术,可以直接在IDE里启动Pandora环境,大大提高您的开发调试效率。
  • Pandora Boot与Spring Boot AutoConfigure深度集成,让您同时可以享受Spring Boot框架带来的便利。[3]

工具分析

有没有工具可以负责我们分析、排除、优化打包的?

  • 前端:grunt , gulp,webpack, rollup 生成简洁代码
  • 托管代码剥离:Unity 托管代码剥离,不仅可以减少生成的dll的大小,继而减少安装包的体积;托管代码剥离过程将分析项目中的程序集,以查找和删除未实际使用的代码。
  • maven-jar-plugin、maven-dependency-plugin

结语

理想状况下,公司应该掌控所有的代码,对于依赖的代码也应进行分析彻底,要逐步吸纳所有优秀架构、工具等进行公司化代码。一个成熟的java代码公司,就需要有自己的代码积木构建,备好所有零部件,登记备案。一、可以避免知识产权纠纷;二、所有工程按需引入积木构建,最少可用,为工程镜像瘦身提供极致可能。

0 人点赞