beego 的 http server…

Author 逆雪寒 2015.12.02

在工作中有用到golang,后来遇到了beego 重构了一下我的应用。感觉棒棒的~ 应用强壮了不少。所以我打算以最新的stable v1.5.0 来剖析下beego的源代码,因为知其然知其所以然.我们才能更好的使用beego ,同时提高我们的golang能力 。加我的群吧 一起学习 群号:511634754

* beego 的源代码里,为了让大家顺畅阅读更好理解。我会删掉那些本节我没分析到的代码。

这 节我们先从 beego 的 http server 说起。我们会抽丝剥茧,让一个最简单的的 “beego” 跑起来。最基础最核心其实就两样东西. http.Server 和 Handler 他们的关系~就类似 麦当劳 和 麦当劳里的服务员妹子。 先有了麦当劳..然后 你给钱妹子。。妹子给你冰淇淋。。也就 请求和输出..

这段是官网贴的启动beego的代码。 那我们就从 Run 这个函数开始

package main

import"github.com/astaxie/beego"

func main(){

beego.Run()

}

beego.go文件

// Run 函数 有一个可变参数 ...string 相当于 []string{} 这个不懂..那就别继续往下看了~先复习golang基础

// 此参数是告知 http server 要绑定的 host 和 port 。 例如: 127.0.0.1:9413

func Run(params ...string){

iflen(params)>0&&params[0]!=""{

// -_- 看看人家是怎么把 地址和端口拆到两个变量里去的...

// HttpAddr 和 HttpPort 这两个变量是在 config.go 里定义的 大写字母开头哦~ 是全局变量

// 记录了http server 要绑定的地址和 端口号,方便在其他模块进行调用

strs :=strings.Split(params[0],":")

iflen(strs)>0&&strs[0]!=""{

HttpAddr=strs[0]

}

iflen(strs)>1&&strs[1]!=""{

HttpPort,_ =strconv.Atoi(strs[1])

}

}

//要绑定的地址和端口都得到了之后。正式启动。 调用BeeApp 里面的方法 Run

BeeApp.Run()

}

BeeApp 这个结构很重要。很多底层的都封装在这个结构里。我们看下 它的 Run 是啥东西。 BeeApp 是一个指向 App结构的变量。 在 config.go 文件里定义

config.go文件

