ToB企服应用市场:ToB评测及商务社交产业平台

标题: JAVA开发规范 [打印本页]

作者: 嚴華    时间: 2024-11-14 15:31
标题: JAVA开发规范
媒介

本规范的目的是提升代码质量,提升团队协作服从,规范中出现的强制,推荐,参考含义如下:
【强制】:必须严格遵守,如有特殊情况,需架构委员会评审报备。
【推荐】:没特殊情况必须遵守,在开发组长答应下可以不遵守。
【参考】:可以参考,不做严格要求。
背景开发规范

1.1 定名规范

1.2 常量规范

1.3 格式规范

1.4 Java规范

1.5 业务代码规范

  1. 正例:List groups = Lists.partition(list,500);
复制代码
1.6 异常规范

1.7 日志规范

1.8 注释规范

  1. 说明:对子类的实现要求,或者调用注意事项,请一并说明。
复制代码
  1. 说明:代码被注释掉有两种可能性:
  2.   1. 后续会恢复此段代码逻辑。
  3.   2. 永久不用。前者如果没有备注信息,难以知晓注释动机。后者建议直接删掉 ( 代码仓库保存了历史代码 ) 。
复制代码
  1. // 反例 put elephant into fridge
  2. put(elephant, fridge);
复制代码
  1. 方法名 put ,加上两个有意义的变量名 elephant 和 fridge ,已经说明了这是在干什么,语义清晰的代码不需要额外的注释。
复制代码
接口规范

比如{code:”0”,msg:”操作成功”,data:{XX}}。
数据库规范

1. 建表相干规范

2. 字段相干规范

3. 索引相干规范

4. 利用相干规范

安全规范

接口安全

代码安全

密码安全

技能文档的写作规范

Java开发编程军规

一、克制循环中查询数据库,尽量在循环外一次查询

系统性能瓶颈很大一部门都是指向了数据库,而循环中查询数据库非常耗资源。

展示少量树布局数据时,循环内查询数据后进行数据组装。导致服务器在测试环境就频繁宕机。
利用java.util.Comparator#compare方法调用数据库查询接口,导致线上性能极低。
二、克制把redis这种缓存当数据库用

缓存无法完全符合事务特性ACID原则,数据存在不可利用的风险比较大。

会员数据直接存储到redis缓存中,数据量也比较大,常常会丢数据。
三、克制循环中创建新线程,尽量利用线程池

四、死循环必须有退出机制

死循环中最好有休眠语句存在,另外还要退出机制。

订单同步应用请求第三方平台数据时,平台方没有翻页的结束标记,同时代码中没有退出机制直接导致该平台订单同步异常。
五、共享变量必须考虑线程安全

尽量避免利用共享变量,无法避免时必须考虑线程安全。

微信抽奖功能中,每次中奖都是同一个,原因是对共享变量进行了修改操作,背面的逻辑获取的是脏数据。
六、浮点盘算必须利用BigDecimal

假如需要准确盘算,非要用String来够造BigDecimal不可。
七、批量操作必须考虑合理分组

数据量大时须批量操作,而批量操作必须分组,避免一次操作耗时过久导致连锁反应。

订单汗青迁移数据时,分组为5000,导致数据库删除操作没有走索引。建议分组数量在100~500之间。
八、克制单点摆设

增加一台服务器摆设可以降低50%的服务不可用风险。
九、克制大表的全表扫描不加限流

全表扫描已经很耗数据库资源了,频繁处理请求不加限流就更雪上加霜。

售后问题跟踪单的导出,时间索引没有控制范围,导致全表扫描。导出数据接口没有加限流加剧服务资源斲丧。
十、读写分离架构,必须考虑读到逾期数据

读写分离在业务数据更新写入后再重现读取时会存在延迟问题,导致读到脏数据。

A. 双十一开启读写分离,主从同步有延迟,导致业务事件重复发送,原因是读取到汗青 脏数据。
B. 会员积分服务创建数据后其他服务应用马上查询,效果是查询到空数据。
十一、事务内有外部调用,必须考虑外部不稳定和性能问题

事务本身是很耗资源,极易产生超时的问题,要避免再引入外部不稳定因素。

个人中心服务,事务内远程查询漂亮分享官的积分,导致性能极低。外部接口调用需要设置超时和最长等候时间。
十二、接口提供方和Xxljob定时任务必须考虑幂等性,防止重复调用导致严重的业务灾难

