Skip to content

架构规范

基本原则

制定完善和遵守开发过程的基本原则,可以减少软件的安全风险,提高代码可读性,可维护性,可扩展性,可复用性,可测试性等。可以帮助开发人员提高开发效率,降低开发成本。

原则名称推荐级别核心要点适用场景实施方式
最小化原则强烈推荐接口参数简洁、必要参数、封装对象传输、结果集仅包含必要数据接口设计、数据查询避免冗余字段、用户信息从 token 获取、使用 DTO 对象、SELECT 具体字段
最快收敛原则强烈推荐聚合数据传输、批量操作、优化 SQL 查询、减少数据传输次数批量操作、数据查询批量删除只传一组 id、预先准备数据一次调用、优化 join 条件
互不信任原则强烈推荐参数校验、权限校验、白名单模式、敏感操作日志安全设计、接口校验使用 @Valid 注解、Spring Security、RBAC 权限模型、Origin 白名单
金钱计算原则强制执行单位精确到分、BigDecimal.ROUND_HALF_UP金融计算、金额处理前端:toFixed(n);后端:BigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP)

最小化原则

原则:最小化原则-强烈推荐

说明:为系统的参数更简洁,更方便维护,制定以下推荐条例:

规范点说明
参数简洁接口定义,参数需要尽可能的简洁。所有的参数都是必需参数
后端获取能后端获取的参数,不要让前端传
对象封装接口参数定义,尽可能封装对象传输,不要包含不必要的参数
结果精简自定义 SQL 查询,结果集将只包含必要的数据
返回精简接口参数返回,所有参数都需要是必要且不多余的

最快收敛原则

原则:最快收敛原则-强烈推荐

说明:为提高系统的性能,偷换数学的概念,结合编码学,创建了最快收敛原则。

原因

场景优化策略效果
前端聚合批量删除,只应传一组 id,调一次接口减少 HTTP 请求次数
服务调用如果需要调用其他服务模块,如果其他服务批量操作,应预先准备数据,进行一次调用减少服务间通信
数据库操作对数据库进行多次类似的操作,如果有批量操作接口,应预先准备数据,只对数据库进行一次操作减少数据库连接开销
SQL 查询SQL 查询进行数据关联时,应找对 join 条件,使得进行关联的数据以最快的速度减少提升查询性能
数据返回数据返回时,尽可能聚合参数,尽可能减少数据的传输次数降低网络传输

结论:如果可以做到以上的快速收敛,可以不考虑 Java 代码对数据的处理量。原因是:以上的调用过程都要经过 HTTP 请求,或者磁盘的读写。而 Java 的运行,会全部在内存中运行。效率不是同一个数量级。

互不信任原则

原则:互不信任原则-强烈推荐

说明:在程序运行上下游的整个链路中,每个点都是不能保证绝对可靠的,任何一个点都可能随时发生故障或者不可预知的行为,包括机器网络、服务本身、依赖环境、输入和请求等,因此要处处设防。

防护措施说明
参数严格校验所有输入参数必须进行严格校验
权限严格校验用户权限必须进行严格校验
数据返回严格筛选返回数据必须进行严格筛选
权限最小化仅授予必要的最小权限
白名单模式采用白名单模式进行访问控制
健全的敏感操作日志体系建立完善的敏感操作日志体系
其他防护其他任何可能的疏忽,都提前防备

金钱的计算原则

原则:单位精确到分。BigDecimal.ROUND_HALF_UP 原则-强制执行

层级处理方式代码示例
前端计算后的值,必需使用 toFixed(n) 函数进行处理。也可以使用:Math.round(parseFloat(price*100 * quantity))/100price.toFixed(2)Math.round(parseFloat(price*100 * quantity))/100
后端强制使用 BigDecimalbigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP)

架构原则

设计原则

原则名称核心思想实践方法收益
单一职责原则每个模块/类只负责一个功能职责分离、模块化高内聚、低耦合
开闭原则对扩展开放,对修改关闭通过接口和抽象类实现扩展易于扩展、稳定性好
依赖倒置原则依赖抽象而非具体实现面向接口编程、依赖注入解耦、可测试
接口隔离原则接口应该小而专拆分大接口为多个小接口灵活、易维护
迪米特法则只与直接朋友通信减少类之间的依赖降低耦合度

