goweb-如何设计一个Web框架
如何设计一个web框架
前面十二章介绍了如何通过go来开发web应用,介绍了很多基础知识、开发工具和开发技巧,那么我们这一章通过这些知识来实现一个简易的web框架。通过go语言来实现一个完整的框架设计,这框架中主要内容有第一小节介绍的web框架的结构规划,例如采用mvc模式来进行开发,程序的执行流程设计等内容;第二小节介绍框架的第一个功能:路由,如何让访问的url映射到相应的处理逻辑;第三小节介绍处理逻辑,如何设计一个公共的controller,对象继承之后处理函数中如何处理response和request;第四小节介绍框架的一些辅助功能,例如日志处理、配置信息等;第五小节介绍如何基于web框架实现一个博客,包括博文的发表、修改、删除、显示列表等操作。
通过这么一个完整的项目例子,我期望能够让读者了解如何开发web应用,如何搭建自己的目录结构,如何实现路由,如何实现mvc模式等各方面的开发内容。在框架盛行的今天,mvc也不再是神话。经常听到很多程序员讨论哪个框架好,哪个框架不好, 其实框架只是工具,没有好与不好,只有适合与不适合,适合自己的就是最好的,所以教会大家自己动手写框架,那么不同的需求都可以用自己的思路去实现。
我觉得这一章像是在将一个项目,认真学习项目,摘录就少一点····
一个基础的目录接结构
|——main.go 入口文件 |——conf 配置文件和处理模块 |——controllers 控制器入口 |——models 数据库处理模块 |——utils 辅助函数库 |——static 静态文件目录 |——views 视图库
beego框架路由实现
目前几乎所有的web应用路由实现都是基于http默认的路由器,但是go自带的路由器有几个限制:
不支持参数设定,例如/user/:uid 这种泛类型匹配
无法很好的支持rest模式,无法限制访问的方法,例如上面的例子中,用户访问/foo,可以用get、post、delete、head等方式访问
一般网站的路由规则太多了,编写繁琐。我前面自己开发了一个api应用,路由规则有三十几条,这种路由多了之后其实可以进一步简化,通过struct的方法进行一种简化
beego框架的路由器基于上面的几点限制考虑设计了一种rest方式的路由实现,路由设计也是基于上面go默认设计的两点来考虑:存储路由和转发路由
存储路由
针对前面所说的限制点,我们首先要解决参数支持就需要用到正则,第二和第三点我们通过一种变通的方法来解决,rest的方法对应到struct的方法中去,然后路由到struct而不是函数,这样在转发路由的时候就可以根据method来执行不同的方法。
controller设计
传统的mvc框架大多数是基于action设计的后缀式映射,然而,现在web流行rest风格的架构。尽管使用filter或者rewrite能够通过url重写实现rest风格的url,但是为什么不直接设计一个全新的rest风格的 mvc框架呢?本小节就是基于这种思路来讲述如何从头设计一个基于rest风格的mvc框架中的controller,最大限度地简化web应用的开发,甚至编写一行代码就可以实现“hello, world”。
controller作用
mvc设计模式是目前web应用开发中最常见的架构模式,通过分离 model(模型)、view(视图)和 controller(控制器),可以更容易实现易于扩展的用户界面(ui)。model指后台返回的数据;view指需要渲染的页面,通常是模板页面,渲染后的内容通常是html;controller指web开发人员编写的处理不同url的控制器,如前面小节讲述的路由就是url请求转发到控制器的过程,controller在整个的mvc框架中起到了一个核心的作用,负责处理业务逻辑,因此控制器是整个框架中必不可少的一部分,model和view对于有些业务需求是可以不写的,例如没有数据处理的逻辑处理,没有页面输出的302调整之类的就不需要model和view,但是controller这一环节是必不可少的。
日志和配置设计
日志和配置的重要性
前面已经介绍过日志在我们程序开发中起着很重要的作用,通过日志我们可以记录调试我们的信息,当初介绍过一个日志系统seelog,根据不同的level输出不同的日志,这个对于程序开发和程序部署来说至关重要。我们可以在程序开发中设置level低一点,部署的时候把level设置高,这样我们开发中的调试信息可以屏蔽掉。
配置模块对于应用部署牵涉到服务器不同的一些配置信息非常有用,例如一些数据库配置信息、监听端口、监听地址等都是可以通过配置文件来配置,这样我们的应用程序就具有很强的灵活性,可以通过配置文件的配置部署在不同的机器上,可以连接不同的数据库之类的。
这一章我们主要介绍了如何实现一个基础的go语言框架,框架包含有路由设计,由于go内置的http包中路由的一些不足点,我们设计了动态路由规则,然后介绍了mvc模式中的controller设计,controller实现了rest的实现,这个主要思路来源于tornado框架,然后设计实现了模板的layout以及自动化渲染等技术,主要采用了go内置的模板引擎,最后我们介绍了一些辅助的日志、配置等信息的设计,通过这些设计我们实现了一个基础的框架beego,目前该框架已经开源在github,最后我们通过beego实现了一个博客系统,通过实例代码详细的展现了如何快速的开发一个站点。
终于完了,感觉不是很理解,不过我大致理解了这种思想。
推荐阅读
-
如何用PHP来实现一个动态Web服务器
-
看年薪50W的架构师如何手写一个SpringMVC框架
-
我的第一个python web开发框架(32)——接口代码重构
-
我的第一个python web开发框架(36)——后台菜单管理功能
-
如何设计一个漂亮的横幅?漂亮横幅设计的五个要点介绍
-
构建NetCore应用框架之实战篇(一):什么是框架,如何设计一个框架
-
如何让一个网站看起来高大上或者更有设计感?
-
JAVA WEB快速入门之从编写一个基于SpringMVC框架的网站了解Maven、SpringMVC、SpringJDBC
-
我的第一个python web开发框架(31)——定制ORM(八)
-
如何做一个好的电商Banner?高大上的电商Banner设计技巧