JeecgBoot项⽬的理解、使⽤⼼得和改进建议
JeecgBoot介绍
JeecgBoot是⼀款基于代码⽣成器的低代码开发平台,零代码开发!前端采⽤Ant Design&Vue,后端集成了SpringBoot2.x,Mybatis-plus,安全框架为Shiro,JWT。相对其他开源项⽬⽐较出⾊的是在线配置表单、在线配置报表、在线图表设计、在线jeecg-boot使⽤⼼得
1. JeecgBoot第⼀次使⽤给我的感觉是配置⽐较简单,简单配置数据库和redis,⼀键启动项⽬,针对项⽬部署(war包部署、jar包部署、docker部署等等)有详细的⽂档,
项⽬的运⾏、部署基本上遇不到问题;在数据库⽅⾯,表名命名⽐较规范,每张表都有del_flag、create_time、create_by、update_time、update_by五个字段,全⽅
位记录表的数据迁移;
2. JeecgBoot项⽬监控⽐较完善,有路由⽹关监控、定时任务监控、redis监控、⽇志监控、数据⽇志监控、性能监控、SQL监控等等,可以实时显⽰项⽬情况,提前预
判项⽬宕机风险,提⾼项⽬运维⽔平;
3. JeecgBoot有个⽐较好的细节,就是系统通告系统⽤管理—系统通告界⾯,在新增系统通告的时候,编辑通告具体内容能把通告内容进⾏排版,⽅便公司使⽤,发出
的通告看起来正规⼀点;
4. JeecgBoot集成了多租户模式,我们都知道多租户有三种实现模式,⼀是基于tenant_id隔离数据,⼆是基于Schema隔离(oracle⽀持较好),三是独⽴数据库隔离(安全
性最⾼);JeecgBoot使⽤的是开发难度最⾼但资源消耗最少的tenant_id模式隔离,具体的实现流程是登陆后查询到⽤户的tenant_id,将此tenant_id放⼊前端vuex状
态树⾥⾯以便每次访问后端接⼝附带tenant_id,前端访问后端时,后端获取到tenant_id后注⼊到ThreadLocal,然后配置Mybatisplus分页插件,每次查询附带在
ThreadLocal中取出的tenant_id,实现多租户数据隔离;开发新功能时应注意,需要多租户模式的表⼀定记得添加tenant_id字段,不需要多租户数据隔离的表或者sql
⼀定记得配置tenantTable排除项;
改进建议:
5. JeecgBoot配置项⽐较复杂,看的眼花缭乱,让萌新看起来⽆从⼊⼿,解决⽅案:
开源项目缩减配置项,只保留最基本的配置,其他扩展功能,例如启⽤短信、启⽤对象存储等等写在⽂档⾥,让使⽤者多读⽂档然后再来提issue或者⾥问问题,这样减少开
发者⼯作量,也让项⽬变得"轻量级";
6. 我注意到JeecgBoot部分表中使⽤了text数据格式⽐如⽇志表的sys_data_log的data_content字段,但是⼊库的时候没有限制数据长度,这⾥会有⼀个风险,当我们发
⽣⼀些异常数据时,text格式也装不下时既有宕机风险也会降低服务器性能;
7. JeecgBoot使⽤逻辑删除本⾝没有问题,但是逻辑删除会跟已有逻辑冲突,⽐如说现有⽤户张三,我删除了⽤户张三,但是⼜由于某种原因需要新增张三这个⽤户,
那么新增时就会提⽰⽤户名已存在,我认为这就是逻辑删除潜在的⼀个bug,解决⽅案:
放弃逻辑删除,新建⼀张备份表,将删除的数据复制到备份表⾥,即避免了⼀些代码逻辑上的冲突也保存了数据;
不放弃逻辑删除,逻辑删除的表新增基于时间戳的唯⼀字段,判断是否重复时可以查询这个字段;
8. JeecgBoot的监控很完善但是缺乏告警功能,我本地开发时由于⾃⼰电脑硬盘⽐较⼩,磁盘占有率已经上了90%,但是监控没有任何的告警以⾄于如果是⽣产环境就
会有宕机的风险;另外就是监控⽐较机械,例如redis的监控,没有突出我们⽐较重要的性能指标即instantaneous_ops_per_sec(平均每秒处理请求总数)、
rejected_connections(达到max_client然后限制的连接),也没有计算出缓存命中率等等;解决⽅案:
专业的事交给专业的⼈,建议集成prometheus,配合grafana做监控功能,利⽤已有grafana模板或者开发jeecgboot专⽤监控模板,图形显⽰监控指标以及配置告警,
提⾼项⽬⾃动化运维程度
9. 多租户的建议:
实现租户模式配置,即配置⽤户的多租户模式,0⽆租户模式,1基于tenant_id隔离,2基于Schema隔离,3独⽴数据库模式;
tenant_id隔离模式需要开发⼀个多租户开关,当⽤户关闭多租户时,前端和后端强制将tenant_id设置为1;
Schema隔离模式最简单的办法是将Schema名称设置为有租户名;
独⽴数据库模式就基于多数据源,租户⽤不同的数据源(与数据源主备不冲突)
另外,租户管理的新增租户逻辑过于简单,新增租户后应该给租户初始化必要的数据,例如初始化管理员账号,基本的⾓⾊、职务、部门、数据字典等等;
10. 关于redis的⼩⼩建议
JeecgBoot将缓存放在redis⾥⾯,却没有缓存淘汰策略,在⽤户数过多的场景下会造成资源的浪费,所以我建议启⽤redis的缓存淘汰策略或者⾃⼰写⼀个LRU算法。