- 代码评审
代码的恶性循环:
1没有时间codeRevew
2 业务崔的紧直接写代码
3 没时间填坑,却不断挖坑
好的程序员
- 第1个星的程序员写出计算机可以理解的代码。
- 第2星写出自己未来可以理解的代码。
- 第3星写出别人都可以自我理解的代码。
程序员的自我修养
1.写出好的代码
2技术水平不断提高
3帮助别人成长
代码的评审
维度包括
1.熵减的过程,减少系统的混乱
2.团队的成长,养成团队之间的交流文化。
3.提高代码质量,工程师互相review,扫除知识盲区,提升代码的质量
3.提升代码的规范度,通过代码审查发现纠正不规范的情况,形成良好的开发规范。
如何代码审查(Review)
- 统一的编码规范与设计规范
- 完整的技术架构说明与用例
- 不定期的Review会议
- 小项目(3个月内)可以10天一次,大项目(6个月以上)可以15天一次。开发前期密集点,后期可以安排间隔长点1个月一次。
Review的工具:
Phabricator Facebook开源的代码审查工具。
Gerrit:非常强的CodeReview+代码托管的工具
CheckStyle:代码规范性检查工具
代码审查的建议
- 对事不对人
- 不要在review中讨论需求
- 至少一条正面评价
- 提交的代码内容一定要少
- 明确各个模块的负责人
代码评审时应该注意的方向维度
- 注意逻辑执行的前提条件的校验和数据的合法性
- 注释的有效性
- 打印异常堆栈信息
- 方法换行执行空4个空格(.set())
- 打印日志时禁止使用JSON工具将对象转换为String,因为如果某些get方法被覆盖时,转换时可能抛出异常,这样打印日志会影响正常的业务执行。
- 发生异常时打印日志的信息应该包括业务参数部分。
- 健壮性与鲁棒性
系统的健壮性指系统在1.异常情况下、2.特殊环境、3.超时情况
系统依然能稳定运行的能力
鲁棒性:形容词robust:强健的,强壮的,耐用的,坚固的,富有活力的。
健壮性与鲁棒性是否一样?
应该是一样的。健壮性是意译,鲁棒性是音译,其实是一样的。
健壮性的维度
1从架构方面:负载均衡,容灾能力
- 均衡负载
负载均衡有名的公司,
F5公司是应用交付网络(ADN-Application Delivery Networks)领域的全球领先厂商,命名含义: 系统公司具有非常强的稳定性,在各种复杂和异常情况下都能帮客户解决问题,同时也代表龙卷风的最高等级EF5情况下依旧能帮客户解决问题,显示公司的强大能力。
负载均衡的定义:防止服务或者数据热点问题的出现,使得集群内的所有服务器的负载水平在同一个水平线上。
软件负载:
1).LVS(Linux Viritual Server),是由章文嵩主导的开源负载均衡项目,已经集成到了linux的内核中,实现了基于IP的数据请求负载均衡调度方案。
2)VIPServer是阿里中间件开发的负载均衡产品,提供动态的域名解析,和负载服务,支持多业务单元同业务单元优先、同机房优先、同区域优先,并支持各种健康监测协议,支持精细的权重控制,提供多级容灾体系。
- 容灾能力
容灾能力包括4方面:熔断、限流、降级、灾备
熔断:服务全部停止响应以保护核心流程正常运行
限流:有策略的丢弃部分用户请求
降级:部分功能不可用,或用户体验被降级。
灾备:复制多份系统能力或者数据核心服务单点问题
容灾能力相应的软件
Sentinel:阿里开源的项目,提供了流量控制,熔断、降级、系统负载保护等多个维度来保障系统服务的稳定性。
是一个轻量级的框架,依赖的内容不多。
流控方式里有个warm up:指的是java在运行时是字节码在运行,如果一个模块的字节码在高频的被调用时,虚拟机会将该段字节码转为二进制文件,这样执行速度更快,但是如果流量太大时可能没有时间去做warmup,所以给预留了这个方式。
流控规则配置
sentinel的服务感知
是通过heartbeat(心跳包)来感知服务的健康。
如下是K8s的容灾
2.从代码角度: 参数校验,异常处理,分支覆盖
3.从环境方面:混沌工程,异地多活
2数据健壮性:
数据健壮性的4个维度:主备准实时备份、逻辑删除、定时本地冷备份、定时云端离线备份
主备准实时备份:快速切换服务的能力
逻辑删除:杜绝物理删除
定时本地冷备份:可以作为数据日志的快照
定时云端备份:防地震,水灾等自然灾害。
代码的健壮性:主要包括6方面
- 所有的POJO类属性必须使用包装类数据类型,防止被设置默认值。
- 定义DO/DTO/VO等pojo类时不要设置任何属性默认值。
- 定义数据对象DO类时,属性类型要与数据库字段类型相匹配。
- 在get和set方法中不要增加业务逻辑。
- 禁止在pojol类中同时存在对应属性xxx的isxxx()和getxxx()方法
6)构造方法里禁止增加任何业务逻辑,如有初始化逻辑放在init方法中。
面向失败架构:是指在异常情况下的架构设计,主要包括4方面:网络抖动、服务超时、弱电断电、洪峰流量。
网络抖动:甚至断网,如何提示,恢复,切换。
断电预案:UPS(Uninteruptible Power Supply)中文翻译为不间断电源。是一种含储能装置,以整流器、逆变器为主要组成部分,为变电站内监控系统等提供恒定电压和恒定电频的不间断电源。
这种设备分为3种:1.被动后备式UPS电源;2在线互动式UPS电源3)双变换式UPS电源
其中第三中最好也是最贵的。
服务超时:任何服务都要考虑超时没有返回的可能性。
弱电、断电:配置多个云,多地部署能力
洪峰流量:流量打爆服务器后的架构健壮性。
断网处理
面向失败设计
从面向对象角度来看,面向失败的设计就是以“失败”为对象,天然为了处理失败而存在的设计思想。
在古代肌肉是力量,20世纪知识是力量,现在思维是力量。思维层次更高,更加全面的人更具竞争力。结构化思维、逆向思维、风险思维都非常重要,需要打开自己的思维来思考和面对失败的设计。
面向失败设计的核心理念:
- 任何环境都是不可信赖的,都需要对环境进行预处理
- 任何外部依赖接口都有可能出错
- 任何异常都需要响应和处理
- 任何行为都需要日志记录的
- 任何系统的上线都需要经过严酷的测试
健壮性测试
健壮性测试包括4方面:功能测试、性能测试、稳定性测试、混沌工程
功能测试:相信用户的一切可能行为,进行正确性验证
性能测试:系统能够提供的最大服务级别的能力
混沌工程:确定线上系统的故障恢复能力,混沌工程是在分布式系统上进行实验的学科,是一种未雨绸缪的心态。由薄弱环节,做到自我发现,在薄弱处放置一个炸弹控制爆炸半径评估损失和系统的自我修复能力。
混沌工程的原则包括5个,1建立稳定状态的假设、2多样化显示世界事件、3在生产环境运行试验、4持续自动化运行试验、5最小化的爆炸半径
混沌工程的4个步骤:
混沌工程的操作
稳定性测试:确定系统长时间在正常压力情况下运行的有效性。
测试覆盖率:包括代码覆盖率、条件判断覆盖、路径覆盖
ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。说白了asm是直接通过字节码来修改class文件。