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

共 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个



浏览 32
点赞
评论
收藏
分享

手机扫一扫分享

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

手机扫一扫分享

分享
举报