.net core orm框架_Beego框架代码分析

前言

也许beego框架在国内应该是众多PHPer转go的首选,因为beego的MVC、ORM、完善的中文文档让PHPer们得心应手,毫无疑问我也是。这种感觉就像当年入门PHP时使用ThinkPHP一样。

也许随着你的认知的提升,你会讨厌现在东西,比如某一天你可能慢慢的开始讨厌beego,你会发现go语言里的真正意义,你开始反思MVC真的适合go吗,或者你开始觉着ORM在静态语言里的鸡肋,等等。我只想说:“也许你成长了~”。但是这些都不重要,每一个受欢迎的事物自然有我们值的学习的地方。今天这篇文章很简单,像一篇笔记,记录了我这几天抽空读beego源码的记录。

如何读一个框架?

毫无疑问读go的框架和PHP框架也是一样的:

  1. 配置加载:如何加载配置文件的。

  2. 路由:分析框架如何通过URI执行对应业务的。

  3. ORM:ORM如何实现的。

这里(1.)和(3.)无非就是加载个文件和sql解析器的实现,我就忽略了,重点就看看路由的实现。

安装

简单带过:

// Step1: 安装beegogo get github.com/astaxie/beego// Step2: 安装beego get github.com/beego/bee// Step3: 用bee工具创建一个新的项目bee new beego-code-read

代码分析

go有自己实现的http包,大多go框架也是基于这个http包,所以看beego之前我们先补充或者复习下这个知识点。如下:

go如何启动一个http server

