Java后端工程化经验总结
2021-10-01 02:02:30 1 举报
AI智能生成
Java后端开发工程化经验总结
作者其他创作
大纲/内容
IntelliJ IDEA设置
插件
阿里巴巴编程规范 Alibaba Java Coding Guidelines
File Header
设置路径
Settings - File and Code Templates - includes - File Header
图示
分支主题
要求
设置@author和@since,名称可以用姓名简称、姓名全称、姓名,建议用英文
分支主题
修改别人代码时,添加第二行@author,填写自己的名字
分支主题
从网上找来的代码,也应该标注通过@author标出添加人,通过@link标出参考链接
分支主题
需要标识版本号采用@version/@since
JavaDoc Wikipedia
分支主题
Coding Style
设置路径
Settings - Editor - Code style - Java
Tab size/Indent: 4
Keep indents on empty lines勾上
图示
分支主题
编码习惯
写完时习惯性格式化,优化导包
搜索知道当前设置下的快捷键,默认为CTRL+ALT+L),导包优化(CTRL+ALT+O)
分支主题
分支主题
工程化
工程目录
|-src
|- main
|— java
|— com.xxxx.xx
|— business
|— first // 按业务功能分包命名,一个大模块对应一个包
|— controller // 一个页面对应一个controller
|— dao
|— entity
|— converter // mapstruct converters
|— bo // 提供给前端的接口的入参,XxxParam(单数)
|— po // 数据库表对应实体类包,XxxPO
|— mo // 多表join映射成的实体类包,XxxMO(按需)
|— vo // 接口的返回参数,XxxRt
|— service // 业务service包
|— impl // 业务service实现包
|— mpservice // MyBatis-Plus service包
|— impl // MyBatis-Plus service实现包
|— openapi // 公共服务包,汇总供其他微服务远程调用的接口
|— controller
|— dao
|— entity
|— converter
|— dto // 提供远程调用的接口的入参,XxxDTO
|— po
|— vo
|— service
|— impl
|— mpservice
|— impl
|— common
|— advice // 全局异常处理类
|— annotation // 自定义注解
|— aop // AOP记录类
|— configure // 配置类
|— feign // Feign远程调用
|— util // 工具类
|- resources
|- sql // 项目SQL文件最新版本
|- structure.sql // 表结构SQL语句
|- data.sql // 字典表及工程正常运行所需要的数据
|- db.sql // 建数据库、用户名及密码的SQL语句
|- db
|- migrations // SQL变更版本文件汇总
|- mapper
|- application.yml
|- application-xxx.yml
|- pom.xml
|- .gitignore // 提示Git忽略哪些文件
|- ci // ci检查
|- .gitlab-ci.yml // Gitlab ci配置
|- main
|— java
|— com.xxxx.xx
|— business
|— first // 按业务功能分包命名,一个大模块对应一个包
|— controller // 一个页面对应一个controller
|— dao
|— entity
|— converter // mapstruct converters
|— bo // 提供给前端的接口的入参,XxxParam(单数)
|— po // 数据库表对应实体类包,XxxPO
|— mo // 多表join映射成的实体类包,XxxMO(按需)
|— vo // 接口的返回参数,XxxRt
|— service // 业务service包
|— impl // 业务service实现包
|— mpservice // MyBatis-Plus service包
|— impl // MyBatis-Plus service实现包
|— openapi // 公共服务包,汇总供其他微服务远程调用的接口
|— controller
|— dao
|— entity
|— converter
|— dto // 提供远程调用的接口的入参,XxxDTO
|— po
|— vo
|— service
|— impl
|— mpservice
|— impl
|— common
|— advice // 全局异常处理类
|— annotation // 自定义注解
|— aop // AOP记录类
|— configure // 配置类
|— feign // Feign远程调用
|— util // 工具类
|- resources
|- sql // 项目SQL文件最新版本
|- structure.sql // 表结构SQL语句
|- data.sql // 字典表及工程正常运行所需要的数据
|- db.sql // 建数据库、用户名及密码的SQL语句
|- db
|- migrations // SQL变更版本文件汇总
|- mapper
|- application.yml
|- application-xxx.yml
|- pom.xml
|- .gitignore // 提示Git忽略哪些文件
|- ci // ci检查
|- .gitlab-ci.yml // Gitlab ci配置
业务实体类
bo
XxxParam
前台业务接口接参类
po
XxxPO
与数据库交互的实体类
dto
XxxDTO
作为公共服务提供出去的接参类
vo
XxxRt
返回值类
ORM框架
用什么?
Spring Data JPA
MyBatis
MyBatis-Plus
MyBatis-Plus
业务开发,单表操作,尽可能基于Mybatis-Plus的service层,其具备mapper层的全部功能,相关接口对比见链接
https://baomidou.com/guide/crud-interface.html#service-crud-%E6%8E%A5%E5%8F%A3
https://baomidou.com/guide/crud-interface.html#mapper-crud-%E6%8E%A5%E5%8F%A3
简单的join操作,考虑替换为多次单表的查询,主表查询出查询采用eq/in,复杂的join考虑采用建立视图来处理;列表查询尽可能一次in查询全部相关数据,在业务逻辑里匹配列表数据与其他相关的数据之间的关系。
需要批量格式化后插入/更新数据库记录的场景,在循环中格式化出PO类,添加到集合,最后调用Mybatis-Plus service层的批量插入/更新接口。不要在循环里直接用BaseMapper接口执行insert,循环插入/更新数据库。
MapStruct
PO转VO
BO/DTO转PO
List<XxxPO>转List<XxxRt>;
Page<XxxBO>转Page<XxxPO>;
Knife4j(自动化接口文档)
Swagger注解
数据库索引
声明为primary key / unique的列自带索引;
与主表关联的字段加上索引;
条件查询按机构/用户查询的时候,表的org_id/user_id列加上索引。
索引命名idx_xxx
Example
-- 在机构id字段上新建索引
alter table tab_xxx add index idx_org_id(org_id) comment '机构id索引';
alter table tab_xxx add index idx_org_id(org_id) comment '机构id索引';
-- 新建机构id-创建时间联合索引
alter table tab_xxx add index idx_org_id_time(org_id, create_time) comment '机构id-创建时间索引';
alter table tab_xxx add index idx_org_id_time(org_id, create_time) comment '机构id-创建时间索引';
JVM配置参数
#/bin/bash
nohup java -jar -Xmx256m -Xms256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:MaxTenuringThreshold=6 -XX:+ExplicitGCInvokesConcurrent -XX:+ParallelRefProcEnabled -Xloggc:./logs/{SERVICE_NAME}-gc.log -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCApplicationStoppedTime -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./logs/{SERVICE_NAME}-gc.hprof -XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1 -Dfile.encoding=UTF-8 -Duser.timezone=GMT+08 -Dspring.profiles.active=test /data/jenkins/xxxxxxx/service-xxxx-xxx.jar >/dev/null 2>&1 &
nohup java -jar -Xmx256m -Xms256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:MaxTenuringThreshold=6 -XX:+ExplicitGCInvokesConcurrent -XX:+ParallelRefProcEnabled -Xloggc:./logs/{SERVICE_NAME}-gc.log -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCApplicationStoppedTime -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./logs/{SERVICE_NAME}-gc.hprof -XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1 -Dfile.encoding=UTF-8 -Duser.timezone=GMT+08 -Dspring.profiles.active=test /data/jenkins/xxxxxxx/service-xxxx-xxx.jar >/dev/null 2>&1 &
总体原则
尽可能消除消除IDEA右侧的黄/红颜色告警
分支主题
Raw use of parameterized class xxxx提示可以通过@SuppressWarnings("rawtypes") 来消除, 强制类型转换可以通过 @SuppressWarnings("unchecked")来消除,不允许@SuppressWarnings("all") 。
Git提交规范
每一个功能点对应一次commit
message类型
feat: 添加新特性
fix: 修复xxx bug
style: 仅仅修改了空格、格式缩进、逗号等等,不改变代码逻辑
refactor: 代码重构,没有加新功能或者修复bug
docs: 仅仅修改了文档
perf: 增加代码进行性能测试
test: 增加测试用例
chore: 改变构建流程、或者增加依赖库、工具等
revert:回滚此前提交的commit记录
参考插件
分支主题
References
阿里巴巴编程规范
阿里巴巴开发手册(嵩山版2020.8.3).pdf
相关公司
南大先腾
CVTE
北京多来点信息技术有限公司
JVM配置
腾讯
https://google.github.io/styleguide/javaguide.html
深圳市富龙小额贷款有限公司
开源社区
PowerJob
分支主题
Apache Shenyu
分支主题
Flyway
Migrations
收藏
0 条评论
下一页