一个地图小程序的后端项目

共 5697字,需浏览 12分钟

 ·

2023-06-10 04:44



 很久没写文章了,做这个项目的目的-利用业余时间沉淀技术经验,准备一个好用的脚手架,同时尝试一些在工作中想用但是没机会用的技术




Gi
tHub地址:

 
https://github.com/mapcoding-cn/preferential-map (
查看原文,欢迎star)







技术方面的简单介绍




在这个项目使用了DDD分层架构提供服务,拆箱即用



主要组件:Spring boot +
mybatis plus + mysql + wechat



数据库技术: mysql使用了空间索引 全文索引 JSON类型等









脚手架中践行的架构理念




领域模型




bd63e21833452d7d140c23c405f5f5ef.webp




  • app: 项目入口和构建,配置文件和资源,不侵入业务





  • test: 单元测试和非正式代码入口,不打包,不上线[新增]





  • web: 展示层,发布web接口,处理业务无关的请求入参和异常(=controller+VO),不侵入业务





  • biz: 应用层,for具体应用的业务逻辑,应对业务易变性,避免非核心逻辑污染core层(BO DTO)




    • 业务流程编排和集成





    • 入出参转换,接口适配





    • 安全认证,权限控制





    • 切面功能如日志拦截





    • 应用级异常的处理





    • 调度job入口(不含业务逻辑)





    • 消息订阅入口(不含业务逻辑)





    • 流程引擎功能(不含业务逻辑)





    • 业务报警功能





    • 业务统计分析功能





    • 其他和业务运行无关的模块





    • 怎么写应用层?有以下几个原则,看下是否符合






  • core: 核心领域层,针对核心业务抽象建模,反映基本业务现实,需保持一定程度的稳定性(BO DTO)




    • 和biz的区别,只关心核心业务





    • 业务无关的附着功能剥离到应用层实现






  • infras: 基础设施层,封装项目的基础能力,工具性的,业务无关的




    • util:静态工具类,封装通用工具,如HttpUtils DateUtils.





    • enum 枚举类





    • constant 常量类





    • exception 异常类





    • annotion 注解类





    • model: 公用的bean,各领域对象放到各层里面去实现





    • config: 全局的工具性配置在放在这里





    • infras-dal:数据访问层,封装数据库 redis等数据能力,(=dao层+DO),禁止做任何业务加工





    • infras-facade:对外接口层,定义对外接口,一般是rpc调用的二方包





    • infras-integration:对内客户端层,对引用外部服务进行统一封装,做接口防腐和适配





    • infras-common:





eg



开发一个查询接口,对地理对象进行检索,基本数据模型为点集




  • web: 发布接口/query,进行入参校验 错误码处理 封装VO,调用biz层,这是展示层





  • biz: 点和线是不同类型要素,Point/Line,调用core层查询并分别处理为Point/Line,这是应用层





  • core: 封装点集查询逻辑,调用dal层,用数据库或缓存,建立查询索引等,这是核心业务层





  • infras基础设施能力




    • dal: mybatis支持的数据访问层,仅做工具性查询,关注sql,redis指令等,这是数据访问层





    • facade: 对外接口模型,有业务依赖Rpc服务,这里写接口,交由biz层实现,发布为二方库





    • integration: core查询依赖web服务做关联,这里封装客户端服务,以保持对内服务的稳定





    • common: utils enum constant






  • app:业务逻辑开发完成后,在这里打包,发布





  • test:写单元测试和非正式代码,后续会要求代码覆盖率




命名规范




  • app: 只有启动类Application





  • test: 除集成类测试,单元测试类命名=原始类+Test后缀





  • web: 后缀controller





  • biz: 后缀Manager





  • core: 后缀service





  • dal: 后缀Mapper,实体类DO和数据库表一一对应





  • facade: 后缀facade





  • integration : 后缀client





  • model: DTO数据传输性质如序列化 BO业务封装对象最常见 VO面向显示层的属性输出





  • util: 后缀utils





  • enum: 后缀enum





  • constant: Property等,不做强制约束,做到见名知意





  • exception: 后缀Exception Error




开发规范




  • 业务逻辑只发生在biz层和core层,禁止在其他层里面出现任何业务逻辑





  • 各模块内保持单一职责,按照业务或职责划分package





  • 禁止在业务中直接引用外部服务,必须在integration中处理成client,并处理异常情况





  • 禁止core依赖biz层,web依赖dal层





  • 禁止更改各个model的原始依赖顺序,如发现无法引用,请考虑依赖的合理性





  • 请保持dal层sql或指令的简洁性,不推荐写复杂sql或在sql中实现业务逻辑,要短平快





  • 统一在父pom里面处理依赖





  • 常量类使用接口或者枚举




日志规范




  • 日志分级,error/other,分别输出到不同文件





  • 禁止error到处飞,线上新增error日志必须高度敏感,做好监控





  • 系统的入口和出口,以及关键位置必须有日志输出,不要怕日志打的多





  • 线上禁止输出debug





  • 输出日志需带trace信息




异常规范




  • 内部异常类统一继承自UnimapException,对可感知业务异常进行封装





  • 异常根据严重程度分级 ERROR WARNING,其中ERROR会拦截输出到error日志中





  • 对外异常进行分类,定义错误码体系





  • 建议将受检异常转为非受检异常




Git规范




  • 主分支 master 主分支的合并应该在预发通过后,禁止直接提交master





  • 功能分支 feature-*-#version 开发分支,在开发阶段使用,禁止提交不可编译运行的代码





  • 发布版本 release-*-#version 测试和预发分支,提交QA的相对稳定版本





  • 紧急修复分支 bugfix-*-#version 紧急修复线上bug





  • 如无明确的版本计划,version建议为上线的日期





  • 编码为utf8,换行符为\r LF,禁止Tab




URL规范




  • 全部小写,单词间用-中划线分割





  • 读请求为get,写请求为post





  • 对外进行Response统一封装





  • 建议rest风格,参数小于等于3个










浏览 38
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报