- 一个简易的mvc框架
- 中间件路由用的gin
- 利用反射把网址映射到controller的方法
- 核心代码放在了core包里面,core包里面引用第三方库代码,业务代码只需用core包,从而隔离业务代码与第三方包
- 支持多业务线,每个业务线多个应用,分本地、测试线、正式线三个环境
- 带有.gitlab-ci.yml样例文件,可以结合gitlab runner实现gitlab上的CI/CD流程
goapp
├─ core //核心包
├─ business_1 //业务1文件夹
│ ├─ config
│ │ ├─ config-dev.yaml
│ │ ├─ config-local.yaml
│ │ └─ config-prod.yaml
│ ├─ entrance
│ │ ├─ app_1.go //业务1下的应用1
│ │ ├─ app_2.go //业务1下的应用2
│ │ └─ app_3.go //业务1下的应用3
│ └─ database
│ └─ controller
│ └─ service
│ └─ template
│ └─ app_1.exe // 业务1下的应用1编译后可执行文件,该文件不入代码库git,本地测试可以执行这个
│ └─ app_2.exe // 业务1下的应用2编译后可执行文件,该文件不入代码库git,本地测试可以执行这个
│ └─ app_3.exe // 业务1下的应用3编译后可执行文件,该文件不入代码库git,本地测试可以执行这个
│
├─ business_2 //业务2文件夹
│ ├─ config
│ │ ├─ config-dev.yaml
│ │ ├─ config-local.yaml
│ │ └─ config-prod.yaml
│ ├─ entrance
│ │ ├─ app_1.go //业务2下的应用1
│ │ ├─ app_2.go //业务2下的应用2
│ │ └─ app_3.go //业务2下的应用3
│ └─ database
│ └─ controller
│ └─ service
│ └─ template
│ └─ app_1.exe // 业务2下的应用1编译后可执行文件,该文件不入代码库git,本地测试可以执行这个
│ └─ app_2.exe // 业务2下的应用2编译后可执行文件,该文件不入代码库git,本地测试可以执行这个
│ └─ app_3.exe // 业务2下的应用3编译后可执行文件,该文件不入代码库git,本地测试可以执行这个
├─ .gitignore
├─ .gitlab-ci.yml
├─ go.mod
├─ go.sum
└─ README.md
运行本框架需要搭建一个1.14版本的go环境,编辑器使用建议用goland最新版。搭建步骤如下
1. 按照官网安装golang语言包,并加入环境变量,在命令行输入`go version`能显示出来go版本表示安装完毕
2. 申请本项目的gitlab权限,执行`git clone [email protected]:mingxing/goapp.git`下载下来项目代码
3. 命令行进入项目代码的goapp文件夹,在命令行执行以下四个个命令
4. `go env -w GO111MODULE=on`设置module模式
5. `go env -w GOPROXY=https://goproxy.cn,direct`设置国内包镜像
6. `go env -w GOPRIVATE=gitlab.leju.com`设置私有库
7. 设置git拉取方式为ssh,根据不同操作系统输入命令,windows系统执行`git config --global url."[email protected]:".insteadof "https://gitlab.leju.com/"`,mac系统执行`git config --global [email protected]:.insteadOf https://gitlab.leju.com/`
8. 执行`go mod tidy`拉取代码库中的包
9. 以上流程若能顺利走完,则环境搭建完毕了
- 写好代码后,确定自己的业务名和应用名,业务名取文件夹名字,应用名取入口文件名字,修改.gitlab-ci.yml文件中的BIZ_NAME(业务名)、EXE_NAME(应用名)
- commit并打上标签,标签规则如下:
测试线分支develop,打标签才会执行自动编译、部署,标签必须以ci-dev开头并加上业务、应用名字,例如ci-dev.goodhouse.consume.0.0.1
正式线分支master,打标签才会执行自动编译、部署,标签必须以ci-prod开头并加上业务、应用名字,例如ci-prod.goodhouse.consume.0.0.1
- push之后会自动编译部署,可以去gitlab查看进度
- 以上步骤都没问题之后,需要去cesi重启应用
- 按照demo创建文件夹、文件,写代码
- 按照上面的部署流程去部署
- 需要告知运维该新应用的业务名和应用名,运维会将新应用加到Cesi里面,然后正常开启应用就好了
情况1. 若是该应用不需要对外访问如cron任务等,则到此为止就好了
情况2. 若是该应用需要对外访问但是不用负载均衡,如pprof查看性能,则可以按照如下方式访问:
正式线:https://正式线域名/{IP地址}/{端口}/{URI}
测试线:https://测试线域名/{IP地址}/{端口}/{URI}
情况3. 若是该应用需要对外访问且用负载均衡,需要让运维增加配置nginx:
假如业务是goodhouse应用是web
1.增加upstream
upstream goapp_goodhouse_web {
server 127.0.0.1:9002 ;
server 127.0.0.1:8002 ;
}
2.增加location
location ^~ /goodhouse/web {
if ($request_uri ~* "/goodhouse/web/(.*)") {
set $req $1;
}
proxy_pass http://goapp_goodhouse_web/$req;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
3.配置完之后可以通过以下网址访问
正式线:https://正式线域名/goodhouse/web/{URI}
测试线:https://测试线域名/goodhouse/web/{URI}
代码规范参考https://github.com/xxjwxc/uber_go_guide_cn ,下面做一点补充
- import 分组,按照标准库、其他库、本地包顺序
import (
"crypto/md5"
"fmt"
"time"
"github.com/jinzhu/now"
"github.com/kataras/iris/v12"
"github.com/kataras/iris/v12/mvc"
"github.com/renjingneng/a_simple_go_project/core/config"
"github.com/renjingneng/a_simple_go_project/middleware"
commonService "github.com/renjingneng/a_simple_go_project/service"
service "github.com/renjingneng/a_simple_go_project/service/identify"
)
- 文件注释模板
// @Description 统一json返回、统一错误情况下的模板返回
// @Author renjingneng
// @CreateTime 2020/8/18 10:49
- 方法注释模板
// InitApp 初始化参数apptype、whitelist
//
// @Author renjingneng
//
// @CreateTime 2020/8/15 16:23
func InitApp(ctx iris.Context) {
path := ctx.Path()
pathSlice := strings.Split(path, "/")
apptype := pathSlice[1]
whitelist := config.GetMap(utility.ToCamel(apptype)+"Whitelist")
ctx.Values().Set("apptype", apptype)
ctx.Values().Set("whitelist", whitelist)
ctx.Next()
}