藏经阁2.0全新上线!下载本地、线上阅读让你轻松获取技术知识。为了让更多人学习到藏经阁中的优秀技术作品,培养好的阅读习惯,“藏经阁一起读”活动来啦,你阅读,我奖励!
本期书籍:《Java应用提速(速度与激情)》
阅读地址:https://developer.aliyun.com/ebook/7850
书籍简介:本文将阐述java应用如何通过基础设施与工具的改进,实现从构建到启动全方面大幅提速,内容涵盖:maven构建提速、本地IDEA环境提速、docker构建提速、JDK提速、Classloader提速、阿里中间件提速以及其他提速。
活动规则:阅读书籍,将你对于本书的想法、收获等在评论区留言,评论不少于200字,将选取评论质量最高的前3名送出小米鼠标lite一个。
活动时间:2022年12月5日~12月12日14:00
参与用户务必扫码加入钉群,第一时间了解活动进展、获取得奖信息。
编程规约 辨识鲜明,快速理解 将设计模式体现在模块、接口、类、方法等命名中,有利于阅读者快速理解架构设计理念。 常量按常量的功能进行分类,分开维护,注意常量的复用层次: 常量的复用层次有五层:跨应用共享常量、应用内共享常量、子工程内共享常量、包内共享常量、类内共享常量
如果一个java建的服务系统的项目是房子的话,java web就是墙,java就是墙砖,这本书告诉你怎么能用手上的砖快速砌墙,同时保障墙组成的房子不会倒塌,善于使用书中提的应用,相当于你手上的水泥,铁锹,砌墙铲子,把房子盖牢靠,优化算法、利用索引、利用缓存、增量更新、并发处理、调整逻辑、环节消除,最大限度的把房子从烂尾楼里拉出来,详细的可以读原本,有代码基础的不太会使用工具的可以看看
很好的一本书籍,如果大家当作手册来看,我感觉更适合。本书籍从以下几个方面阐述知识: + maven构建提速 + 本地IDEA环境提速 + docker构建提速 + JDK提速 + Classloader提速 + 阿里中间件提速以及其他提速
书籍中很多知识是我们需要认真去思考的东西,算法、索引、缓存、增量、并发、逻辑、思维、原理等,为什么原生的Classloader比较慢,如何优化,使用什么算法,优化哪些点,优化索引,及时编译器效率,如何优化,原理是啥,怎么样提速,有没有更好的解决方案等,我们更多的需要了解这些知识。
作为一个前端开发者,首先就是,关于Java的学习除了在大学时候的学习之外,就是在工作之余的自学,从前端开发的视角来看待Java的增效之路,也是一知半解的,毕竟不是从事后端的工作。其次,通过读了《Java应用提速(速度与激情)》这本书之后,又有了新的更高层次的认知,尤其是关于Java在实际常用的各个方面的提效增速,俗话说的好:欲先善其事,必先利其器。在Java开发使用中,提高开发效率的大部分是在各种相关工具,尤其是构建编译时候,镜像构建的时候,服务启动的时候,这些都是在日常开发中提效的优化点,所以这也是我读了本书收获的最大的点:通过基础设施和工具改进来提高Java的开发效率。
以一个基本入门Java开发的前端开发者来看这本书,我比较在意的是Java开发中工具使用以及基础设施,因为之前在做公司的一个基于硬件物联网相关的后台项目的时候,由于某些原因,使得在开发时候运行项目就花费十几分钟,每次运行和编译都比较头疼,等待的时间很长,开发效率非常的底下,所以我对这块的印象非常深刻。不过现在随着技术的进步,以及各种工具和插件的优化完善,Java开发的时候效率会提高非常大,尤其是阿里云中间件的推出和不断迭代,对物联网开发的Java后台,是一个福音,结合公司购买的阿里云服务器,可谓是如虎添翼,双重保障,让Java开发增速显著。
最后,我觉得在Java应用的优化和增效,最多的是相关的基础设施和工具的改进优化。
一、编程规约 辨识鲜明,快速理解 将设计模式体现在模块、接口、类、方法等命名中,有利于阅读者快速理解架构设计理念。 常量按常量的功能进行分类,分开维护,注意常量的复用层次: 常量的复用层次有五层:跨应用共享常量、应用内共享常量、子工程内共享常量、包内共享常量、类内共享常量。 方法不超过80行 简洁性 红花和绿叶的区分 注意不使用过时的类或方法 构造方法里面禁止加入任何业务逻辑,如有初始化劣迹,需要放在init方法中 多个构造方法或同名方法,按顺序放在一起,便于阅读 类内方法定义的顺序:公有方法或保护方法>私有方法>getter/setter方法 合理利用数据结构,eg:set的唯一性、map、集合的有序性和稳定性 保证线程安全,线程资源必须通过线程池提供,不得自行显式创建线程 更加明确线程池的运行规则,规避资源耗尽的风险 高并发时,同步调用应该考量锁的性能损耗。尽可能使加锁的代码块工作量尽可能的小,避免在锁代码块中调用RPC方法 注意代码规范,if/else/for/while/do语句中必须使用大括号 尽可能提高可读写性,不要在条件判断中执行其他复杂的语句,可以将复杂逻辑判断的结果赋值给一个有意义的布尔变量名,以提高可读性。 避免采用取反逻辑运算符 注释规约需要使用Javadoc规范,包括返回值、参数、异常说明、做什么事、实现什么功能 所有的类都必须添加创建者和创建日期 代码进行修改的同时,需要更新注释的修改 注释掉代码需要在上方详细说明 语义清晰的代码不需要额外的注释 统一的重要性:格式、各类部件的属性、请求、消息设定等 任何数据结构的构造或初始化都应指定大小、避免数据结构无限增长吃光内存 及时清理不在使用的代码段或配置信息 二、异常日志 错误码的制定原则:快速溯源、沟通标准化 错误码格式规定,编号永久固定 捕获异常: catch的时分清稳定代码和非稳定代码 捕获的异常必须进行处理 尽可能进行区分异常类型 应用值不可直接使用日志系统中的API,而应依赖使用日志框架中的API 日志命名规定 谨慎地记录日志: 生产环境禁止输出debug日志; 有选择地输出info日志; 如果使用warn来记录刚上线时的业务行为信息,一定要注意日志输出量的问题,避免把服务器磁盘撑爆,并记得及时删除这些观察日志。 三、单元测试 好的单元测试必须遵守AIR原则 A:Automatic(自动化) I:Independent(独立性) R:Repeatable(可重复) 单元测试需要保证测试粒度足够小,有助于精确定位问题 编写单元测试代码遵守BCDE原则,以保证被测试模块的交付质量。 B:Border,边界值测试,包括循环边界、特殊取值、特殊时间点、数据顺序等。 C:Correct,正确的输入,并得到预期的结果。 D:Design,与设计文档相结合,来编写单元测试。 E:Error,强制错误信息输入(如:非法数据、异常流程、业务允许外等),并得到预期的结果。 多层条件语句建议使用卫语句、策略模式、状态模式等方式重构。 四、安全规约 隶属于用户个人的页面或者功能必须进行权限控制校验。 用户敏感数据禁止直接展示,必须对展示数据进行脱敏。 表单、AJAX提交必须执行CSRF安全验证。 五、MySQL数据库 表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。 表名不使用复数名词。 表的命名最好是遵循“业务名称_表的作用 单表行数超过500万行或者单表容量超过2GB,才推荐进行分库分表。 表必备三字段:id, create_time, update_time 不得使用外键与级联,一切外键概念必须在应用层解决。[外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度] 因国际化需要,所有的字符存储与表示,均采用utf8字符集 在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。 六、工程结构 分层模型规约 DO(Data Object)此对象与数据库表结构一一对应,通过DAO层向上传输数据源对象。 DTO(Data Transfer Object)数据传输对象,Service或Manager向外传输的对象。 BO(Business Object)业务对象,可以由Service层输出的封装业务逻辑的对象。 Query 数据查询对象,各层接收上层的查询请求。注意超过2个参数的查询封装,禁止使用Map类来传输。 VO(View Object)显示层对象,通常是Web向模板渲染引擎层传输的对象。 为避免应用二方库的依赖冲突问题,二方库发布者应当遵循以下原则: 精简可控原则 稳定可追溯原则 七、设计规约 存储方案和底层数据结构的设计获得评审一致通过,并沉淀成为文档。 类在设计与实现时要符合单一原则。 系统设计阶段,注意对扩展开放,对修改闭合。 系统设计阶段,共性业务或公共行为抽取出来公共模块、公共配置、公共类、公共方法等,在系统中不出现重复代码的情况,即DRY原则(Don't Repeat Yourself)。 设计的本质就是识别和表达系统难点。
这么比喻一下,如果一个java建的服务系统的项目是房子的话,java web就是墙,java就是墙砖,这本书告诉你怎么能用手上的砖快速砌墙,同时保障墙组成的房子不会倒塌,善于使用书中提的应用,相当于你手上的水泥,铁锹,砌墙铲子,把房子盖牢靠,优化算法、利用索引、利用缓存、增量更新、并发处理、调整逻辑、环节消除,最大限度的把房子从烂尾楼里拉出来,详细的可以读原本,有代码基础的不太会使用工具的可以看看
读完了整部书,发现以前都忽视了这一块:“从java应用的一些基础设施和工具层面着手,提速java应用”,或许也是由于一直没接触过这么庞大的应用吧。
对于小应用而言,简单的优化下代码逻辑,提高部分功能的执行效率,是我们会关注的重点,我们基本不会从工具层面、从基础设施层面来考虑速度上面的问题,因为它们对我们项目几乎没影响,或者说不被重视,也或者说还不至于让我们能参与到这等程度,能实现好项目功能,让业务顺利执行就够了。
从这本书中,开阔了我认知,我了解到了提速的新方向,也汇总了下提速的不同手段:
优化算法:算法要和使用的场景结合起来,没有最好的,只有最适用的。例如结合 maven 的版本仲裁机制,从深度优先算法(DF)改到广度优先算法(BF)
利用索引:索引是为了提高查询效率的,像字典的目录一样,所以对于检索查询的场景去做优化,往往要用到索引。例如ClassLoader提速一章:
优化的方案可以简单的用一句话概括,就是给URLClassLoader的资源查找加索引。
增量是与缓存息息相关的,增量的实现就是用缓存
增量更新:特别再提一下增量,对于java应用部署war包之类的,有直观的感触,一个几G的文件每次更新可能只有几M的变化,但要重新全部传输一遍,浪费太多时间,只增量更新就快多了
并发处理:在保证安全的基础上,利用并发,同时处理多个请求,或者将复杂的操作分成多个线程同时进行。例如maven提速中的分布式并发构建、增大下载并发数、扫包算法并发扫jar包
调整逻辑:有的时候遇到的场景是,某段逻辑放在这里是不合适的,想办法提高它的效率,可能难以做到的,这个时候我们需要转变思路,考虑这段逻辑的主体执行者该是谁了。例如maven提速中【SNAPSHOT 版本号缓存】,在mave中检测SNAPSHOT时要多次请求maven仓库,SNAPSHOT是否有更新maven仓库是最先知道的,这个时候应该是将这个更新的通知接收,然后更新我们这边缓存的版本号信息,我们就知道是否版本号有变化,而不是每次都主动的去查询是否有更新。【另:在多个系统合作的时候,往往也碰到类似的场景,这个时候可能无力达成这个逻辑调整,对端系统就是不愿意去做这个事情,只能在我方系统去做,这样就没办法了~~】
环节消除:去除一些可以被简化掉的环节,使整个过程还能顺利运作,这样节省的就是整个该环节的耗时了。例如maven提速中直接消除字节码转机器码的环节:
maven 也是 Java 程序,运行时要将字节码转成机器码,而这转化有时间开销……用 JIT 直接将 maven 程序编译成机器码,同时 mvn 在构建完成后,不退出,常驻进程,当有新构建任务来时,直接调用 mvn 进程。
总的来说,我从这本书中,学到的多是一些理念上的思想,丰富认知,在实操上面并未涉及到多少。
另:【从盲侠说起】一节第一行多一个【有】字。
4.最后从部署运行方面入手, 加入了阿里中间件优化
从文风来看, 作者本着幽默的气质入手, 尽量每篇开头给大家举一个生活例子, 电影例子由比较大家对日常的印象开始 进入到 Java优化环境的原理内容, 能第一时间抓住大家的兴趣点, 不至于看很多原理图比较迷茫 _ 最后, 感谢作者的好书! 辛苦!
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。