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 | 18 | * proto + models 查询 |
19 | 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 | 50 | protoc-go-inject-tag: 目的是往protos文件中打入自定义标签 |
... | ... | @@ -34,6 +61,7 @@ $ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc |
34 | 61 | ``` |
35 | 62 | ## 文档 |
36 | 63 | [证书制作](doc/cret.md) |
64 | +[包组成结构](doc/proto.md) | |
37 | 65 | |
38 | 66 | |
39 | 67 | ## Usage | ... | ... |
cmd/http.go
... | ... | @@ -6,6 +6,7 @@ import ( |
6 | 6 | _ "pro2d/conf" |
7 | 7 | "pro2d/src/actions" |
8 | 8 | "pro2d/src/components/logger" |
9 | + "pro2d/src/components/net" | |
9 | 10 | "syscall" |
10 | 11 | ) |
11 | 12 | |
... | ... | @@ -14,7 +15,8 @@ func main() { |
14 | 15 | stopChan := make(chan os.Signal) |
15 | 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 | 20 | go func() { |
19 | 21 | err <- web.Start() |
20 | 22 | }() | ... | ... |
src/actions/HttpAction.go
1 | 1 | package actions |
2 | 2 | |
3 | 3 | import ( |
4 | - "fmt" | |
5 | 4 | "github.com/gin-gonic/gin" |
6 | 5 | "net/http" |
7 | 6 | "pro2d/conf" |
8 | 7 | "pro2d/protos/pb" |
9 | - "pro2d/src/components/db" | |
10 | - "pro2d/src/components/etcd" | |
8 | + "pro2d/src/components/net" | |
11 | 9 | "pro2d/src/models" |
12 | 10 | "pro2d/src/utils" |
13 | - "reflect" | |
14 | - "strings" | |
15 | 11 | ) |
16 | 12 | |
17 | 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 | 18 | func PubRsp(c *gin.Context, code int, data interface{}) { |
45 | 19 | c.JSON(http.StatusOK, gin.H{"code": code, "data": data}) |
... | ... | @@ -86,7 +60,7 @@ func (h *HttpAction) Login(c *gin.Context) { |
86 | 60 | } |
87 | 61 | |
88 | 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 | 64 | gs = append(gs, &pb.ServiceInfo{ |
91 | 65 | Id: k, |
92 | 66 | Name: conf.GlobalConf.GameConf.Name, |
... | ... | @@ -99,33 +73,3 @@ func (h *HttpAction) Login(c *gin.Context) { |
99 | 73 | } |
100 | 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 | 76 | \ No newline at end of file | ... | ... |
... | ... | @@ -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 | 76 | \ No newline at end of file | ... | ... |