作者回复: 1. 对滴,同学太懂我了 2. 哈哈没错,确实推荐用jackson和gson来替代,像我从阿里出来的人都有职业病潜意识里就用了fastjson,中毒不轻。fastjson早期用了很多字节码技术提高性能,埋了不少坑,以前在集团也是bug不断,现在其他json组件的解析性能都上来了,确实没必要用fastjson. 3. 对的,我直接从老项目里copy出来的,多谢同学提醒 4. 是的分开命名确实在IDEA本地启动的时候会方便一些 5. 看出同学还是比较细节的,强迫症是程序员的一个很好的特质。一般我习惯不立即返回,方便以后打debug日志输出参数 6. 这是防御性编程的习惯,以防日后code refactor的时候更改属性名称后SQL挂掉
作者回复: JPA才是orm框架标准,mybatis只能算是半自动。跟着spring的方向走,把手动挡的mybatis换成自动挡spring-data-jpa,简化轻量级和快速开发是主方向,在微服务的领域模型拆分下,不太需要从前那种复杂sql扮演跨多domain查询的角色
作者回复: 像join,还有笛卡尔积之类的运算都是很消耗DB资源的,调出sql执行计划看选择的索引策略和时间指标,对一些低效步骤进行拆分,将一个大sql拆成若干个子sql,用代码逻辑替换sql逻辑。 - 这是单体应用下的拆分思路,至于微服务架构,如果领域划分合理的话,不太会出现跨一串表的查询,取而代之是跨服务api调用。报表类需求需要跨domain的场景,通常由数据团队,用各种EDL、data lake等等一堆大数据技术来搭建。
作者回复: 这个经验非常值得其他同学学习一下
作者回复: 1和2完全正确,克隆是比如有些券模板已经被设置成unavailable了,我想创建个一模一样的新的券,可以clone一个状态是avaiable的新模板。真实情况下券模板和券都要有一个单独的过期时间,模板的过期时间控制整体券活动的时间(比如双11所有券结束的时间是某日0点),券的过期时间控制个人领券后的有效使用时间,我这里对业务做了简化了没有添加券的过期时间
作者回复: 是的,我没有严格按照REST规范来起名字,主要是帮助大家通过url理解接口干了什么事儿,并没有将接口语义放到HTTP method中来提现。 而且REST规范太过于教课书化,如果严格遵循会给开发带来很多麻烦,尤其是用作修改场景的PUT接口,严格的PUT接口不管从实现还是接口定义上来说,都非常限制生产力
作者回复: 这类聚合查询的业务,不能硬拉DB,在高并发量下需要做数据异构方案,把DB数据异构到主搜服务里,比如opensearch之类的非结构化数据库。只有实时性要求很高的查询再考虑DB,其他查询场景尽量不要直接查DB,很多成熟公司都有慢SQL线上监控,多个join的语句只要上线并发量稍微一高就会触发报警被下掉
作者回复: 很赞,这两个调整都是很正确的改进方向!而且这里提到了执行计划,sql调优的重点。同学这条经验总结很到位
作者回复: 不同微服务是在不同的git仓库里,这样比较方便配置CICD也就是持续集成环境,也可以降低高频提交时候的代码冲突
作者回复: 男人不能太快呀:-)