Frenlee

golang 后台服务应用基本组件组合

golang 很适合写一些后台的小服务程序,一般来说一个服务程序的构成都离不开配置,日志,数据库的操作,简单说下个人开发中使用的程序组件以及基本目录结构.

项目中使用govendor安装项目依赖,base/为项目目录名称

配置组件

在程序中配置是一个必不可少的组件,它是程序更加灵活,给开发带来更多便捷.将设置置于配置文件中,从而没有必要在每次设置更改时重新编译应用程序。这里使用的toml.

安装组件:

govendor fetch github.com/BurntSushi/toml

组件使用:

创建配置文件

base/app.conf代码如下:

1
2
3
4
5
6
7
8
9
10
[database]
host = "127.0.0.1"
port = 3306
db = "test"
user = "root"
password = "123456"

[log]
path = "./"
file = "log.log"
创建配置文件解析读取代码

base/config/config.go:代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package config

import (
"github.com/BurntSushi/toml"
)

var _cfg MasterConfig

// MasterConfig App主配置
type MasterConfig struct {
Db DbConfig `toml:"database"`
LC LogConfig `toml:"log"`
}

// DbConfig 数据库配置
type DbConfig struct {
Host string `toml:"host"`
Port int `toml:"port"`
Db string `toml:"db"`
User string `toml:"user"`
Password string `toml:"password"`
}

// LogConfig 日志文件配置
type LogConfig struct {
Path string `toml:"path"`
File string `toml:"file"`
}

// Init 初始化配置文件
func Init(cfg string) error {
if _, err := toml.DecodeFile(cfg, &_cfg); err != nil {
return err
}
return nil
}

// GetDbConfig 获取数据库配置
func GetDbConfig() DbConfig {
return _cfg.Db
}

// GetLogConfig 获取日志配置
func GetLogConfig() LogConfig {
return _cfg.LC
}

日志组件

记录程序运行记录,必要的地方都带上日志,可以根据日志来追踪程序的运行状态

安装组件:

govendor fetch github.com/astaxie/beego/logs

组件使用:

创建日志实例化代码

base/log/log.go 代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package log

import (
"base/config"

"github.com/astaxie/beego/logs"
)

var hlog *logs.BeeLogger

// Init 初始化
func Init() error {
hlog = logs.NewLogger(100)
lconf := config.GetLogConfig()
logFile := lconf.Path + lconf.File
return hlog.SetLogger(logs.AdapterFile, `{"filename":"`+logFile+`","level":7,"maxlines":0,"maxsize":0,"daily":true,"maxdays":120, "rotate":false}`)
}

// Log 获取日志句柄
func Log() *logs.BeeLogger {
return hlog
}

数据库组件

操作数据

安装组件:

govendor fetch github.com/gocraft/dbr

组件使用:

创建日志实例化代码

base/db/mysql.go 代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package db

import (
"base/config"
"fmt"

_ "github.com/go-sql-driver/mysql"
"github.com/gocraft/dbr"
)

const DB_DNS = "%s:%s@tcp(%s:%d)/%s?loc=Local&parseTime=true"

var _session *dbr.Session

func Init() error {
//初始化数据连接
cfg := config.GetDbConfig()

dns := fmt.Sprintf(DB_DNS, cfg.User, cfg.Password, cfg.Host, cfg.Port, cfg.Db)
conn, err := dbr.Open("mysql", dns, nil)
if err != nil {
return err
}

_session = conn.NewSession(nil)
_session.SetMaxOpenConns(20)
_session.SetMaxIdleConns(10)

if err = _session.Ping(); err != nil {
return err
}
return nil
}

// GetSession 获取数据库链接会话句柄
func GetSession() *dbr.Session {
return _session
}

实例化组件

组件搭建完成后就是使用组件了,组件都需要再base 中初始化.

base/main.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package main

import (
"base/config"
"base/db"
"base/log"
"flag"
"fmt"
"os"
)

var appConf = flag.String("conf", "app.conf", "server config file")

func init() {
flag.Parse()
// 配置文件初始化
if err := config.Init(*appConf); err != nil {
fmt.Println(err)
os.Exit(0)
}
// 初始化日志组件
if err := log.Init(); err != nil {
fmt.Println(err)
os.Exit(0)
}

// 初始化数据库连接
if err := db.Init(); err != nil {
fmt.Println(err)
os.Exit(0)
}
}

func main() {
// 代码逻辑处理
}