Commit 252ca9a0bc479c21efb6acfa23c8bef61a28904e
1 parent
3f0a1991
解释目录结构
Showing
5 changed files
with
109 additions
and
60 deletions
Show diff stats
No preview for this file type
README.md
| @@ -18,6 +18,33 @@ | @@ -18,6 +18,33 @@ | ||
| 18 | * proto + models 查询 | 18 | * proto + models 查询 |
| 19 | * redis | 19 | * redis |
| 20 | 20 | ||
| 21 | +## 目录结构 | ||
| 22 | +```text | ||
| 23 | +. | ||
| 24 | +├── bin | ||
| 25 | +├── cmd //入口文件 | ||
| 26 | +├── conf //配置文件 | ||
| 27 | +├── csvdata //csv的golang struct | ||
| 28 | +├── doc //文档 | ||
| 29 | +├── docker //docker部署 | ||
| 30 | +├── protos | ||
| 31 | +│ ├── doc //协议文档 | ||
| 32 | +│ └── pb //生成的pb.go文件 | ||
| 33 | +├── src //逻辑目录 | ||
| 34 | +│ ├── actions //逻辑处理 | ||
| 35 | +│ ├── common | ||
| 36 | +│ ├── components //组件 | ||
| 37 | +│ │ ├── db | ||
| 38 | +│ │ ├── etcd | ||
| 39 | +│ │ ├── jwt | ||
| 40 | +│ │ ├── logger | ||
| 41 | +│ │ └── net //网络组件(http + tcp) | ||
| 42 | +│ ├── models //数据模型 | ||
| 43 | +│ ├── plugin //逻辑热更的插件 | ||
| 44 | +│ └── utils //通用函数 | ||
| 45 | +├── test //测试 | ||
| 46 | +├── tools //工具(proto自动生成协议号,csv自动生成struct) | ||
| 47 | +``` | ||
| 21 | 48 | ||
| 22 | ## 环境安装 | 49 | ## 环境安装 |
| 23 | protoc-go-inject-tag: 目的是往protos文件中打入自定义标签 | 50 | protoc-go-inject-tag: 目的是往protos文件中打入自定义标签 |
| @@ -34,6 +61,7 @@ $ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc | @@ -34,6 +61,7 @@ $ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc | ||
| 34 | ``` | 61 | ``` |
| 35 | ## 文档 | 62 | ## 文档 |
| 36 | [证书制作](doc/cret.md) | 63 | [证书制作](doc/cret.md) |
| 64 | +[包组成结构](doc/proto.md) | ||
| 37 | 65 | ||
| 38 | 66 | ||
| 39 | ## Usage | 67 | ## Usage |
cmd/http.go
| @@ -6,6 +6,7 @@ import ( | @@ -6,6 +6,7 @@ import ( | ||
| 6 | _ "pro2d/conf" | 6 | _ "pro2d/conf" |
| 7 | "pro2d/src/actions" | 7 | "pro2d/src/actions" |
| 8 | "pro2d/src/components/logger" | 8 | "pro2d/src/components/logger" |
| 9 | + "pro2d/src/components/net" | ||
| 9 | "syscall" | 10 | "syscall" |
| 10 | ) | 11 | ) |
| 11 | 12 | ||
| @@ -14,7 +15,8 @@ func main() { | @@ -14,7 +15,8 @@ func main() { | ||
| 14 | stopChan := make(chan os.Signal) | 15 | stopChan := make(chan os.Signal) |
| 15 | signal.Notify(stopChan, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL) | 16 | signal.Notify(stopChan, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL) |
| 16 | 17 | ||
| 17 | - web := actions.NewHttpAction("v1") | 18 | + web := net.NewHttpServer("v1") |
| 19 | + web.BindHandler(&actions.HttpAction{HttpServer: web}) | ||
| 18 | go func() { | 20 | go func() { |
| 19 | err <- web.Start() | 21 | err <- web.Start() |
| 20 | }() | 22 | }() |
src/actions/HttpAction.go
| 1 | package actions | 1 | package actions |
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | - "fmt" | ||
| 5 | "github.com/gin-gonic/gin" | 4 | "github.com/gin-gonic/gin" |
| 6 | "net/http" | 5 | "net/http" |
| 7 | "pro2d/conf" | 6 | "pro2d/conf" |
| 8 | "pro2d/protos/pb" | 7 | "pro2d/protos/pb" |
| 9 | - "pro2d/src/components/db" | ||
| 10 | - "pro2d/src/components/etcd" | 8 | + "pro2d/src/components/net" |
| 11 | "pro2d/src/models" | 9 | "pro2d/src/models" |
| 12 | "pro2d/src/utils" | 10 | "pro2d/src/utils" |
| 13 | - "reflect" | ||
| 14 | - "strings" | ||
| 15 | ) | 11 | ) |
| 16 | 12 | ||
| 17 | type HttpAction struct { | 13 | type HttpAction struct { |
| 18 | - version string | ||
| 19 | - port []string | ||
| 20 | - EtcdClient *etcd.EtcdClient | 14 | + HttpServer *net.HttpServer |
| 21 | } | 15 | } |
| 22 | 16 | ||
| 23 | -func NewHttpAction(version string, port ...string) *HttpAction { | ||
| 24 | - return &HttpAction{version: version, port: port} | ||
| 25 | -} | ||
| 26 | - | ||
| 27 | -func Pong (c *gin.Context) { | ||
| 28 | - c.JSON(200, gin.H{ | ||
| 29 | - "message": "pong", | ||
| 30 | - }) | ||
| 31 | -} | ||
| 32 | - | ||
| 33 | -func HandlerFuncObj(tvl, obj reflect.Value) gin.HandlerFunc { | ||
| 34 | - apiFun := func(c *gin.Context) interface{} { return c } | ||
| 35 | - return func(c *gin.Context) { | ||
| 36 | - tvl.Call([]reflect.Value{obj, reflect.ValueOf(apiFun(c))}) | ||
| 37 | - } | ||
| 38 | -} | ||
| 39 | - | ||
| 40 | -func GetRoutePath(objName, objFunc string) string { | ||
| 41 | - return strings.ToLower(objName + "/" + objFunc) | ||
| 42 | -} | ||
| 43 | 17 | ||
| 44 | func PubRsp(c *gin.Context, code int, data interface{}) { | 18 | func PubRsp(c *gin.Context, code int, data interface{}) { |
| 45 | c.JSON(http.StatusOK, gin.H{"code": code, "data": data}) | 19 | c.JSON(http.StatusOK, gin.H{"code": code, "data": data}) |
| @@ -86,7 +60,7 @@ func (h *HttpAction) Login(c *gin.Context) { | @@ -86,7 +60,7 @@ func (h *HttpAction) Login(c *gin.Context) { | ||
| 86 | } | 60 | } |
| 87 | 61 | ||
| 88 | var gs []*pb.ServiceInfo | 62 | var gs []*pb.ServiceInfo |
| 89 | - for k, v := range h.EtcdClient.GetByPrefix(conf.GlobalConf.GameConf.Name) { | 63 | + for k, v := range h.HttpServer.EtcdClient.GetByPrefix(conf.GlobalConf.GameConf.Name) { |
| 90 | gs = append(gs, &pb.ServiceInfo{ | 64 | gs = append(gs, &pb.ServiceInfo{ |
| 91 | Id: k, | 65 | Id: k, |
| 92 | Name: conf.GlobalConf.GameConf.Name, | 66 | Name: conf.GlobalConf.GameConf.Name, |
| @@ -99,33 +73,3 @@ func (h *HttpAction) Login(c *gin.Context) { | @@ -99,33 +73,3 @@ func (h *HttpAction) Login(c *gin.Context) { | ||
| 99 | } | 73 | } |
| 100 | PubRsp(c, 0, rsp) | 74 | PubRsp(c, 0, rsp) |
| 101 | } | 75 | } |
| 102 | - | ||
| 103 | -func (h *HttpAction) Start() error { | ||
| 104 | - //mongo 初始化 | ||
| 105 | - db.MongoDatabase = db.MongoClient.Database(conf.GlobalConf.AccountConf.DBName) | ||
| 106 | - models.InitAccountServerModels() | ||
| 107 | - | ||
| 108 | - //Etcd 初始化 | ||
| 109 | - var err error | ||
| 110 | - h.EtcdClient, err = etcd.NewEtcdClient(conf.GlobalConf.Etcd) | ||
| 111 | - if err != nil { | ||
| 112 | - return err | ||
| 113 | - } | ||
| 114 | - h.EtcdClient.PutWithLeasePrefix(conf.GlobalConf.AccountConf.Name, conf.GlobalConf.AccountConf.ID, fmt.Sprintf("%s:%d", conf.GlobalConf.AccountConf.IP, conf.GlobalConf.AccountConf.Port), 5) | ||
| 115 | - | ||
| 116 | - //gin初始化 | ||
| 117 | - r := gin.Default() | ||
| 118 | - r.GET("/ping", Pong) | ||
| 119 | - typ := reflect.TypeOf(h) | ||
| 120 | - val := reflect.ValueOf(h) | ||
| 121 | - //t := reflect.Indirect(val).Type() | ||
| 122 | - //objectName := t.Name() | ||
| 123 | - | ||
| 124 | - numOfMethod := val.NumMethod() | ||
| 125 | - for i := 0; i < numOfMethod; i++ { | ||
| 126 | - method := typ.Method(i) | ||
| 127 | - r.GET(GetRoutePath(h.version, method.Name), HandlerFuncObj(method.Func, val)) | ||
| 128 | - r.POST(GetRoutePath(h.version, method.Name), HandlerFuncObj(method.Func, val)) | ||
| 129 | - } | ||
| 130 | - return r.Run(h.port...) // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080") | ||
| 131 | -} | ||
| 132 | \ No newline at end of file | 76 | \ No newline at end of file |
| @@ -0,0 +1,75 @@ | @@ -0,0 +1,75 @@ | ||
| 1 | +package net | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "github.com/gin-gonic/gin" | ||
| 6 | + "pro2d/conf" | ||
| 7 | + "pro2d/src/components/db" | ||
| 8 | + "pro2d/src/components/etcd" | ||
| 9 | + "pro2d/src/models" | ||
| 10 | + "reflect" | ||
| 11 | + "strings" | ||
| 12 | +) | ||
| 13 | + | ||
| 14 | +type HttpServer struct { | ||
| 15 | + version string | ||
| 16 | + port []string | ||
| 17 | + EtcdClient *etcd.EtcdClient | ||
| 18 | + | ||
| 19 | + Handler interface{} | ||
| 20 | +} | ||
| 21 | + | ||
| 22 | +func Pong (c *gin.Context) { | ||
| 23 | + c.JSON(200, gin.H{ | ||
| 24 | + "message": "pong", | ||
| 25 | + }) | ||
| 26 | +} | ||
| 27 | + | ||
| 28 | +func NewHttpServer(version string, port ...string) *HttpServer { | ||
| 29 | + return &HttpServer{version: version, port: port} | ||
| 30 | +} | ||
| 31 | + | ||
| 32 | +func (h *HttpServer)HandlerFuncObj(tvl, obj reflect.Value) gin.HandlerFunc { | ||
| 33 | + return func(c *gin.Context) { | ||
| 34 | + v := tvl.Call([]reflect.Value{obj, reflect.ValueOf(c)}) | ||
| 35 | + fmt.Printf("v : %v\n", v) | ||
| 36 | + } | ||
| 37 | +} | ||
| 38 | + | ||
| 39 | +func GetRoutePath(objName, objFunc string) string { | ||
| 40 | + return strings.ToLower(objName + "/" + objFunc) | ||
| 41 | +} | ||
| 42 | + | ||
| 43 | +func (h *HttpServer) BindHandler(handler interface{}) { | ||
| 44 | + h.Handler = handler | ||
| 45 | +} | ||
| 46 | + | ||
| 47 | +func (h *HttpServer) Start() error { | ||
| 48 | + //mongo 初始化 | ||
| 49 | + db.MongoDatabase = db.MongoClient.Database(conf.GlobalConf.AccountConf.DBName) | ||
| 50 | + models.InitAccountServerModels() | ||
| 51 | + | ||
| 52 | + //Etcd 初始化 | ||
| 53 | + var err error | ||
| 54 | + h.EtcdClient, err = etcd.NewEtcdClient(conf.GlobalConf.Etcd) | ||
| 55 | + if err != nil { | ||
| 56 | + return err | ||
| 57 | + } | ||
| 58 | + h.EtcdClient.PutWithLeasePrefix(conf.GlobalConf.AccountConf.Name, conf.GlobalConf.AccountConf.ID, fmt.Sprintf("%s:%d", conf.GlobalConf.AccountConf.IP, conf.GlobalConf.AccountConf.Port), 5) | ||
| 59 | + | ||
| 60 | + //gin初始化 | ||
| 61 | + r := gin.Default() | ||
| 62 | + r.GET("/ping", Pong) | ||
| 63 | + typ := reflect.TypeOf(h.Handler) | ||
| 64 | + val := reflect.ValueOf(h.Handler) | ||
| 65 | + //t := reflect.Indirect(val).Type() | ||
| 66 | + //objectName := t.Name() | ||
| 67 | + | ||
| 68 | + numOfMethod := val.NumMethod() | ||
| 69 | + for i := 0; i < numOfMethod; i++ { | ||
| 70 | + method := typ.Method(i) | ||
| 71 | + r.GET(GetRoutePath(h.version, method.Name), h.HandlerFuncObj(method.Func, val)) | ||
| 72 | + r.POST(GetRoutePath(h.version, method.Name), h.HandlerFuncObj(method.Func, val)) | ||
| 73 | + } | ||
| 74 | + return r.Run(h.port...) // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080") | ||
| 75 | +} | ||
| 0 | \ No newline at end of file | 76 | \ No newline at end of file |