根据墨菲定律,接口重复调用是会必现的线上问题。

订单付款接口,幂等逻辑不严谨导致重复付款问题。apollo报表中心由于xxljob一秒内重复调治任务,导致统计数据重复,严重影响管理层的决策判定。
十三、克制资源操作(IO等)后未开释

十四、嵌套事务的默认流传属性是Propagation.REQUIRED,假如需要开启新事务,必须手动设置事务流传属性为Propagation.REQUIRES_NEW。尽量不要利用嵌套事务。

利用事务注解大概编程式事务时,需要考虑默认的事务流传属性,根据需要决定是并入同一个事务还是开启新事务。

OMS异步操作任务,调用第三方接口时,修改状态为确认中状态,需要先提交事务更新,背面的逻辑操作成功则需要修改为已确认,失败则修改为待审核。当第三方接口没有返回明确的成功或失败时,状态应该保持确认中不变。假如调用接口前不开启新事务,会导致背面回滚的数据有误。
十五、覆写对象的equals()方法时必须同时覆写hashCode()方法

equals和hashCode方法是对象在hash容器内高效工作的基础,正确的覆写这两个方法才能保证在hash容器内查找对象的正确性,同时一个好的hashCode方法能大幅提升hash容器服从。
十六、克制含事务的循环内加线程同步锁

循环上层包罗事务,利用synchronized锁,会导致MySQL事务锁和JVM同步锁相互等候死锁问题。

  1. @Transactional(rollbackFor = Exception.class)
  2. public void storeData(List<Order> orderList) {
  3.     /**
  4.     order_id = {1,2,3}
  5.     线程A更新order_id为1后进入下一轮循环,事务锁还未释放,同步锁需要重新获取。
  6.     同时线程B已获取同步锁,需要更新order_id=1的事务操作。结果就是线程A等待线程B持有的
  7.     JVM同步锁,线程B等待线程A持有的事务锁。
  8.     */
  9.     for(Order order : orderList) {
  10.         synchronized (LOCK) {
  11.             updateOrderId(order);
  12.         }
  13.     }
  14. }
复制代码
十七、利用线程池时,必须设置合理的大小,克制不加限制动态批量创建线程

不加限制的批量创建线程会抢占大量系统的资源,引发OOM等连锁异常,最终导致宕机

将new MapReduce(xxx)创建线程池的代码放在API接口实现方法中没有加其他限制,导致引发OOM宕机,中间触发了Redis连接超时、Kafka重复消耗等异常
十八、所有公共代码(比如api包、通用工具类)或公共服务(中台服务、业务应用自身服务)的改动,必须考虑向下兼容

对多个系统项目都有依赖的公共代码进行修改时,需要考虑兼容汗青逻辑,除非确认所有利用方都可以或许担当功能修改产生的影响

项目A的开发人员将公共jar包中逻辑进行了修改(该修改需要开启一个新配置才和原逻辑一致),同时deploy jar包进行测试,新配置只在测试环境进行了操作。依赖了公共jar包的项目B这时进行线上发版,但是没有进行配置(而且也不知道有这个配置),导致线上事故。
十九、克制在新建表大概增加修改表字段时设置字符集和排序规则

字符集和排序规则后期修改需要耗费巨大的资源,影响业务稳定性,为了保持schema-表-表字段三者的字符集和排序规则一致,克制在新建表大概增加修改表字段时设置字符集和排序规则。

A项目的某一个表的字段设置了字符集和排序规则,导致与表-schema的排序规则不一致,在联合查询时这个表作为关联字段,报关联字段排序规则不一致的错误,无法进行关联查询,只能修改,假如是一张大表修改会非常耗时,占用大量的io会影响业务。
二十、新建表大概增加修改表字段时利用TEXT/BLOD字段需要评估须要性

TEXT/BLOD的大字段会产生磁盘暂时表,而且不能利用全文索引,各种操作的代价都非常高昂,在业务中最好不要利用,假如实在是要利用,也要独立出一张表专门用于存储,不得跟业务表中利用。

A项现在期的一张表中利用了一个TEXT存储json大字段,导致这张表占用了600多G的空间,其中那一个大字段就占用90%的表空间,后续的查询,迁移,碎片整理都非常的耗资源。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4