var(

BeeApp*App

同时在 init 函数里 里进行初始化

// import的时候其实是执行了该包里面的init函数。。应该懂吧

//执行了 NewApp() 函数~ 那 NewApp 函数执行了啥呢。。我们一层一层的脱了她的衣服....接着看

func init(){

BeeApp=NewApp()

NewApp 函数定义在 app.go 文件里。 看代码…

app.go文件

type Appstruct{

Server*http.Server// 这个就是 麦当劳..

Handlers*ControllerRegistor//这个就是麦当劳里面的服务员妹子。具体代码请看后面

}

func NewApp()*App{

cr :=NewControllerRegister()//new 一个 Handlers,方便用来处理 http服务 的输入和输出

//初始化了 App结构。http.Server 这个就是golang自带的http server了~ 太好理解了。这样

//app.Server 就是 等于 http.Server了~ 如果我们不用 beego 的时候。 写个http server

//是不是直接调用 http.Server.ListenAndServe()就很容易实现一个 类似nginx 的基础http 服务器

//那可能有的人说 http.ListenAndServe() 这样就可以啦。嗯 不过看下源代码就知道

//http.ListenAndServe 其实 也是调用更底层的 http.Server.ListenAndServe 。 beego

//为了灵活性所以用更底层的 http.Server.ListenAndServe

app :=&App{Handlers:cr,Server:&http.Server{}}

returnapp

}

func (app *App)Run(){

endRunning :=make(chan bool,1)

go func(){

// 组装好绑定地址和端口

addr :=fmt.Sprintf("%s:%d",HttpAddr,HttpPort)

//前面我们说了 app.Server 其实就是 http.Server。 那么我们看下官网手册 http.Server 这个结构里有啥

//type Server struct {

//Addr string // TCP address to listen on, ":http" if empty

//Handler Handler // handler to invoke, http.DefaultServeMux if nil

//ReadTimeout time.Duration // maximum duration before timing out read of the request

//WriteTimeout time.Duration // maximum duration before timing out write of the response

//MaxHeaderBytes int // maximum size of request headers, DefaultMaxHeaderBytes if 0

//TLSConfig *tls.Config // optional TLS config, used by ListenAndServeTLS

// 我们这里可以只关注。两个变量 Addr 和 Handler

// Addr 就是我们要绑定的地址和端口

// Handler 就是我们的处理器, GET POST PUT 等请求就是需要他接收和输出..

// 这么理解吧 http.Server 这个结构就像是麦当劳.. 而 Handler 就是服务员小妹妹,

// 她负责收钱 和给你冰淇淋

//确定要绑定ip和端口

app.Server.Addr=addr

//确定这个http容器里负责处理 输入和输出的方法.. 就是那个 麦当劳服务员小妹妹,你给她钱。她给你...

app.Server.Handler=app.Handlers

//下面就是标准的启动一个 golang http server 的流程了...

ln,err :=net.Listen("tcp4",app.Server.Addr)

iferr !=nil {

endRunning

return

}

err =app.Server.Serve(ln)

iferr !=nil {

endRunning

return

}

}()

//channel 默认是阻塞。 利用这点。阻塞宿主程序。 否则~~ 宿主都退出了 而 go func 里面的程序~自然也就不存在了

}

上面是创建了 http 服务容器。接下来就是 接待输入和输出的自定义方法。beego是怎么设计的呢。只有一个目的就是实现ServeHTTP 这个方法。只有实现了这个方法,那么才符合 app.Server.Handler = app.Handlers。我们看下官网手册 http 这节对于Handler的定义。

type Handlerinterface {

ServeHTTP(ResponseWriter,*Request)

}

其实就是一个接口。里面只有一个方法.. 你懂了吗? interface 你可以理解为Handler发动机设计图. 无论是歼20还是歼16,只要按照图纸做出来的发动机,当然里面的细节可以根据具体的战斗机需要进行调整(实现了 ServeHTTP这个方法)..我们都可以说 这款战机的发动机是 Handler发动机 -_-! 讲了好多废话..

router.go

//beego 从命名中可以get到~~ 这个是控制器注册器

type ControllerRegistorstruct{

}

//模仿 new go 例牌

func NewControllerRegister()*ControllerRegistor{

return&ControllerRegistor{}

}

//就是这个东西。http容器里的输入输出我们如何把玩?就看你怎么实现 ServeHTTP 这个方法了。

func (p *ControllerRegistor)ServeHTTP(rw http.ResponseWriter,r *http.Request){

//在这里。你可以自由的发挥了。比如 写你自己的 路由算法 等等等...

//这段是我自己加的。为了能输出清晰点。。。

rw.Header().Set("Content-Type","text/plain; charset=utf-8")// normal header

rw.WriteHeader(http.StatusOK)

io.WriteString(rw,"加我的群 golang 一起学习 群号:511634754")

有疑问加站长微信联系(非本文作者)

go php 框架,go框架 - Go语言中文网 - Golang中文社区相关推荐

  1. go语言爬虫教程python_Go语言爬虫 - Go语言中文网 - Golang中文社区

    之前写爬虫都是用的python语言,最近发现go语言写起来也挺方便的,下面简单介绍一下. 这里说的爬虫并不是对网络中的很多资源进行不断的循环抓取,而只是抓通过程序的手段都某些网页实现特定的信息抓取.可 ...

  2. 环形队列PHP,环形队列 - Go语言中文网 - Golang中文社区

    PHP代码实现 class Listo { public function getlist() { return $this->arr; } private $arr = array(); pr ...

  3. mamcache登录、_gomemcache首页、文档和下载 - memcache客户端库 - Go语言中文网 - Golang中文社区...

    **安装 ** 使用 go get $ go get github.com/bradfitz/gomemcache/memcache 此命令后gomemcache即可使用.它的来源将是: $GOPAT ...

  4. linux 安装 yum etcd,安装etcd - Go语言中文网 - Golang中文社区

    etcd是一个golang编写的分布式.高可用的一致性键值存储系统,用于提供可靠的分布式键值(key-value)存储.配置共享和服务发现等功能.etcd可以用于存储关键数据和实现分布式调度,在现代化 ...

  5. 如何编写 android go 程序,轻松搭建基于go1.5开发Android应用的环境 | Go语言中文网 | Golang中文社区 | Golang中国...

    go1.5beta2已经发布,正式版将在8月份发布.而早在go1.4就已发布了golang/mobile项目用以实现Android应用的开发.当前gomobile的环境部署已经相对成熟了.但项目声明必 ...

  6. 安装php的yii框架,Yii框架 安装方法

    一:首先下载Yii框架 官方:http://www.yiiframework.com/ 中文社区:http://www.yiichina.com/ 目录结构简单说明: • 目录名yii: • ---d ...

  7. spring框架 web开发_go语言web开发框架:Iris框架讲解(一)

    Golang介绍 Go语言是谷歌推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性.谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发Go,是因为过去10多年间软 ...

  8. spring框架 web开发_go语言web开发框架学习:Iris框架讲解(一)

    Golang介绍 Go语言是谷歌推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性.谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发Go,是因为过去10多年间软 ...

  9. Android 须知2019流行的框架库及开发语言

    Android 须知2019流行的框架库及开发语言 导语 2018 已经悄悄的走了,2019 也已经匆匆的来了,我们在总结过去的同时,也要展望一下未来,来规划一下今年要学哪些新技术.这几年优秀Andr ...

  10. 新浪微博应用 IE下面框架嵌套框架的问题解决

    新浪微博应用 IE下面框架嵌套框架的问题分为两种: 1.回调的参数有误: 2.session丢失: 第一个问题,需要亲们仔细研读接口文档, App.AuthDialog.show({client_id ...

最新文章

  1. 加强原始创新和基础研究的前提:三项破解之策
  2. 如何修改html页眉页脚,如何使用标准页眉和页脚修改/更新一组html文件
  3. alter system switch logfile和alter system archive log current的区别
  4. SQL server 2000安装时提示我”以前的某个程序安装已在安装计算机上创建挂起的文件操作....”...
  5. 目前的计算机系统属于第三代电子计算机,计算机应用基础判断题
  6. git status查看文件的状态
  7. BootStrap笔记-栅格系统
  8. 炫酷实用 7款jQuery/HTML5图片应用
  9. 用友U8固定资产总账重算语句
  10. @AspectJ中的几种通知方式详解
  11. Sharepoint学习笔记—ECM系列—找不到Content Type Publishing链接
  12. 提取文本手机号 易语言代码
  13. 文件上传到QQ邮箱文件中转站,链接
  14. LINUX——正则表达式
  15. 全国计算机一级证书重点知识,全国计算机一级
  16. 阿里云 linux nginx 环境配置 该网页无法正常运作
  17. 小程序转uni-app——引入组件显示问题
  18. web从零开始做网站:三.HTML标签:1.常用文本标签图像标签
  19. 医学影像后处理服务器系统架构是,医学影像系统(PACS)
  20. EDIUS和Premiere两款视频剪辑软件哪个好

热门文章

  1. C#之放入透明背景字体(label标签的透明设置)
  2. 利用shell删除labelme打错的标签
  3. Excel表格数据如何批量乘以一个数字
  4. 2021-2-2有道翻译在线翻译爬虫
  5. 题目 1341. 十三号星期五
  6. 二项分布期望与方差的证明
  7. JAVA Map类compute方法详解及样例
  8. JTXQ、JTT部标模拟终端使用说明 --3 报警及报警附件
  9. 屡用屡爆,大师们讲课都在偷偷使用四个课程结构模型
  10. 基于数据报表处理系统(VUE+SSM+MySQL)