Go 先锋
读完需要
速读仅需 3 分钟
一、典型的项目架构模式
MVC 架构
1.模型(Model)层
负责业务对象与数据库层之间的交互,包含业务模型、数据访问层、数据库等。主要作用是完成业务逻辑和数据访问。
// 用户模型
type User struct {
ID int
Name string
Age int
}
// 用户数据访问层
func GetUser(id int) (User, error) {
// 连接数据库读取用户数据
var u User
return u, nil
}
2.视图(View)层
负责视觉展示,包含前端页面、界面元素等。主要作用是将模型中的数据展示给用户。
<!-- 用户信息页面 -->
<html>
<body>
<div>用户姓名: {{.Name}}</div>
<div>用户年龄: {{.Age}}</div>
</body>
</html>
3.控制器(Controller)层
负责连接模型和视图,处理用户交互请求。包含路由解析、业务逻辑等。主要作用是控制流程,处理逻辑。
// 用户控制器
func UserHandler(w http.ResponseWriter, r *http.Request) {
// 获取用户ID
id := parseId(r)
// 获取用户数据
u := GetUser(id)
// 展示用户信息页面
render(w, u)
}
MVC 架构通过分离模型、视图、控制器,实现职责清晰,利于并行开发。但层与层之间依赖严重,不易扩展维护。
三层架构
1.展示层(Web 层)
包含前端页面、界面等展示内容。负责与最终用户打交道,接收用户输入并显示结果。
2.业务逻辑层(Service 层)
核心业务代码和处理流程,实现真正的业务需求。
3.数据访问层(DAO 层)
与数据库进行交互,实现对数据的存取操作。屏蔽上层与数据源之间的交互细节。
// Web层
func showProducts(w http.ResponseWriter, r *http.Request) {
// 调用Service层处理逻辑
ps := ProductService.GetProducts()
// 渲染页面显示
render(w, ps)
}
// Service层
type ProductService struct {
}
func (s *ProductService) GetProducts() []Product {
// 调用DAO层获取数据库数据
return ProductDAO.SelectAll()
}
// DAO层
type ProductDAO struct {
}
func (d *ProductDAO) SelectAll() []Product {
// 连接数据库查询产品数据
var ps []Product
return ps
}
三层架构通过分离关注点实现低耦合,其中 Service 层为核心,较易测试和扩展。但依然存在层与层之间的强耦合。
SOA 架构
SOA 架构是新型的分布式架构模式。按照职责将系统拆分为服务层、表现层等,服务间基于接口通信。
1. 表现层(表示层)
包含用户界面和浏览器,负责与用户进行交互。
2. 业务流程层(orchestration 层)
处理业务流程逻辑,组织调用各业务服务。
3. 服务层(services 层)
不同服务间基于接口规范进行交互,实现系统业务能力。
4. 数据层
包含数据库和文件系统,负责数据存储。
表现层调用业务流程层,业务流程层组织调用服务层提供的服务,服务层与数据层交互,完成最终业务。这种松散耦合的模式使架构更加灵活、复用性高。
微服务架构
微服务架构是 SOA 架构的升级版,用细粒度、自治的服务拆分应用。服务独立部署,基于 HTTP 接口通信。
其优点在于服务边界清晰,容易维护;技术栈灵活,容易扩展。但分布式系统管理复杂,测试部署有难度。
二、项目分层常见模式
从代码组织方式看,常见两种分层策略:
功能型分层
按照业务功能将系统分割,每层为一个业务模块。
├── dao 层
├── service 层
├── web 层
├── product 层
├── order 层
└── user 层
待型分层
按照开发职责划分层,如表现层、业务层、数据层等。每层可再细分子模块。
├── api 接口层
├── web 展示层
├── service 业务层
├── product
├── order
└── user
└── dao 数据层
三、分层模式的优缺点分析
优点
1. 低耦合
不同层通过接口约束独立开发,降低耦合。
2. 职责清晰
每层负责专一领域,层与层交互简单清晰。
3. 易扩展性
新增业务只改对应层,不影响其他层。
缺点
1. 增加复杂度
多层之间交互协调复杂,开发难度大。
2. 部署依赖
层与层之间存在依赖,部署顺序敏感。
四、分层实践指南
业务复杂度决定分层粒度
业务复杂则细分,简单则粗放分割。不可片面追求分层数。
高内聚低耦合原则
每层内部相关性强、与其他层依赖尽量少。
职责明确边界清晰
每层有明确定义的职责,接口严格约束边界。
常见分层参考
表现层、业务层、逻辑层(流程控制)、接口层(信息传递)、数据层(数据库)、缓存层等。
五、分层实践案例
分层项目简介
从实际项目入手,说明大型 Web 项目是如何分层的。该项目是一个旅游预定平台,主要模块包括:
用户模块:包含用户登录、注册、个人中心等功能。
产品模块:管理各类旅游产品,实现产品的上架和维护。
交易模块:包含订单、支付、售后等交易流程。
内容模块:涉及游记、攻略等旅游内容体系。
技术选型与基础设施
技术栈采用主流的前后端分离开发模式。前端使用 Vue.js 框架,后端使用 Golang 语言开发。打通前后端技术选型为 RESTful 风格的 HTTP API 接口。以下为关键技术栈与库:
前端:Vue、Vue Router、Vuex、Element UI、Axios
后端:Gin Web 框架、GORM 数据库 ORM 库、JWT 认证、Cobra 命令行
基础:MySQL、Redis、Elasticsearch
平台前后端分离部署,并使用 Docker 微服务隔离。通过 Kubernetes 实现自动扩容和故障转移。
分层架构设计
根据技术选型和业务需求,该平台采用了分层架构。主要划分为 Web、Service、RPC 和 Data 层:
├── Web 表现层
│ ├── api 接口 // 提供RESTful API服务
│ └── admin 后台管理系统 // 基于Vue.js
├── Service 业务层
│ ├── product 产品服务
│ ├── order 订单服务
│ ├── pay 支付服务
│ └── content 内容服务
├── RPC 远程调用层
│ ├── user 用户RPC
│ ├── goods 商品RPC
│ └── inventory 库存RPC
└── Data 数据层
├── mysql
└── redis
实现分层与交互流程
从一个主流的场景入手,说明分层架构的实际运作流程。假设一个用户下单购买产品的流程:
用户访问 Web 层的订单页面,传入产品 ID 参数
Web 层调用 Service 层的订单服务接口
订单服务从 RPC 层中获取用户、商品、库存数据
订单服务组装订单,返回订单确认信息
Web 层获得订单确认结果,展示订单页面
在整个流程中,各层通过 RESTful API 进行交互,并在 Kubernetes 的调度协调下实现水平扩展。
六、总结
通过本文的分析讲解,相信读者已经掌握了大型 Web 项目的常见分层模式,以及实际场景下的实现流程。总的来说,选择合适的分层策略,对大型 Web 项目来说至关重要。最后做一个简单总结:
分层理论并无定论,根据业务需求适当进行。灵活运用是关键。
分离核心业务,增强内聚性。减少层耦合,提供扩展性。
采用现代化架构与技术栈,助力分层设计。如微服务、云原生等。
不追求层数多寡,业务为王。让架构为业务服务,而不是相反。