123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455 |
- package main
- const (
- _tplAppToml = `
- # This is a TOML document. Boom
- `
- _tplMySQLToml = `
- [demo]
- addr = "127.0.0.1:3306"
- dsn = "{user}:{password}@tcp(127.0.0.1:3306)/{database}?timeout=1s&readTimeout=1s&writeTimeout=1s&parseTime=true&loc=Local&charset=utf8mb4,utf8"
- readDSN = ["{user}:{password}@tcp(127.0.0.2:3306)/{database}?timeout=1s&readTimeout=1s&writeTimeout=1s&parseTime=true&loc=Local&charset=utf8mb4,utf8","{user}:{password}@tcp(127.0.0.3:3306)/{database}?timeout=1s&readTimeout=1s&writeTimeout=1s&parseTime=true&loc=Local&charset=utf8,utf8mb4"]
- active = 20
- idle = 10
- idleTimeout ="4h"
- queryTimeout = "200ms"
- execTimeout = "300ms"
- tranTimeout = "400ms"
- `
- _tplMCToml = `
- demoExpire = "24h"
- [demo]
- name = "{{.Name}}"
- proto = "tcp"
- addr = "127.0.0.1:11211"
- active = 50
- idle = 10
- dialTimeout = "100ms"
- readTimeout = "200ms"
- writeTimeout = "300ms"
- idleTimeout = "80s"
- `
- _tplRedisToml = `
- demoExpire = "24h"
- [demo]
- name = "{{.Name}}"
- proto = "tcp"
- addr = "127.0.0.1:6389"
- idle = 10
- active = 10
- dialTimeout = "1s"
- readTimeout = "1s"
- writeTimeout = "1s"
- idleTimeout = "10s"
- `
- _tplHTTPToml = `
- [server]
- addr = "0.0.0.0:8000"
- timeout = "1s"
- `
- _tplGRPCToml = `
- [server]
- addr = "0.0.0.0:9000"
- timeout = "1s"
- `
- _tplChangeLog = `### v1.0.0
- 1. 上线功能xxx
- `
- _tplMain = `package main
- import (
- "context"
- "flag"
- "os"
- "os/signal"
- "syscall"
- "time"
- "go-common/app/{{.Type}}/{{.Department}}/{{.Name}}/internal/server/grpc"
- "go-common/app/{{.Type}}/{{.Department}}/{{.Name}}/internal/server/http"
- "go-common/app/{{.Type}}/{{.Department}}/{{.Name}}/internal/service"
- "go-common/library/conf/paladin"
- ecode "go-common/library/ecode/tip"
- "go-common/library/log"
- )
- func main() {
- flag.Parse()
- if err := paladin.Init(); err != nil {
- panic(err)
- }
- log.Init(nil) // debug flag: log.dir={path}
- defer log.Close()
- log.Info("{{.Name}}-{{.Type}} start")
- ecode.Init(nil)
- svc := service.New()
- grpcSrv := grpc.New(svc)
- httpSrv := http.New(svc)
- c := make(chan os.Signal, 1)
- signal.Notify(c, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
- for {
- s := <-c
- log.Info("get a signal %s", s.String())
- switch s {
- case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT:
- ctx, _ := context.WithTimeout(context.Background(), 35*time.Second)
- grpcSrv.Shutdown(ctx)
- httpSrv.Shutdown(ctx)
- log.Info("{{.Name}}-{{.Type}} exit")
- svc.Close()
- time.Sleep(time.Second)
- return
- case syscall.SIGHUP:
- default:
- return
- }
- }
- }
- `
- _tplContributors = `# Owner
- {{.Owner}}
- # Author
- # Reviewer
- `
- _tplDao = `package dao
- import (
- "context"
- "time"
- "go-common/library/cache/memcache"
- "go-common/library/cache/redis"
- "go-common/library/conf/paladin"
- "go-common/library/database/sql"
- "go-common/library/log"
- xtime "go-common/library/time"
- )
- // Dao dao.
- type Dao struct {
- db *sql.DB
- redis *redis.Pool
- redisExpire int32
- mc *memcache.Pool
- mcExpire int32
- }
- func checkErr(err error) {
- if err != nil {
- panic(err)
- }
- }
- // New new a dao and return.
- func New() (dao *Dao) {
- var (
- dc struct {
- Demo *sql.Config
- }
- rc struct {
- Demo *redis.Config
- DemoExpire xtime.Duration
- }
- mc struct {
- Demo *memcache.Config
- DemoExpire xtime.Duration
- }
- )
- checkErr(paladin.Get("mysql.toml").UnmarshalTOML(&dc))
- checkErr(paladin.Get("redis.toml").UnmarshalTOML(&rc))
- checkErr(paladin.Get("memcache.toml").UnmarshalTOML(&mc))
- dao = &Dao{
- // mysql
- db: sql.NewMySQL(dc.Demo),
- // redis
- redis: redis.NewPool(rc.Demo),
- redisExpire: int32(time.Duration(rc.DemoExpire) / time.Second),
- // memcache
- mc: memcache.NewPool(mc.Demo),
- mcExpire: int32(time.Duration(mc.DemoExpire) / time.Second),
- }
- return
- }
- // Close close the resource.
- func (d *Dao) Close() {
- d.mc.Close()
- d.redis.Close()
- d.db.Close()
- }
- // Ping ping the resource.
- func (d *Dao) Ping(ctx context.Context) (err error) {
- if err = d.pingMC(ctx); err != nil {
- return
- }
- if err = d.pingRedis(ctx); err != nil {
- return
- }
- return d.db.Ping(ctx)
- }
- func (d *Dao) pingMC(ctx context.Context) (err error) {
- conn := d.mc.Get(ctx)
- defer conn.Close()
- if err = conn.Set(&memcache.Item{Key: "ping", Value: []byte("pong"), Expiration: 0}); err != nil {
- log.Error("conn.Set(PING) error(%v)", err)
- }
- return
- }
- func (d *Dao) pingRedis(ctx context.Context) (err error) {
- conn := d.redis.Get(ctx)
- defer conn.Close()
- if _, err = conn.Do("SET", "ping", "pong"); err != nil {
- log.Error("conn.Set(PING) error(%v)", err)
- }
- return
- }
- `
- _tplReadme = `# {{.Name}}-{{.Type}}
- ## 项目简介
- 1.
- ## 编译环境
- ## 依赖包
- ## 编译执行
- `
- _tplService = `package service
- import (
- "context"
- "go-common/app/{{.Type}}/{{.Department}}/{{.Name}}/internal/dao"
- "go-common/library/conf/paladin"
- )
- // Service service.
- type Service struct {
- ac *paladin.Map
- dao *dao.Dao
- }
- // New new a service and return.
- func New() (s *Service) {
- var ac = new(paladin.TOML)
- if err := paladin.Watch("application.toml", ac); err != nil {
- panic(err)
- }
- s = &Service{
- ac: ac,
- dao: dao.New(),
- }
- return s
- }
- // Ping ping the resource.
- func (s *Service) Ping(ctx context.Context) (err error) {
- return s.dao.Ping(ctx)
- }
- // Close close the resource.
- func (s *Service) Close() {
- s.dao.Close()
- }
- `
- _tplGPRCService = `package service
- import (
- "context"
- "fmt"
- pb "go-common/app/{{.Type}}/{{.Department}}/{{.Name}}/api"
- "go-common/app/{{.Type}}/{{.Department}}/{{.Name}}/internal/dao"
- "go-common/library/conf/paladin"
- "github.com/golang/protobuf/ptypes/empty"
- )
- // Service service.
- type Service struct {
- ac *paladin.Map
- dao *dao.Dao
- }
- // New new a service and return.
- func New() (s *Service) {
- var ac = new(paladin.TOML)
- if err := paladin.Watch("application.toml", ac); err != nil {
- panic(err)
- }
- s = &Service{
- ac: ac,
- dao: dao.New(),
- }
- return s
- }
- // SayHello grpc demo func.
- func (s *Service) SayHello(ctx context.Context, req *pb.HelloReq) (reply *empty.Empty, err error) {
- reply = new(empty.Empty)
- fmt.Printf("hello %s", req.Name)
- return
- }
- // Ping ping the resource.
- func (s *Service) Ping(ctx context.Context) (err error) {
- return s.dao.Ping(ctx)
- }
- // Close close the resource.
- func (s *Service) Close() {
- s.dao.Close()
- }
- `
- _tplHTTPServer = `package http
- import (
- "net/http"
- "go-common/app/{{.Type}}/{{.Department}}/{{.Name}}/internal/service"
- "go-common/library/conf/paladin"
- "go-common/library/log"
- bm "go-common/library/net/http/blademaster"
- "go-common/library/net/http/blademaster/middleware/verify"
- )
- var (
- svc *service.Service
- )
- // New new a bm server.
- func New(s *service.Service) (engine *bm.Engine) {
- var(
- hc struct {
- Server *bm.ServerConfig
- }
- )
- if err := paladin.Get("http.toml").UnmarshalTOML(&hc); err != nil {
- if err != paladin.ErrNotExist {
- panic(err)
- }
- }
- svc = s
- engine = bm.DefaultServer(hc.Server)
- initRouter(engine, verify.New(nil))
- if err := engine.Start(); err != nil {
- panic(err)
- }
- return
- }
- func initRouter(e *bm.Engine, v *verify.Verify) {
- e.Ping(ping)
- e.Register(register)
- g := e.Group("/x/{{.Name}}")
- {
- g.GET("/start", v.Verify, howToStart)
- }
- }
- func ping(ctx *bm.Context) {
- if err := svc.Ping(ctx); err != nil {
- log.Error("ping error(%v)", err)
- ctx.AbortWithStatus(http.StatusServiceUnavailable)
- }
- }
- func register(c *bm.Context) {
- c.JSON(map[string]interface{}{}, nil)
- }
- // example for http request handler.
- func howToStart(c *bm.Context) {
- c.String(0, "Golang 大法好 !!!")
- }
- `
- _tplAPIProto = `// 定义项目 API 的 proto 文件 可以同时描述 gRPC 和 HTTP API
- // protobuf 文件参考:
- // - https://developers.google.com/protocol-buffers/
- // - http://info.bilibili.co/display/documentation/gRPC+Proto
- // protobuf 生成 HTTP 工具:
- // - http://git.bilibili.co/platform/go-common/tree/master/app/tool/protoc-gen-bm
- // gRPC Golang Model:
- // - http://info.bilibili.co/display/documentation/gRPC+Golang+Model
- // gRPC Golang Warden Gen:
- // - http://info.bilibili.co/display/documentation/gRPC+Golang+Warden+Gen
- // gRPC http 调试工具(无需pb文件):
- // - http://info.bilibili.co/pages/viewpage.action?pageId=12877366
- // grpc 命令行调试工具(无需pb文件):
- // - http://info.bilibili.co/pages/viewpage.action?pageId=11869411
- syntax = "proto3";
- import "github.com/gogo/protobuf/gogoproto/gogo.proto";
- import "google/protobuf/empty.proto";
- // package 命名使用 {discovery_id}.{version} 的方式, version 形如 v1, v2, v1beta ..
- // NOTE: 不知道的 discovery_id 请询问大佬, 新项目找大佬申请 discovery_id,先到先得抢注
- // e.g. account.service.v1
- package demo.service.v1;
- // NOTE: 最后请删除这些无用的注释 (゜-゜)つロ
- option go_package = "api";
- // do not generate getXXX() method
- option (gogoproto.goproto_getters_all) = false;
- service Demo {
- rpc SayHello (HelloReq) returns (.google.protobuf.Empty);
- }
- message HelloReq {
- string name = 1 [(gogoproto.moretags)='form:"name" validate:"required"'];
- }
- `
- _tplAPIGenerate = `package api
- // 生成 gRPC 代码
- //go:generate $GOPATH/src/go-common/app/tool/warden/protoc.sh
- `
- _tplModel = `package model
- `
- _tplGRPCServer = `package grpc
- import (
- pb "go-common/app/{{.Type}}/{{.Department}}/{{.Name}}/api"
- "go-common/app/{{.Type}}/{{.Department}}/{{.Name}}/internal/service"
- "go-common/library/net/rpc/warden"
- "go-common/library/conf/paladin"
- )
- // New new a grpc server.
- func New(svc *service.Service) *warden.Server {
- var rc struct {
- Server *warden.ServerConfig
- }
- if err := paladin.Get("grpc.toml").UnmarshalTOML(&rc); err != nil {
- if err != paladin.ErrNotExist {
- panic(err)
- }
- }
- ws := warden.NewServer(rc.Server)
- pb.RegisterDemoServer(ws.Server(), svc)
- ws, err := ws.Start()
- if err != nil {
- panic(err)
- }
- return ws
- }
- `
- )
|