一文带你设计、开发简洁架构,掌握构建Go Web应用的炼金术
前言
本文旨在用尽量简短的话描述完在使用Go进行Web开发时,如何设计一种合理的代码架构,来确保代码的可读性、可维护性、可扩展性。
这是本人第一篇文章,不足之处还望包涵。
开发前的预热
了解四层架构设计
在Web开发中,一般都是四层架构设计:
model
层(模型层):可以理解为建筑师在构建建筑物之前需要的设计蓝图store
层(存储层):可以理解为仓库或库房。在仓库中,物品被存储和管理,可以按需检索和处理。Biz
层(业务逻辑层):类比为经理或协调者。经理负责协调和管理团队成员的工作,确保任务按计划完成。controller
层(控制器层):接收和处理客户端的请求,协调各个层之间的交互,最终响应客户端的需求。
这种简洁架构设计师当前业界比较流行、比较合理的代码架构,能够确保代码的可读性、可维护性、可扩展性。
开发顺序
四层架构之间的依赖关系是:Controller 层依赖 Biz 层,Biz 层依赖 Store 层,Store 层依赖数据库,而 Controller层、Biz 层、Store 层都依赖 Model 层,如下图所示:
在开发过程中,我一般会选择先开发依赖少的组件,这样可以确保我开发完成后能够随时测试代码功能。
所以我一般会选择:Model
层 -> store
层 -> Biz
层 -> controller
层。
搞清楚开发顺序后,接下来就可以一层一层的进行代码开发了,下面我以一个用户注册的功能为例来进行开发。
model
层代码开发
在数据库中创建相应表
本文的重点不在于具体的业务逻辑的实现,为了能够简洁的阐述本文的主旨,所以在设计user
表的时候,我只设计了三个字段,分别是自增id、用户名、密码。
在数据库中创建表结构的SQL语句为:
CREATE DATABASE `mysystem`;
USE `mysystem`;
CREATE TABLE `user` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
) ENGINE=MyISAM AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;
创建完表后,接下来就可以将表映射到model
层了。
映射数据库中相应表到model
层
在这里有两种方式:
- 自己手撸代码
- 使用
db2struct
工具生成
这里我个人推荐使用工具生成(毕竟在这个信息流的时代,时间就是金钱嘛)。
首先go install github.com/Shelnutt2/db2struct/cmd/db2struct
下载好db2struct
接着在model
文件夹里面运行如下命令:
db2struct --gorm --no-json -H 127.0.0.1 -d mysystem -t user --package model --struct UserM -u mysql数据库用户名 -p 'mysql数据库密码' --target=user.go
这段命令会在model
文件夹下创建一个user.go
的文件,其中会有一个命名为UserM
的结构体,结构体中的字段就是从数据库中的user
表中映射而来的。
这样model
层的代码就开发完成了,接下来我们来开发store
层。
store
层代码开发
设计整体store
在开发store
层时,我类比了面向对象的思想。
首先,在面向对象的思想中,Go中的结构体就是一个类,对应结构体的方法就是类中的方法。
那么在设计store
层时,首先将整个store
层看成一个类,通过实例化这个类作为实例对象后可以与数据库进行CURD操作。
理解了上面我说的时候就可以明白下面的开发思路了:
- 首先创建一个结构体,用来实例化成一个实例对象与数据库进行CRUD操作。那么要进行CRUD操作需要什么呢?自然在结构体中要包含一个
*gorm.DB
对象用于CRUD - 接着要创建一个
New
函数用来实例化对象操作
代码如下: