GolangWeb架构Beego

Beego

GolangWeb架构Beego_第1张图片

beego简介

beego是一款快速开发Go应用的HTTp框架,它可以用来快速开发API,Web及后端服务的各种应用,是一个Restful风格的框架,主要的设计灵感来源于tormado,sinatra和flask这三个框架,但是结合了go本身的一些特性而设计的一个框架

beego的框架

beego的整体设计结构如下所示:
beego 是基于八大独立的模块构建的,是一个高度解耦的框架。当初设计 beego 的时候就是考虑功能模块化,用户即使不使用 beego的 HTTP 逻辑,也依旧可以使用这些独立模块,例: 你可以使用 ache 模块来做你的缓存逻辑;使用日志模块来记录你的操作信息:使用config 模块来解析你各种格式的文件,所以 beego 不仅可以用于 HTTP 类的应用开发,在你的 socket 游戏开发中也是很有用的模块,这也是 beego 如此受欢迎的一个原因,大家如果玩过乐高的话,应该知道很多高级的东西都是一块一块的积木搭建出来的,而设计 beego 的时候,这些模块就是积木,高级机器人就是 beego。至于这些模块的功能以及如何使用会在后面的文档逐一介绍,
GolangWeb架构Beego_第2张图片

beego的项目结构:

├── conf
│ └── app.conf
├── controllers
│ ├── admin
│ └── default.go
├── main.go
├── models
│ └── models.go
├── static
│ ├── css
│ ├── ico
│ ├── img
│ └── js
└── views
├── admin
└── index.tpl
从上面的目录结构我们可以看出来M,V,C的结构 ,main是入口文件。

第一个Beego项目

GolangWeb架构Beego_第3张图片

安装包:

go get -u github.com/beego/beego/v2
go get -u github.com/beego/bee/v2

1.16以上版本:
go install github.com/beego/bee/v2@latest

创建项目

bee new pro01

管理项目依赖

go mod tidy

运行项目

bee run

beego项目结构分析

app.conf

appname = pro01
httpport = 8080
runmode = dev

controller

package controllers

import (
	beego "github.com/beego/beego/v2/server/web"
)

type MainController struct {
	beego.Controller
}

func (c *MainController) Get() {
	c.Data["Website"] = "beego.me"
	c.Data["Email"] = "[email protected]"
	c.TplName = "index.tpl"
}

路由

package controllers

import (
	beego "github.com/beego/beego/v2/server/web"
)

type MainController struct {
	beego.Controller
}

func (c *MainController) Get() {
	c.Data["Website"] = "ywc.vip"
	c.Data["Name"] = "ywc"
	c.TplName = "index.tpl"
}

视图

<!DOCTYPE html>
<html lang="en">
<head>
    <title>golang技术栈</title>
</head>
<body>


    网站:{{.Website}} <br>

    姓名:{{.Name}}

</body>
</html>

运行结果
GolangWeb架构Beego_第4张图片

bee 工具简介

bee 工具是一个为了协助开发beego项目而创建的项目,通过beego您可以很容易的进行beego项目的创建,预编译 开发和测试以及部署

bee工具的安装

你可以通过如下的方式安装bee工具

go get -u github.com/beego/bee/v2

Bee工具命令详解

我们在cmd命令窗口输入bee可以验证环境变量是否配置完成,如果配置完成,我们可以看到下面的信息:

Bee is a Fast and Flexible tool for managing your Beego Web Application.

Usage:

    bee command [arguments]

The commands are:

    version     show the bee & beego version
    migrate     run database migrations
    api         create an api application base on beego framework
    bale        packs non-Go files to Go source files    
    new         create an application base on beego framework
    run         run the app which can hot compile
    pack        compress an beego project
    fix         Fixes your application by making it compatible with newer versions of Beego
    dlv         Start a debugging session using Delve
    dockerize   Generates a Dockerfile for your Beego application
    generate    Source code generator
    hprose      Creates an RPC application based on Hprose and Beego frameworks
    pack        Compresses a Beego application into a single file
    rs          Run customized scripts
    run         Run the application by starting a local development server
    server      serving static content over HTTP on port
    
Use bee help [command] for more information about a command.
    

new命令

new命令是新建一个Web项目,我们在命令行下执行 bee new <项目名>就可以创建一个新的项目 ,但是注意该命令必须在 G O P A T H / s r c 下执行。最后会在 GOPATH/src 下执行。最后会在 GOPATH/src下执行。最后会在GOPATH/src相应目录下生成如下目录结构的项目

bee new myproject
[INFO] Creating application...
/gopath/src/myproject/
/gopath/src/myproject/conf/
/gopath/src/myproject/controllers/
/gopath/src/myproject/models/
/gopath/src/myproject/static/
/gopath/src/myproject/static/js/
/gopath/src/myproject/static/css/
/gopath/src/myproject/static/img/
/gopath/src/myproject/views/
/gopath/src/myproject/conf/app.conf
/gopath/src/myproject/controllers/default.go
/gopath/src/myproject/views/index.tpl
/gopath/src/myproject/main.go
13-11-25 09:50:39 [SUCC] New application successfully created!
myproject
├── conf
│   └── app.conf
├── controllers
│   └── default.go
├── main.go
├── models
├── routers
│   └── router.go
├── static
│   ├── css
│   ├── img
│   └── js
├── tests
│   └── default_test.go
└── views
    └── index.tpl

8 directories, 4 files

api命令

上面的new 命令是用来新建Web项目,不过很多用户使用beego来开发API应用,所以这个api命令就是用来创建api应用的,执行之后如下所示:

bee api apiproject
create app folder: /gopath/src/apiproject
create conf: /gopath/src/apiproject/conf
create controllers: /gopath/src/apiproject/controllers
create models: /gopath/src/apiproject/models
create tests: /gopath/src/apiproject/tests
create conf app.conf: /gopath/src/apiproject/conf/app.conf
create controllers default.go: /gopath/src/apiproject/controllers/default.go
create tests default.go: /gopath/src/apiproject/tests/default_test.go
create models object.go: /gopath/src/apiproject/models/object.go
create main.go: /gopath/src/apiproject/main.go

这个项目的目录结构如下:

apiproject
├── conf
│   └── app.conf
├── controllers
│   └── object.go
│   └── user.go
├── docs
│   └── doc.go
├── main.go
├── models
│   └── object.go
│   └── user.go
├── routers
│   └── router.go
└── tests
    └── default_test.go

从上边的目录我们我们可以看出和web项目相比,少了static和views目录,多个test模块,是用来做单元测试的
同时,该命令还支持一些自定义参数自动连接数据库创建相关的model和controller

run命令

我们在开发Go项目的时候最大的问题是经常需要手动编译后再运行,bee run命令是监控beego的项目 ,通过fsnoity监控文件系统,但是注意该命令必须要在$GOPATH/appname下执行

bee run
13-11-25 09:53:04 [INFO] Uses 'myproject' as 'appname'
13-11-25 09:53:04 [INFO] Initializing watcher...
13-11-25 09:53:04 [TRAC] Directory(/gopath/src/myproject/controllers)
13-11-25 09:53:04 [TRAC] Directory(/gopath/src/myproject/models)
13-11-25 09:53:04 [TRAC] Directory(/gopath/src/myproject)
13-11-25 09:53:04 [INFO] Start building...
13-11-25 09:53:16 [SUCC] Build was successful
13-11-25 09:53:16 [INFO] Restarting myproject ...
13-11-25 09:53:16 [INFO] ./myproject is running...

bee pack

bee version

bee generate

这个命令是用来自动化生成代码的,包含了从数据库一键生成model,还包含了scaffold的,通过这个命令,让大家开发代码不在慢

bee generate scaffold [scaffoldname] [-fields=""] [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"]
    The generate scaffold command will do a number of things for you.
    -fields: a list of table fields. Format: field:type, ...
    -driver: [mysql | postgres | sqlite], the default is mysql
    -conn:   the connection string used by the driver, the default is root:@tcp(127.0.0.1:3306)/test
    example: bee generate scaffold post -fields="title:string,body:text"

bee generate model [modelname] [-fields=""]
    generate RESTful model based on fields
    -fields: a list of table fields. Format: field:type, ...

bee generate controller [controllerfile]
    generate RESTful controllers

bee generate view [viewpath]
    generate CRUD view in viewpath

bee generate migration [migrationfile] [-fields=""]
    generate migration file for making database schema update
    -fields: a list of table fields. Format: field:type, ...

bee generate docs
    generate swagger doc file
    
bee generate routers [-ctrlDir=/path/to/controller/directory] [-routersFile=/path/to/routers/file.go] [-routersPkg=myPackage]
    -ctrlDir: the directory contains controllers definition. Bee scans this directory and its subdirectory to generate routers info
    -routersFile: output file. All generated routers info will be output into this file. 
              If file not found, Bee create new one, or Bee truncates it.
              The default value is "routers/commentRouters.go"
    -routersPkg: package declaration.The default value is "routers". 
              When you pass routersFile parameter, you'd better pass this parameter

bee generate test [routerfile]
    generate testcase

bee generate appcode [-tables=""] [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"] [-level=3]
    generate appcode based on an existing database
    -tables: a list of table names separated by ',', default is empty, indicating all tables
    -driver: [mysql | postgres | sqlite], the default is mysql
    -conn:   the connection string used by the driver.
             default for mysql:    root:@tcp(127.0.0.1:3306)/test
             default for postgres: postgres://postgres:postgres@127.0.0.1:5432/postgres
    -level:  [1 | 2 | 3], 1 = models; 2 = models,controllers; 3 = models,controllers,router

例如; bee generate scaffold user -fields=“id:int64,name:string” -driver=mysql -conn=“root:123789@tcp(127.0.0.1:3306)/beeggo_db”

注意 :项目需要在GOPATH/src/下面才能生成

migrate 命令

这个命令是应用的数据库迁移命令,主要是用来每次应用升级,降级的sql管理

bee migrate [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"]
    run all outstanding migrations
    -driver: [mysql | postgresql | sqlite], the default is mysql
    -conn:   the connection string used by the driver, the default is root:@tcp(127.0.0.1:3306)/test

bee migrate rollback [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"]
    rollback the last migration operation
    -driver: [mysql | postgresql | sqlite], the default is mysql
    -conn:   the connection string used by the driver, the default is root:@tcp(127.0.0.1:3306)/test

bee migrate reset [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"]
    rollback all migrations
    -driver: [mysql | postgresql | sqlite], the default is mysql
    -conn:   the connection string used by the driver, the default is root:@tcp(127.0.0.1:3306)/test

bee migrate refresh [-driver=mysql] [-conn="root:@tcp(127.0.0.1:3306)/test"]
    rollback all migrations and run them all again
    -driver: [mysql | postgresql | sqlite], the default is mysql
    -conn:   the connection string used by the driver, the default is root:@tcp(127.0.0.1:3306)/test

dockerize 命令

这个命令可以通过dockerfile文件来实现docker化你的应用
例子L生成一个1.6.4版本的go环境为基础镜像的Dockerfile,并暴露9000端口:

$ bee dockerize -image="library/golang:1.6.4" -expose=9000
______
| ___ \
| |_/ /  ___   ___
| ___ \ / _ \ / _ \
| |_/ /|  __/|  __/
\____/  \___| \___| v1.6.2
2016/12/26 22:34:54 INFO     ▶ 0001 Generating Dockerfile...
2016/12/26 22:34:54 SUCCESS  ▶ 0002 Dockerfile generated.

beego参数配置

beego目前支持INI,XML,JSON,YAML格式的配置文件,但是默认采用了Ini格式解析,用户可以通过简单的配置就可以获得很大的灵活性

默认配置解析

beego会默认解析当前应用下的conf/app.conf文件。
通过这个文件你可以初始化很多beego的默认参数

appname = beepkg
httpaddr = "127.0.0.1"
httpport = 9090
runmode ="dev"
autorender = false
recoverpanic = false
viewspath = "myview"

他们都维护在结构体beego/server/web#config
BConfig就是beego里面的默认配置,也是结构体beego/server/web#config的实例
你也可以直接通过修改web.BConfig.AppName这样来修改,和上面的配置效果一样,只是一个代码在里面写死了,而写配置文件会更加的灵活你也可以在配置文件中配置应用的洗鞋有用的配置信息,例如下边的的数据库信息:

mysqluser = "root"
mysqlpass = "rootpass"
mysqlurls = "127.0.0.1"
mysqldb   = "beego"

你可以通过下边的方式获取配置文件的信息:

web.AppConfig.String("mysqluser")
web.AppConfig.String("mysqlpass")
web.AppConfig.String("mysqlurls")
web.AppConfig.String("mysqldb")

AppConfig的方法如下:
GolangWeb架构Beego_第5张图片

不同级别的配置:

在配置文件里面致贺词section,可以有不同的Runmode的配置,默认优先读取runmode下的配置信息,例如下面的配置文件:

appname = beepkg
httpaddr = "127.0.0.1"
httpport = 9090
runmode ="dev"
autorender = false
recoverpanic = false
viewspath = "myview"

[dev]
httpport = 8080
[prod]
httpport = 8088
[test]
httpport = 8888

上面的配置文件就是在不同的runmode下解析不同的配置,例如在deev模式下 ,httpport是8080,在prod模式下是808等等

多个配置文件

INI格式配支持include方式,引用多个配置文件,例如上边的俩个配置文件效果同上:
app.conf

appname = beepkg
httpaddr = "127.0.0.1"
httpport = 9090

include "app2.conf"

app2.conf

runmode ="dev"
autorender = false
recoverpanic = false
viewspath = "myview"

[dev]
httpport = 8080
[prod]
httpport = 8088
[test]
httpport = 8888

支持环境变量配置
配置文件解析支持从环境变量中获取配置项
app.conf

runmode  = "${ProRunMode||dev}"
httpport = "${ProPort||9090}"

系统默认参数

beego 中带有很多可配置的参数,我们来一一认识一下它们,这样有利于我们在接下来的 beego 开发中可以充分的发挥他们的作用(你可以通过在 conf/app.conf 中设置对应的值,不区分大小写):

基础配置
BConfig 保存了所有 beego 里面的系统默认参数,你可以通过 web.BConfig 来访问和修改底下的所有配置信息.
配置文件路径,默认是应用程序对应的目录下的 conf/app.conf,用户可以在程序代码中加载自己的配置文件 beego.LoadAppConfig(“ini”, “conf/app2.conf”) 也可以加载多个文件,只要你调用多次就可以了,如果后面的文件和前面的 key 冲突,那么以最新加载的为最新值

App 配置
AppName

应用名称,默认是 beego。通过 bee new 创建的是创建的项目名。

web.BConfig.AppName = “beego”

RunMode

应用的运行模式,可选值为 prod, dev 或者 test. 默认是 dev, 为开发模式,在开发模式下出错会提示友好的出错页面,如前面错误描述中所述。

web.BConfig.RunMode = “dev”

RouterCaseSensitive

是否路由忽略大小写匹配,默认是 true,区分大小写

web.BConfig.RouterCaseSensitive = true

ServerName

beego 服务器默认在请求的时候输出 server 为 beego。

web.BConfig.ServerName = “beego”

RecoverPanic

是否异常恢复,默认值为 true,即当应用出现异常的情况,通过 recover 恢复回来,而不会导致应用异常退出。

web.BConfig.RecoverPanic = true

CopyRequestBody

是否允许在 HTTP 请求时,返回原始请求体数据字节,默认为 false (GET or HEAD or 上传文件请求除外)。

web.BConfig.CopyRequestBody = false

EnableGzip

是否开启 gzip 支持,默认为 false 不支持 gzip,一旦开启了 gzip,那么在模板输出的内容会进行 gzip 或者 zlib 压缩,根据用户的 Accept-Encoding 来判断。

web.BConfig.EnableGzip = false

Gzip允许用户自定义压缩级别、压缩长度阈值和针对请求类型压缩:

压缩级别, gzipCompressLevel = 9,取值为 1~9,如果不设置为 1(最快压缩)
压缩长度阈值, gzipMinLength = 256,当原始内容长度大于此阈值时才开启压缩,默认为 20B(ngnix默认长度)
请求类型, includedMethods = get;post,针对哪些请求类型进行压缩,默认只针对 GET 请求压缩
MaxMemory

文件上传默认内存缓存大小,默认值是 1 << 26(64M)。

web.BConfig.MaxMemory = 1 << 26

EnableErrorsShow

是否显示系统错误信息,默认为 true。

web.BConfig.EnableErrorsShow = true

EnableErrorsRender

是否将错误信息进行渲染,默认值为 true,即出错会提示友好的出错页面,对于 API 类型的应用可能需要将该选项设置为 false 以阻止在 dev 模式下不必要的模板渲染信息返回。

Web配置
AutoRender

是否模板自动渲染,默认值为 true,对于 API 类型的应用,应用需要把该选项设置为 false,不需要渲染模板。

web.BConfig.WebConfig.AutoRender = true

EnableDocs

是否开启文档内置功能,默认是 false

web.BConfig.WebConfig.EnableDocs = true

FlashName

Flash 数据设置时 Cookie 的名称,默认是 BEEGO_FLASH

web.BConfig.WebConfig.FlashName = “BEEGO_FLASH”

FlashSeperator

Flash 数据的分隔符,默认是 BEEGOFLASH

web.BConfig.WebConfig.FlashSeparator = “BEEGOFLASH”

DirectoryIndex

是否开启静态目录的列表显示,默认不显示目录,返回 403 错误。

web.BConfig.WebConfig.DirectoryIndex = false

StaticDir

静态文件目录设置,默认是static

可配置单个或多个目录:

单个目录, StaticDir = download. 相当于 beego.SetStaticPath(“/download”,“download”)
多个目录, StaticDir = download:down download2:down2. 相当于 beego.SetStaticPath(“/download”,“down”) 和 beego.SetStaticPath(“/download2”,“down2”)
web.BConfig.WebConfig.StaticDir

StaticExtensionsToGzip

允许哪些后缀名的静态文件进行 gzip 压缩,默认支持 .css 和 .js

web.BConfig.WebConfig.StaticExtensionsToGzip = []string{“.css”, “.js”}

等价 config 文件中

StaticExtensionsToGzip = .css, .js
TemplateLeft

模板左标签,默认值是{{。

web.BConfig.WebConfig.TemplateLeft=“{{”

TemplateRight

模板右标签,默认值是}}。

web.BConfig.WebConfig.TemplateRight=“}}”

ViewsPath

模板路径,默认值是 views。

web.BConfig.WebConfig.ViewsPath=“views”

EnableXSRF

是否开启 XSRF,默认为 false,不开启。

web.BConfig.WebConfig.EnableXSRF = false

XSRFKEY

XSRF 的 key 信息,默认值是 beegoxsrf。 EnableXSRF=true 才有效

web.BConfig.WebConfig.XSRFKEY = “beegoxsrf”

XSRFExpire

XSRF 过期时间,默认值是 0,不过期。

web.BConfig.WebConfig.XSRFExpire = 0

CommentRouterPath

CommentRouterPath 注解路由所在位置。默认值是controllers。 Beego 会在启动的时候扫描下面的文件生成了路由。 web.BConfig.WebConfig.CommentRouterPath = “controllers”

监听配置
Graceful

是否开启热升级,默认是 false,关闭热升级。

web.BConfig.Listen.Graceful=false

ServerTimeOut

设置 HTTP 的超时时间,默认是 0,不超时。

web.BConfig.Listen.ServerTimeOut=0

ListenTCP4

监听本地网络地址类型,默认是TCP6,可以通过设置为true设置为TCP4。

web.BConfig.Listen.ListenTCP4 = true

EnableHTTP

是否启用 HTTP 监听,默认是 true。

web.BConfig.Listen.EnableHTTP = true

HTTPAddr

应用监听地址,默认为空,监听所有的网卡 IP。

web.BConfig.Listen.HTTPAddr = “”

HTTPPort

应用监听端口,默认为 8080。

web.BConfig.Listen.HTTPPort = 8080

EnableHTTPS

是否启用 HTTPS,默认是 false 关闭。当需要启用时,先设置 EnableHTTPS = true,并设置 HTTPSCertFile 和 HTTPSKeyFile

web.BConfig.Listen.EnableHTTPS = false

HTTPSAddr

应用监听地址,默认为空,监听所有的网卡 IP。

web.BConfig.Listen.HTTPSAddr = “”

HTTPSPort

应用监听端口,默认为 10443

web.BConfig.Listen.HTTPSPort = 10443

HTTPSCertFile

开启 HTTPS 后,ssl 证书路径,默认为空。

web.BConfig.Listen.HTTPSCertFile = “conf/ssl.crt”

HTTPSKeyFile

开启 HTTPS 之后,SSL 证书 keyfile 的路径。

web.BConfig.Listen.HTTPSKeyFile = “conf/ssl.key”

EnableAdmin

是否开启进程内监控模块,默认 false 关闭。

web.BConfig.Listen.EnableAdmin = false

AdminAddr

监控程序监听的地址,默认值是 localhost 。

web.BConfig.Listen.AdminAddr = “localhost”

AdminPort

监控程序监听的地址,默认值是 8088 。

web.BConfig.Listen.AdminPort = 8088

EnableFcgi

是否启用 fastcgi , 默认是 false。

web.BConfig.Listen.EnableFcgi = false

EnableStdIo

通过fastcgi 标准I/O,启用 fastcgi 后才生效,默认 false。

web.BConfig.Listen.EnableStdIo = false

Session配置
SessionOn

session 是否开启,默认是 false。

web.BConfig.WebConfig.Session.SessionOn = false

SessionProvider

session 的引擎,默认是 memory,详细参见 session 模块。

web.BConfig.WebConfig.Session.SessionProvider = “”

SessionName

存在客户端的 cookie 名称,默认值是 beegosessionID。

web.BConfig.WebConfig.Session.SessionName = “beegosessionID”

SessionGCMaxLifetime

session 过期时间,默认值是 3600 秒。

web.BConfig.WebConfig.Session.SessionGCMaxLifetime = 3600

SessionProviderConfig

配置信息,根据不同的引擎设置不同的配置信息,详细的配置请看下面的引擎设置,详细参见 session 模块

SessionCookieLifeTime

session 默认存在客户端的 cookie 的时间,默认值是 3600 秒。

web.BConfig.WebConfig.Session.SessionCookieLifeTime = 3600

SessionAutoSetCookie

是否开启SetCookie, 默认值 true 开启。

web.BConfig.WebConfig.Session.SessionAutoSetCookie = true

SessionDomain

session cookie 存储域名, 默认空。

web.BConfig.WebConfig.Session.SessionDomain = “”

Log配置
log详细配置,请参见 logs 模块
AccessLogs

是否输出日志到 Log,默认在 prod 模式下不会输出日志,默认为 false 不输出日志。此参数不支持配置文件配置。

web.BConfig.Log.AccessLogs = false

FileLineNum

是否在日志里面显示文件名和输出日志行号,默认 true。此参数不支持配置文件配置。

web.BConfig.Log.FileLineNum = true

Outputs

日志输出配置,参考 logs 模块,console file 等配置,此参数不支持配置文件配置。

web.BConfig.Log.Outputs = map[string]string{“console”: “”}

or

web.BConfig.Log.Outputs[“console”] = “”

Beego ORM

beego ORM是一个强大的Go语言orm框架,她的灵感主要来自于Django ORM和sqlAlchemy。目前框架仍处于开发阶段,可能发生任何导致不兼容的改动
安装ORM :

go get github.com/beego/beego/v2/client/orm

你可能感兴趣的:(架构,beego)