分层架构

层级职责技术实现典型组件
表现层处理用户请求和响应Spring MVCController、Interceptor
业务逻辑层实现核心业务逻辑Spring ServiceService 接口与实现
数据访问层与数据库交互MyBatis/JPAMapper、Repository
实体层数据模型定义POJO/DTOEntity、DTO、VO

模块划分

类别原则/方式说明示例
模块设计按业务域划分根据业务领域进行模块划分用户中心、订单中心、商品中心
低耦合高内聚模块内部紧密相关,模块之间松散耦合用户模块不直接依赖订单模块
明确边界定义清晰的模块边界和接口通过 API 进行模块间通信
模块通信同步调用强一致性场景、需要立即响应实时性好、简单直接,但耦合度高
异步消息最终一致性场景、解耦需求解耦、高可用,但有延迟
事件驱动多个模块需要响应同一事件松耦合、扩展性好
共享数据库简单场景、同一系统内简单、无需额外组件,但耦合度高

服务架构

类别原则/组件说明实现方案
微服务设计服务边界清晰明确服务职责边界通过领域驱动设计确定边界
独立部署每个服务独立打包部署使用 Docker 容器化
API 通信服务间通过 API 进行通信RESTful API 或 gRPC
数据独立每个服务独立管理数据库避免跨服务数据耦合
自治团队每个服务由独立团队负责全栈团队模式
服务注册与发现服务注册中心服务注册和发现Nacos、Eureka、Consul
服务注册服务启动时注册到中心自动注册机制
服务发现客户端发现可用服务服务列表获取
负载均衡分发请求到多个服务实例Ribbon、Nacos 负载均衡

数据架构

类别存储类型/一致性级别适用场景推荐技术/实现方式特点/优缺点
数据存储关系型数据库结构化数据、事务性场景MySQL、PostgreSQL强一致性、复杂查询
NoSQL 数据库非结构化数据、高并发读写Redis、MongoDB高可用、高性能
缓存热点数据、读多写少场景Redis、Memcached低延迟、高吞吐
消息队列异步处理、解耦场景Kafka、RabbitMQ削峰填谷、解耦
数据一致性强一致性金融交易、订单支付分布式事务(XA)、两阶段提交数据一致、性能开销大
最终一致性日志同步、数据统计消息队列、异步任务性能好、存在延迟
弱一致性实时性要求低的场景定期同步、缓存更新实现简单、数据可能过期

高可用设计

类别策略/机制说明实现方式/适用场景特点
故障容错熔断器模式防止级联故障Hystrix、Resilience4j服务调用熔断
服务降级故障时提供降级服务开关控制、降级逻辑核心功能保障
兜底方案熔断后的备选响应默认数据、缓存数据提升用户体验
重试机制失败后自动重试重试次数、间隔配置网络抖动场景
负载均衡轮询按顺序分发请求无状态服务简单、均衡
加权轮询根据权重分发请求服务器性能不均按能力分配
最少连接分发到连接数最少的服务器长连接场景动态调整
IP 哈希根据客户端 IP 分发需要会话保持会话稳定
健康检查存活检查服务是否运行TCP 连接、HTTP 请求移除不健康节点
就绪检查服务是否就绪处理请求数据库连接、依赖服务延迟加入负载均衡
深度检查业务功能是否正常业务接口测试全面健康评估

最佳实践

实践项说明实施频率产出物
架构图绘制绘制系统架构图和流程图需求阶段架构文档、流程图
文档化决策记录架构决策及其理由决策时架构决策记录
架构评审定期进行架构评审季度/重大变更评审报告
可扩展性考虑设计时考虑未来扩展设计阶段可扩展架构设计
可维护性考虑代码可读性、可测试性开发阶段代码规范文档

架构设计检查清单

检查项检查内容状态
边界清晰各模块职责是否清晰,边界是否明确
依赖合理模块间依赖是否合理,是否存在循环依赖
接口稳定对外接口是否稳定,是否有版本控制
高可用是否考虑了故障容错、负载均衡、健康检查
可扩展是否考虑了未来业务扩展需求
安全性是否考虑了安全防护措施
可监控是否有完善的监控、日志、告警体系
可测试架构是否支持单元测试、集成测试

Released under the MIT License.