1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-24 04:22:22 +00:00

update layout section

This commit is contained in:
Xargin 2018-03-27 15:21:41 +08:00
parent 29b73577d3
commit 30638b1dd6

View File

@ -1,14 +1,18 @@
# 6.8. layout 常见大型 web 项目分层 # 6.8. layout 常见大型 web 项目分层
流行的 web 框架大多数是 MVC 框架MVC 这个概念最早由Trygve Reenskaug在1978年提出为了对 GUI 类型的应用进行方便扩展,将程序划分为: 流行的 web 框架大多数是 MVC 框架MVC 这个概念最早由 Trygve Reenskaug 1978 年提出,为了能够对 GUI 类型的应用进行方便扩展,将程序划分为:
1. 控制器Controller- 负责转发请求,对请求进行处理。 1. 控制器Controller- 负责转发请求,对请求进行处理。
2. 视图View - 界面设计人员进行图形界面设计。 2. 视图View - 界面设计人员进行图形界面设计。
3. 模型Model - 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。 3. 模型Model - 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。
随着时代的发展,前端也变成了越来越复杂的工程,为了更好地工程化,现在更为流行的一般是前后分离的架构。可以认为前后分离是把 V 层从 MVC 中抽离单独成为项目。这样一个后端项目一般就只剩下 M 和 C 层了。事实上,即使是简单的项目,业界也并没有完全遵守 MVC 功能提出者对于 M 和 C 所定义的分工。有很多公司的项目会在 controller 层塞入大量的逻辑,在 model 层就只管理数据的存储。这往往来源于对于 model 层字面含义的某种擅自引申理解。认为字面意思,这一层就是处理某种建模,而模型是什么?就是数据呗! 随着时代的发展,前端也变成了越来越复杂的工程,为了更好地工程化,现在更为流行的一般是前后分离的架构。可以认为前后分离是把 V 层从 MVC 中抽离单独成为项目。这样一个后端项目一般就只剩下 M 和 C 层了。
这种理解显然是有问题的业务流程也算是一种“模型”而并非只有按格式组织的数据才能叫模型。MVC 的创始人应该是这么想的。按照原始的分工MVC 里的 M 层似乎就有一些过于臃肿了。对于更为复杂的项目,一个 C 和一个 M 层显然是不够用的,现在比较流行的 api(不包含界面) 项目一般是下面这样划分的: TODOTODO这里是前后分离的架构图
事实上,即使是简单的项目,业界也并没有完全遵守 MVC 功能提出者对于 M 和 C 所定义的分工。有很多公司的项目会在 controller 层塞入大量的逻辑,在 model 层就只管理数据的存储。这往往来源于对于 model 层字面含义的某种擅自引申理解。认为字面意思,这一层就是处理某种建模,而模型是什么?就是数据呗!
这种理解显然是有问题的,业务流程也算是一种“模型”,是对真实世界用户行为或者既有流程的一种建模,并非只有按格式组织的数据才能叫模型。不过按照 MVC 的创始人的想法,我们如果把和数据打交道的代码还有业务流程全部塞进 MVC 里的 M 层的话,这个 M 层又会显得有些过于臃肿。对于复杂的项目,一个 C 和一个 M 层显然是不够用的,现在比较流行的纯后端 api 模块一般采用下述划分方法:
1. Controller与上述类似服务入口负责处理路由参数校验请求转发 1. Controller与上述类似服务入口负责处理路由参数校验请求转发
2. Logic/Service逻辑(服务)层,一般是业务逻辑的入口,可以认为从这里开始,所有的请求参数一定是合法的。业务逻辑和业务流程也都在这一层中。常见的设计中会将该层称为 Business Rules。 2. Logic/Service逻辑(服务)层,一般是业务逻辑的入口,可以认为从这里开始,所有的请求参数一定是合法的。业务逻辑和业务流程也都在这一层中。常见的设计中会将该层称为 Business Rules。
@ -62,8 +66,14 @@ func HTTPCreateOrderHandler(wr http.ResponseWriter, r *http.Request) {
TODOTODO这里是带上 middleware 之后的请求图。 TODOTODO这里是带上 middleware 之后的请求图。
middleware 是和 http 协议强相关的,但 middleware 显然不应该和协议强绑定。如果我们坚持用之前的 middleware 方案的话,这里 thrift 的请求路线就还需要再多写一套 thrift 自己的 middleware。 之前我们学习的 middleware 是和 http 协议强相关的,在项目支持了多种协议之后,这种和协议强绑定的 middleware 成为了我们的瓶颈。如果我们坚持用之前的 middleware 方案的话,这里 thrift 的请求路线就还需要再多写一套 thrift 自己的 middleware将业务无关的代码重复地写了两遍。请求流程变成了这样
TODOTODO这里是加入 middleware 之后的多协议框架请求处理流程。
这也是很多企业项目所面临的真实问题,遗憾的是开源界并没有这样方便的多协议 middleware 解决方案。 这也是很多企业项目所面临的真实问题,遗憾的是开源界并没有这样方便的多协议 middleware 解决方案。
怎么解决这个问题呢,也不麻烦。把协议处理从 controller 中独立出去,新的 middleware 写在协议处理层后面。如图:
TODOTODO这里有图是将 middleware 后置之后的请求处理流程。
是不是感觉项目变的越来越复杂了?真实的项目就是这样一步一步,根据需求演进而来的。 是不是感觉项目变的越来越复杂了?真实的项目就是这样一步一步,根据需求演进而来的。