go-zero 单体服务

go-zero

go-zero 简介

go-zero是一个能够快速生成 API,MODEL 和 RPC 的框架。

go-zero 项目结构(不含 RPC)

 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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
.
├── api
│   ├── etc
│   │   └── park-api.yaml
│   ├── internal
│   │   ├── config
│   │   │   └── config.go
│   │   ├── handler
│   │   │   ├── accessHandler.go
│   │   │   ├── deviceInfoHandler.go
│   │   │   ├── incomeHandler.go
│   │   │   ├── parkingLotHandler.go
│   │   │   ├── routes.go
│   │   │   ├── siteInfoHandler.go
│   │   │   ├── touristCarProvinceHandler.go
│   │   │   ├── touristFlowHandler.go
│   │   │   ├── userHandler.go
│   │   │   └── wechatHandler.go
│   │   ├── logic
│   │   │   ├── accessLogic.go
│   │   │   ├── deviceInfoLogic.go
│   │   │   ├── incomeLogic.go
│   │   │   ├── parkingLotLogic.go
│   │   │   ├── siteInfoLogic.go
│   │   │   ├── touristCarProvinceLogic.go
│   │   │   ├── touristFlowLogic.go
│   │   │   ├── userLogic.go
│   │   │   └── wechatLogic.go
│   │   ├── svc
│   │   │   └── serviceContext.go
│   │   └── types
│   │       └── types.go
│   ├── park.api
│   ├── park.go
│   └── park.md
├── genModel
│   ├── model
│   │   ├── accessModel.go
│   │   ├── accessModel_gen.go
│   │   ├── deviceInfoModel.go
│   │   ├── deviceInfoModel_gen.go
│   │   ├── incomeModel.go
│   │   ├── incomeModel_gen.go
│   │   ├── logErrModel.go
│   │   ├── logErrModel_gen.go
│   │   ├── parkingLotModel.go
│   │   ├── parkingLotModel_gen.go
│   │   ├── siteInfoModel.go
│   │   ├── siteInfoModel_gen.go
│   │   ├── touristCarProvinceModel.go
│   │   ├── touristCarProvinceModel_gen.go
│   │   ├── touristFlowModel.go
│   │   ├── touristFlowModel_gen.go
│   │   ├── userModel.go
│   │   ├── userModel_gen.go
│   │   ├── vars.go
│   │   ├── wechatModel.go
│   │   └── wechatModel_gen.go
│   └── resources
│       ├── genModel.sh
│       └── park.sql
├── go.mod
├── go.sum
└── model
    ├── accessModel.go
    ├── accessModel_gen.go
    ├── deviceInfoModel.go
    ├── deviceInfoModel_gen.go
    ├── incomeModel.go
    ├── incomeModel_gen.go
    ├── logErrModel.go
    ├── logErrModel_gen.go
    ├── parkingLotModel.go
    ├── parkingLotModel_gen.go
    ├── siteInfoModel.go
    ├── siteInfoModel_gen.go
    ├── touristCarProvinceModel.go
    ├── touristCarProvinceModel_gen.go
    ├── touristFlowModel.go
    ├── touristFlowModel_gen.go
    ├── userModel.go
    ├── userModel_gen.go
    ├── vars.go
    ├── wechatModel.go
    └── wechatModel_gen.go
  • api 文件夹用于存放外部调用,需要改动的是 *.api, etc/*.yaml, svc/serviceContext.go, logic/*,作用分别是生成 api 调用框架,写配置文件,将数据添加到 Context 供逻辑调用,逻辑实现。
  • genModel 文件夹用于生成数据库调用相关实现,需要改动的是resources/*.sql
  • model 文件夹用于添加额外的数据库调用逻辑(将genModel/model/*复制到 model 后开改!)

简单使用

通过 goctl 生成代码框架。

API 框架通过 api/*.api生成

  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
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
//park.api
syntax = "v1"
info(
	title: "parkApi"
	desc: "parkBackEnd"
	author: "loomt"
	email: "loomt_@outlook.com"
	version: "1.0"
)

type (
	accessResp {
		Id       int64  `json:"id"`
		Location string `json:"location"` // 接入地点
		Date     string `json:"date"`     // 接入日期
		Num      int64  `json:"num"`      // 接入数量
	}
	incomeResp {
		Id   int64  `json:"id"`
		Type string `json:"type"` // 收入类型
		Date string `json:"date"` // 日期
		Num  int64  `json:"num"`  // 当天收入
	}
	parkingLotResp {
		Id       int64  `json:"id"`
		Name     string `json:"name"`     // 停车场名字
		Duration int64  `json:"duration"` // 停车时间(小时)
		Num      int64  `json:"num"`      // 泊车数
	}
	siteInfoResp {
		Id           int64  `json:"id"`
		Date         string `json:"date"`          // 日期
		RevisitRate  int64  `json:"revisit_rate"`  // 重复访问率(%)
		SiteHealth   int64  `json:"site_health"`   // 站点健康度
		RfHealth     int64  `json:"rf_health"`     // 射频健康度
		DeviceHealth int64  `json:"device_health"` // 设备健康度
		Flow         int64  `json:"flow"`          // 当日站点流量
	}
	touristFlowResp {
		Id       int64  `json:"id"`
		Location string `json:"location"` // 园区地点
		Date     string `json:"date"`     // 时间
		Num      int64  `json:"num"`      // 游客数量
	}
	touristCarProvinceResp {
		Id       int64  `json:"id"`
		Province string `json:"province"` // 省份
		Date     string `json:"date"`     // 日期
		FlowNum  int64  `json:"flow_num"` // 人流数量
		CarNum   int64  `json:"car_num"`  // 车辆数
	}
	userReq {
		Id int64 `json:"id"` // 用户 id
	}
	userResp {
		Id       int64  `json:"id"`       // 用户 id
		Username string `json:"username"` // 用户名
	}
	wechatResp {
		Date string `json:"date"` // 日期
		Num  int64  `json:"num"`  // 微信关注数量
	}
	deviceInfoResp {
		Id           int64   `json:"id"`
		UplinkRate   float64 `json:"uplink_rate"`   // 上行速率
		DownlinkRate float64 `json:"downlink_rate"` // 下载速率
		Flow         float64 `json:"flow"`          // 流量
		CpuRate      float64 `json:"cpu_rate"`      // CPU 占有率
		Longitude    float64 `json:"longitude"`     // 经度
		Latitude     float64 `json:"latitude"`      // 纬度
	}
)

@server(
	prefix: api
)

service park-api {
	@doc "获取接入详情"
	@handler accessHandler
	get /access returns (accessResp)
	
	@doc "获取日收入详情"
	@handler incomeHandler
	get /income returns (incomeResp)
	
	@doc "获取停车详情"
	@handler parkingLotHandler
	get /parkingLot returns (parkingLotResp)
	
	@doc "获取站点详情"
	@handler siteInfoHandler
	get /siteInfo returns (siteInfoResp)
	
	@doc "获取客流量详情"
	@handler touristFlowHandler
	get /touristFlow returns (touristFlowResp)
	
	@doc "获取游客与车辆来源省份"
	@handler touristCarProvinceHandler
	get /touristCarProvince returns (touristCarProvinceResp)
	
	@doc "获取用户详情"
	@handler userHandler
	post /user (userReq) returns (userResp)
	
	@doc "获取微信关注详情"
	@handler wechatHandler
	get /wechat returns (wechatResp)
	
	@doc "获取设备信息"
	@handler deviceInfoHandler
	get /deviceInfo returns (deviceInfoResp)
}
1
2
# api
goctl api go -api *.api -dir ./  --style=goZero

MODEL 框架有两种生成方式

  • 连接数据库生成 model
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/env zsh
# 使用方法:
# ./genModel.sh usercenter user
# ./genModel.sh usercenter user_auth
# 再将./genModel下的文件剪切到对应服务的model目录里面,记得改package

#生成的表名
tables=$2
#表生成的genmodel目录
modeldir=../model

# 数据库配置
host=127.0.0.1
port=3306
dbname=$1
username=root
passwd=123456

echo "开始创建库:$dbname 的表:$2"
goctl model mysql datasource -url="${username}:${passwd}@tcp(${host}:${port})/${dbname}" -table="${tables}" -dir="${modeldir}" --style=goZero
  • 直接用 sql 文件 (genModel/resource/*.sql) 生成 model
1
2
# genModel/resources
goctl model mysql ddl -src="./*.sql" -dir="../model" --style=goZero

生成文档

1
2
# ./
goctl api doc -dir .

华为云部署

  1. mysql 导入
  2. nohup go run *.go -f etc/*.yaml 2>&1 &
updatedupdated2024-06-122024-06-12