架构师~软件分层设计总结
开发规范的整理
- RESTful Api规范
- 软件分层设计
- 数据实体划分
- 分层设计主流技术栈
1. RESTful Api规范
- 自解释,不要用驼峰,小写,单词之间用减号,URL路径使用单数还是复数没有要求,推荐复数
- 用户列表 GET /users
- 用户1的内容 GET /users/1
- 用户1的评论列表 GET /users/1/comments
- 添加用户 POST /users dto对象
- 编辑用户 PUT /users dto对象
- 删除用户1 DELETE /users/1
2. 软件分层设计
- api层,面向前端,请求日志记录,请求参数校验
- 业务层,与业务逻辑相关,业务校验,异常处理,数据组合
- 数据层,多种数据持久化的实现,面向接口的设计
- 基础设施层,通用的,公用的类库
graph TD
subgraph API层
A1[面向前端接口]
A2[请求日志记录]
A3[请求参数校验]
end
subgraph 业务层
B1[业务逻辑处理]
B2[业务校验]
B3[异常处理]
B4[数据组合]
end
subgraph 数据层
C1[接口定义]
C2[数据持久化实现]
end
subgraph 基础设施层
D1[通用工具类]
D2[公用类库]
D3[配置管理]
D4[第三方服务集成]
end
A1 --> B1
A2 --> B1
A3 --> B1
B1 --> C1
B2 --> C1
B3 --> C1
B4 --> C1
C1 --> C2
C2 --> D1
C2 --> D2
B1 --> D1
B1 --> D2
A1 --> D1
D1 --> D3
D2 --> D4
style API层 fill:#e1f5fe
style 业务层 fill:#f3e5f5
style 数据层 fill:#e8f5e8
style 基础设施层 fill:#fff3e0
3. 数据实体划分
- 我们以前后分离的主流开发模式来说明
- VO 后端返回给前端的对象
- DTO 前端传给后端的对象
- DO 数据库的对象(poco实体,可添加领域方法,限制调用外部资源,如几个字段的组合形成方法,字段按某个规则计算得到某个值的方法)
sequenceDiagram
participant User as 用户
participant Web as 网站前端
participant API as 后端API
participant DB as 数据库
User->>Web: 访问页面
Web->>API: GET /users
API->>DB: 查询用户列表
DB-->>API: 返回用户数据(vo)
API-->>Web: JSON响应
Web-->>User: 渲染页面
User->>Web: 提交表单
Web->>API: POST /users(dto)
API->>DB: 创建新用户
DB-->>API: 操作结果(vo)
API-->>Web: 201 Created
Web-->>User: 显示成功消息
Note over User,DB: 用户注册流程完成
4. 分层设计主流技术栈
以下是基于软件分层架构中每个层次和功能类型的流行技术栈介绍:
flowchart LR
subgraph API层["API层 (面向前端)"]
direction LR
A1[Web框架<br>Spring Boot/MVC<br>Express.js<br>NestJS<br>FastAPI]
A2[API文档<br>Swagger/OpenAPI<br>Springdoc]
A3[参数验证<br>Hibernate Validator<br>Joi<br>class-validator]
A4[请求日志<br>Log4j/Logback<br>Winston<br>Morgan]
end
subgraph 业务层["业务层 (业务逻辑)"]
direction LR
B1[核心框架<br>Spring Framework<br>NestJS<br>Laravel]
B2[事务管理<br>Spring Transaction<br>TypeORM Transactions]
B3[规则引擎<br>Drools<br>Easy Rules]
B4[任务调度<br>XXL-Job<br>Quartz<br>Spring Scheduler<br>Bull]
end
subgraph 数据层["数据层 (数据持久化)"]
direction LR
C1[SQL数据库<br>MySQL/PostgreSQL<br>Hibernate/MyBatis<br>TypeORM/Sequelize]
C2[NoSQL数据库<br>MongoDB/Redis<br>Mongoose<br>Spring Data]
C3[搜索服务<br>Elasticsearch<br>Solr]
C4[文件存储<br>Amazon S3<br>MinIO]
end
subgraph 基础设施层["基础设施层 (通用工具)"]
direction LR
D1[依赖注入<br>Spring IoC<br>InversifyJS]
D2[配置管理<br>Spring Cloud Config<br>Consul<br>Apollo]
D3[消息队列<br>Kafka/RabbitMQ<br>Redis Streams]
D4[缓存<br>Redis/Memcached<br>Spring Cache]
D5[监控<br>Prometheus/Grafana<br>Spring Boot Actuator]
D6[安全<br>Spring Security<br>JWT<br>OAuth2]
end
API层 --> 业务层
业务层 --> 数据层
数据层 --> 基础设施层
API层 --> 基础设施层
业务层 --> 基础设施层
API层技术栈
Web框架
- Java: Spring Boot/MVC, Jersey, Micronaut, Quarkus
- Node.js: Express.js, Koa, NestJS, Fastify
- Python: Django REST Framework, FastAPI, Flask
- Go: Gin, Echo, Beego
- PHP: Laravel, Symfony, Lumen
API文档
- Swagger/OpenAPI: 行业标准API文档规范
- Springdoc OpenAPI: Spring Boot应用的Swagger集成
- Redoc: 基于OpenAPI的可视化文档
- Postman: API开发和文档工具
参数验证
- Java: Hibernate Validator, Spring Validation
- Node.js: Joi, express-validator, class-validator
- Python: Pydantic, Marshmallow
- 通用: JSON Schema验证器
请求日志
- Java: Log4j, Logback, SLF4J
- Node.js: Winston, Morgan, Bunyan
- Python: Logging, Structlog
- 分布式追踪: Jaeger, Zipkin, SkyWalking
业务层技术栈
核心框架
- Java: Spring Framework, Jakarta EE, Micronaut
- Node.js: NestJS, LoopBack
- Python: Django, Celery(异步任务)
- PHP: Laravel, Symfony
事务管理
- Java: Spring Transaction Management, JTA
- Node.js: TypeORM事务, Sequelize事务
- Python: Django事务, SQLAlchemy会话管理
- 分布式事务: Seata, Atomikos
规则引擎
- Drools: Java规则引擎
- Easy Rules: 轻量级规则引擎
- Node-RED: 流式规则引擎
- JSON Rules Engine: 基于JSON的规则引擎
任务调度
- Java: XXL-Job, Quartz, Spring Scheduler
- Node.js: Agenda, Bull, Bree
- Python: Celery, APScheduler
- 分布式调度: ElasticJob, PowerJob
数据层技术栈
SQL数据库
- 数据库: MySQL, PostgreSQL, Oracle, SQL Server
- ORM框架:
- Java: Hibernate, MyBatis, Spring Data JPA
- Node.js: TypeORM, Sequelize, Prisma
- Python: SQLAlchemy, Django ORM
- PHP: Eloquent, Doctrine
NoSQL数据库
- 文档数据库: MongoDB, Couchbase
- 键值存储: Redis, etcd
- 列式存储: Cassandra, HBase
- 图形数据库: Neo4j, JanusGraph
搜索服务
- Elasticsearch: 分布式搜索和分析引擎
- Solr: 基于Lucene的搜索平台
- Algolia: SaaS搜索服务
- Meilisearch: 轻量级搜索引擎
文件存储
- 对象存储: Amazon S3, MinIO, Ceph
- 分布式文件系统: HDFS, GlusterFS
- 云存储: Google Cloud Storage, Azure Blob Storage
基础设施层技术栈
依赖注入
- Java: Spring IoC, Google Guice, Dagger
- Node.js: InversifyJS, Awilix, TypeDI
- Python: Dependency Injector, Injector
- C#: .NET Core DI, Autofac
配置管理
- Spring Cloud Config: 集中式配置管理
- Consul: 服务发现和配置
- Apollo: 携程开源的配置中心
- etcd: 分布式键值存储
- ZooKeeper: 分布式协调服务
消息队列
- Kafka: 高吞吐量分布式消息系统
- RabbitMQ: 开源消息代理软件
- RocketMQ: 阿里开源的消息队列
- ActiveMQ: Apache开源消息代理
- Redis Streams: Redis5.0+的消息队列功能
缓存
- Redis: 内存数据结构存储
- Memcached: 分布式内存对象缓存系统
- Ehcache: Java分布式缓存
- Spring Cache: 缓存抽象层
监控
- Prometheus: 开源监控系统
- Grafana: 指标分析和可视化平台
- Spring Boot Actuator: 应用监控和管理
- Micrometer: 应用指标门面
- SkyWalking: 应用性能监控系统
安全
- Spring Security: 认证和访问控制框架
- JWT: JSON Web Tokens身份验证
- OAuth2: 授权框架
- Keycloak: 开源身份和访问管理
- Apache Shiro: Java安全框架
总结
现代软件开发中,每个层次都有丰富的技术选择。选择合适的技术栈应考虑以下因素:
- 团队熟悉度: 选择团队熟悉的技术可以提高开发效率
- 项目需求: 根据项目规模、性能要求和业务特点选择
- 社区支持: 选择有活跃社区和良好文档的技术
- 生态系统: 考虑技术的完整生态系统和集成能力
- 长期维护: 选择有长期支持计划的技术
微服务架构下,这些技术栈通常会组合使用,形成完整的解决方案。例如,Spring Boot + Spring Cloud + MyBatis + Redis + Kafka + Prometheus是一个常见的Java微服务技术组合。