package mainimport (    // 导入net/http包    "net/http")func main() {    // ------------------ 使用http包启动一个http服务 方式一 ------------------    // *http.Request http请求内容实例的指针    // http.ResponseWriter 写http响应内容的实例    http.HandleFunc("/v1/demo", func(w http.ResponseWriter, r *http.Request) {        // 写入响应内容        w.Write([]byte("Hello TIGERB !\n"))    })    // 启动一个http服务并监听8888端口 这里第二个参数可以指定handler    http.ListenAndServe(":8888", nil)}// 测试我们的服务// --------------------// 启动:bee run// 访问: curl "http://127.0.0.1:8888/v1/demo"// 响应结果:Hello TIGERB !

ListenAndServe是对http.Server的进一步封装,除了上面的方式,还可以使用http.Server直接启服务,这个需要设置Handler,这个Handler要实现Server.Handler这个接口。当请求来了会执行这个Handler的ServeHTTP方法,如下:

package main// 导入net/http包import (    "net/http")// DemoHandle server handle示例type DemoHandle struct {}// ServeHTTP 匹配到路由后执行的方法func (DemoHandle) ServeHTTP(w http.ResponseWriter, r *http.Request) {    w.Write([]byte("Hello TIGERB !\n"))}func main() {    // ------------------ 使用http包的Server启动一个http服务 方式二 ------------------    // 初始化一个http.Server    server := &http.Server{}    // 初始化handler并赋值给server.Handler    server.Handler = DemoHandle{}    // 绑定地址    server.Addr = ":8888"    // 启动一个http服务    server.ListenAndServe()}// 测试我们的服务// --------------------// 启动:bee run// 访问: curl "http://127.0.0.1:8888/v1/demo"// 响应结果:Hello TIGERB !

beego路由分析

接下里我们开始看beego的代码。拿访问"http://127.0.0.1:8080/"来说,对于beego代码来说有三个关键点,分别如下:

  1. 启动:main.go -> beego.Run()

  2. 注册路由:routers\router.go -> beego.Router("/", &controllers.MainController{})

  3. 控制器:controllers\default.go -> Get()

下面来看3个关键点的详细分析:

beego.Run()主要的工作
// github.com/astaxie/beego/beego.gofunc Run(params ...string) {    // 启动http服务之前的一些初始化 忽略 往下看    initBeforeHTTPRun()    // http服务的ip&port设置    if len(params) > 0 && params[0] != "" {        strs := strings.Split(params[0], ":")        if len(strs) > 0 && strs[0] != "" {            BConfig.Listen.HTTPAddr = strs[0]        }        if len(strs) > 1 && strs[1] != "" {            BConfig.Listen.HTTPPort, _ = strconv.Atoi(strs[1])        }    }    // 又一个run 往下看    BeeApp.Run()}// github.com/astaxie/beego/app.gofunc (app *App) Run(mws ...MiddleWare) {    // ... 省略     // 看了下这里app.Server的类型就是*http.Server 也就是说用的原生http包 且是上面“go如何启动一个http server”中的第二种方式    app.Server.Handler = app.Handlers    // ... 省略    if BConfig.Listen.EnableHTTP {        go func() {            app.Server.Addr = addr            logs.Info("http server Running on http://%s", app.Server.Addr)            // 默认配置false不强制tcp4            if BConfig.Listen.ListenTCP4 {                //...                // 忽略 默认false            } else {                // 关键点 ListenAndServe: app.Server的类型就是*http.Server 所以这里就启动了http服务                 if err := app.Server.ListenAndServe(); err != nil {                    logs.Critical("ListenAndServe: ", err)                    time.Sleep(100 * time.Microsecond)                    endRunning  true                }            }        }()    }    // 阻塞到服务启动    endRunning}// 看到这里http已经启动了 而且是注册Handler的方式

接着去找这个Handler的ServeHTTP方法,通过上面的这段代码app.Server.Handler = app.Handlers,我们找到了下面的定义,Handler即是ControllerRegister的值,所以每次亲求来了就会去执行ControllerRegister.ServeHTTP(rw http.ResponseWriter, r *http.Request)

// src/github.com/astaxie/beego/app.gofunc init() {    // 调用 创建beego框架实例的方法    BeeApp = NewApp()}// App结构体type App struct {    // 关键的请求回调Handler    Handlers *ControllerRegister    // http包的服务    Server   *http.Server}func NewApp() *App {    // 初始化http handler    cr := NewControllerRegister()    // 创建beego 实例    app := &App{Handlers: cr, Server: &http.Server{}}    return app}

通过我们追beego.Run()的代码,目前我们得到的结论就是:

  1. 使用的http包启动的服务

  2. 没有使用http.HandleFun()的定义路由策略,而是注册Handler的方式

所以beego就是通过beego.Router()自己管理路由,如果http请求来了,回调ControllerRegister.ServeHTTP(rw http.ResponseWriter, r *http.Request)方法,在ControllerRegister.ServeHTTP(rw http.ResponseWriter, r *http.Request)方法中去匹配路由并执行对应的controller 也就是beegoControllerInterface类型的控制器的方法,比如RESTFUL或者自定义啊等。

beego.Router() 如何注册路由

首先路由文件是如何加载的,我们发现在main.go文件里导入了路由包:

package mainimport (    // 导入routers包 只执行init方法    _ "beego-code-read/routers"    "github.com/astaxie/beego")func main() {    beego.Run()}

上面我们启动了http服务,接着关键就是beego.Router()如何注册路由了。追了下代码如下:

beego.Router() -> BeeApp.Handlers.Add(rootpath, c, mappingMethods...) -> ControllerRegister.addWithMethodParams(pattern, c, nil, mappingMethods...) -> ControllerRegister.addToRouter(method, pattern string, r *ControllerInfo) -> *Tree.AddRouter(pattern string, runObject interface{})

最后就是在*Tree.AddRouter()完成了路由注册,这里的代码逻辑暂时就先不看了,至此这个beego框架的流程就其本理顺了,最后我们在回头总结下整个流程如下图:

备注:go导入包相当于入栈过程,先import后执行init

172f043e349e2906adda181c5159a9df.png

推荐阅读

  • 最流行的 Web 框架 Gin 源码阅读


喜欢本文的朋友,欢迎关注“Go语言中文网”:

c55d2a78dd85ffd5905b71c1470b410b.png

Go语言中文网启用微信学习交流群,欢迎加微信:274768166,投稿亦欢迎

采用beego框架构建 http服务器 beego是一个使用 Go 的思维来快速构建并开发 Go 应用程序的开源http框架,作者是谢孟军。它可以快速开发API、Web、后端服务等各种应用,功能支持RESTFul,MVC模型;含有智能路由,内置强大模块,采用了 Go 原生的 http 包来处理请求;goroutine 的并发效率足以应付大流量的 Web 应用和 API 应用等等,可谓是简单易用,十分强大。      为了更好地熟悉bee 阅读详情

相关推荐

Golang OSINT工具开发实战:从PhoneInfoga看高并发架构与框架选型

开源情报(OSINT)技术是从公开来源搜集和分析信息的关键方法,广泛应用于安全评估、风控和调研领域。其核心原理在于通过自动化工具聚合多源公开数据,进行交叉验证,以提升信息获取的效率和可靠性。在技术实现上,高并发处理和易部署性是关键价值。Golang语言凭借其卓越的并发模型(Goroutine)和编译为单一可执行文件的特性,成为构建此类高性能命令行工具和网络服务的理想选择。结合插件化架构设计,开发者可以快速构建像PhoneInfoga这样可扩展的OSINT框架。在实际应用场景中,这类技术不仅用于电话号码等信息

weixin_34038293的博客 336

beego中文开发文档

beego中文开发文档.pdf 

Beego中文文档PDF

Beego中文文档PDF版,便于平板上阅读查看。。。。。。。

Go:Beego零基础到项目实战

Beego零基础到项目实战

KaiSarH 6445

beego学习与代码示例WebIM解析-Ali0th

Author : Ali0th Date : 2019-4-26 安装 go get github.com/astaxie/beego # beego go install # 在beego目录下安装 go get github.com/beego/bee # 工具 bee version # 执行成功说明安装成功 复制代码基本架构 ├── conf │ └── app.conf ├──...

weixin_34358365的博客 482

284页beego官方中文文档,Go语言进阶必备

Go语言作为出身名门的后起之秀,大家所熟知的Docker和Kubernets(K8S)就是使用Go语言开发的,以其简单高效、高并发、跨平台的优势,称霸于容器领域。 根据 Stack Overflow 的调查显示,2021年,程序员最想学习的编程语言榜单中,Go语言以17.9%的比例排在第三位。 Beego 是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API、Web 及后端服务等各种应用,是一个 RESTful 的框架,主要设计灵感来源于 tornado、sinatra 和 flask

yunwei_gtq的博客 4310

高性能ORM 框架之 MySqlSugar

mysql 3.X API地址:  http://www.cnblogs.com/sunkaixuan/p/5987308.html   MySqlSugar 1.5 API 一、介简 SqlSugar ORM框架一直在升级当中,昨天将EMIT架构进行了重构,让类型转换更加智能,EMIT转换后的性能和原生ADO同水准(以前只是接近),为了提高性能、稳定、有问必答、有需求必改、坚持更新。例如...

weixin_34342992的博客 362

华山论剑:各大编程语言Web框架巅峰对决

有Laravel Echo。作为开发者,我们最核心的竞争力永远不是熟练背诵了多少个框架的API,而是能否在面对具体的业务体量、团队技术基因以及服务器硬件成本时,做出最冷酷、最克制的技术选型。随着.NET Core的全面开源和跨平台战略的推进,C#这门原本就极其优秀的强类型语言彻底挣脱了枷锁,在Linux容器和云原生环境中迎来了极其恐怖的爆发。作为一门完全兼容Java的静态类型语言,Kotlin不仅在Android开发领域成为了官方霸主,更凭借其强大的“协程”特性,在后端Web开发领域撕开了一道巨大的口子。

gygkhd的博客 424

Beego 示例项目教程

Beego 是一个快速开发 Go 应用的 HTTP 框架,可以用来快速开发 API、Web 及后端服务等各种应用。本示例项目旨在展示如何使用 Beego 框架进行开发,并提供一些基础的代码示例。 ## 项目快速启动 ### 环境准备 确保你已经安装了 Go 语言环境(建议版本 1.16 以上)。如果没有安装,可以从 [Go 官方网站](https://golang.org/) 下载并安装。 ...

gitblog_00550的博客 471

BeeGo框架实现的一个WEB应用实例

麻雀虽小五脏俱全。 本应用是用BeeGo框架进行的一个WEB应用快速开发,是一个在生产环境实际运行的商业软件。 适用数据库MySQL,详细配置请参阅conf\global\app.ini。本应用打包部署工具为Bee。 前端采用了amazeui制作工作台页面,标准的左边菜单栏右边工作页面---一个适合各种此类应用的快速开发模板。其他还有ztree树形组件、echarts百度报表插件、paging分页组件。。 实现了几个单表的CRUD操作的几个模块,其中"子系统管理"模块探索了多表关联的复杂操作。并且为了实现模糊查询,试写了一个构造原生SQL进行分页查询的前后台组件,是进阶软件开发者不可多得的学习素材。 做为彩蛋,本作还用百度echarts报表插件实现了饼状图和柱状图两个报表。 欢迎各位Go语言爱好者踊跃下载学习。作者倾情奉献,第一周免积分下载哦 (^_^)

"BeeGo框架实现的一个WEB应用实例"数据库MYSQL脚本

不好意思,"BeeGo框架实现的一个WEB应用实例"没有附带数据库,特此补正! 本应用是用BeeGo框架进行的一个WEB应用快速开发,是一个在生产环境实际运行的商业软件。 适用数据库MySQL,详细配置请参阅conf\global\app.ini。本应用打包部署工具为Bee。 前端采用了amazeui制作工作台页面,标准的左边菜单栏右边工作页面---一个适合各种此类应用的快速开发模板。其他还有ztree树形组件、echarts百度报表插件、paging分页组件。。 实现了几个单表的CRUD操作的几个模块,其中"子系统管理"模块探索了多表关联的复杂操作。并且为了实现模糊查询,试写了一个构造原生SQL进行分页查询的前后台组件,是进阶软件开发者不可多得的学习素材。 做为彩蛋,本作还用百度echarts报表插件实现了饼状图和柱状图两个报表。 欢迎各位Go语言爱好者加群学习讨论,BeeGo学习交流群 552015496。作者倾情奉献哦 (^_^)

Beego框架学习:深入指南

Beego中,你可以在routers目录下的router.go文件中定义路由规则。import (// 添加更多路由规则...

Code掘金的博客 1002

Beego之Bee安装以及创建,运行项目

Beego之Bee安装(Windows)以及创建,运行项目

资深系统架构,深耕高并发研发与 AI 大模型工程化落地。技术栈以 Python (AI/NLP/RAG/Agent) 与 Golang (高并发架构) 为双核心,兼具 PHP 大型应用经验。专注算法落地、复杂系统设计及团队技术赋能 5521

beego开发文档(提取总结于官方文档,小白必看)

beego 是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API、Web 及后端服务等各种应用,是一个 RESTful 的框架,主要设计灵感来源于 tornado、sinatra 和 flask 这三个框架,但是结合了 Go 本身的一些特性(interface、struct 嵌入等)而设计的一个框架beego 的整体设计架构如下所示:beego 是基于八大独立的模块构建的,是一个高度解耦的框架。当初设计 beego 的时候就是考虑功能模块化,用户即使不使用 beego 的 HTTP 逻

m0_63230155的博客 5418

beego框架基础知识学习笔记

beego框架基础知识学习笔记

一弓虽的博客 1829

BeegoBeego简介和安装

Beego简介和安装

YIYIYI 2423

beego 例子_Beego中文文档PDF

【实例简介】Beego中文文档PDF版,便于平板上阅读查看。。。。。。。快速入门」快速入门安装brego包含一些示例应用程序以帮您学习并使用 brego应用框架您需要安装Go1.1+以确保所有功能的正常使用你需要安装或者升级eego和Bee的开发T具I S go get-u github. com/astaxie/beegoISgogetougithub.com/beego/bee为了更加方便的操...

weixin_39775577的博客 3619
上一篇: 敏捷开发框架_关于敏捷开发的最佳实践和工具
下一篇: html 5 插入广告_Web前端:20道非常有代表性的HTML基础测试题
程序员小智和大鹏
博客等级 码龄7年 28粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值