为什么需要一个web框架,主要是因为我们使用原生go的http库进行开发web项目时,存在很多重复繁琐的操作,一些复杂的业务场景需要做大量的抽象操作,以上这些问题我们可以抽象成一个web框架来帮助提高开发效率。那为什么需要手写web框架呢,现在市面上存在很多go的web框架,例如gin-62.8kbeego-28.8kecho-23.8kiris-22.8k,但是我们如果只使用框架,不知道为什么那些api、中间件那样使用,就容易陷入知其然不知其所以然的困局,所以如果我们尝试自己实现一个完整的web框架就显得很有意思了😃。

框架的设计原则和作用

在实现框架之前,我们先来了解一下框架的一些基本原则和要解决哪些问题。

框架的设计原则

  1. 高内聚,低耦合,便于维护和拓展
  2. 封装底层实现,使用更为便捷
  3. 封装重复性代码,减少代码编写量
  4. 提供常用工具类

框架的作用

  1. 协调资源,比如数据库,文件,缓存等
  2. 资源抽象,用于表示资源,程序通过一个抽象的概念与资源进行交互
  3. 通信,资源之间需要进行沟通交流
  4. 约定,大家遵照框架的约定,有助于简化框架的实现
  5. 环境,框架需要支持不同的应用环境
  6. 最主要的目的,让开发人员专注于编写业务逻辑,而不用关心别的事情

那我们这次的goweb框架遵守以上的原则,要实现哪些基础部分呢,主要有以下9个大部分。

1. 路由

回想一下我们业务代码的请求方式是什么样子的,当我们要去获取某个用户信息、修改某个用户信息

1
2
GET http://localhost:8080/api/getUser?id=1
POST http://localhost:8080/api/updateUser

上面的请求资源路径的url,其中的http协议、域名,这些通常不需要我们格外关注,端口号通常固定一个,重点是:

  1. 请求方法是什么,GET POST,需要开发人员定义
  2. /api/getUser?id=1/api/updateUser这些资源路径需要开发人员定义

通俗来说,框架需要处理上方类似api/updateUser这样的路径请求,并根据请求方式将其转发到具体的业务逻辑执行代码,也就是说要在请求的URL和处理函数之间,搭建一个桥梁,将它们准确的关联起来,这就是路由

同时路由中还要求:

  1. 可以支持动态路由,例如?id=1/api/**/getUser
  2. 请求参数解析,post的json解析、文件解析
  3. 参数校验,包括表单校验

2. 处理器

这部分就是所谓的handler(java中也可以理解成controller),上一节我们了解到了路由的主要功能是把请求方式转发到对应的业务逻辑代码中,这里所谓的业务逻辑代码就是Handler处理器,它的主要作用就是需要处理请求request并处理相应response,怎么解析需要一个完备的方案。

3. 中间件

中间件最通俗的解释就是 可以帮助你额外实现一些功能,不用也毫无影响框架的一些代码。 当执行具体的处理器业务的时候,往往需要在其前后进行一些新增的功能,或者增强的功能,或者复用的代码,但是并不希望入侵代码,这就是中间件的作用。

典型的有:

  1. 日志
  2. 错误处理
  3. 认证权限
  4. session
  5. 解析请求体等

4. orm支持

ORM 就是通过实例对象的语法,完成关系型数据库的操作的技术,是"对象-关系映射"(Object/Relational Mapping) 的缩写,可以简化我们书写sql语法,直接使用面向对象的语法操作数据库。 现代的web框架操作数据库时都提供了较为好用的orm库,我们的框架也要尝试实现一个简单的orm库。

5. 工具

比如常用的工具类,或者命令行工具,可以便捷生成代码,一些常用的字符串操作啥的,都可以抽象成工具类使用。

6. 配置项

将用到的一些第三方工具或者框架,做成可配置的,便于使用者进行替换 将一些配置,做成可配置的,便于开发者根据需要自行配置

7. 插件

提供丰富的插件,可以便捷集成服务,比如sentinel go集成

8. http协议支持

支持http https http2等

9. 内置模板

使用内置模板引擎提供模板渲染机制