-
Notifications
You must be signed in to change notification settings - Fork 4
/
server.go
102 lines (91 loc) · 2.79 KB
/
server.go
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
package admin
import (
// "encoding/json"
"github.com/julienschmidt/httprouter"
"io"
"medis/datasource"
"medis/logger"
"medis/mysql"
"medis/shard"
"net/http"
"os"
"strconv"
)
type AdminServer struct {
tplDir string
selector *shard.Selector
groups map[string]*datasource.Group
}
var Server *AdminServer
func (self *AdminServer) Groups(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
w.Write([]byte("hello world"))
}
func (self *AdminServer) AddDs2Group(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
name := r.FormValue("name")
pwd := r.FormValue("pwd")
host := r.FormValue("host")
port, _ := strconv.Atoi(r.FormValue("port"))
db := r.FormValue("db")
charset := r.FormValue("charset")
ds, err := mysql.NewMysqlClient(name, pwd, host, port, db, charset)
if err != nil {
self.DisplayError(err, w)
return
}
dsw, _ := strconv.Atoi(r.FormValue("w"))
dsp, _ := strconv.Atoi(r.FormValue("p"))
dsr, _ := strconv.Atoi(r.FormValue("r"))
dsq, _ := strconv.Atoi(r.FormValue("q"))
dsName := r.FormValue("ds_name")
wapper := datasource.NewClientWeightWrapper(dsName, ds, dsw, dsp, dsr, dsq)
groupName := r.FormValue("group_name")
if self.groups[groupName] == nil {
w.Write([]byte("new group " + groupName + " first"))
return
} else {
group := self.groups[groupName]
group.AddClient(wapper)
}
logger.LogDebug("group add ", name, pwd, host, port, db, charset)
w.Write([]byte("success"))
}
func (self *AdminServer) NewGroup(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
groupName := r.FormValue("group_name")
group := datasource.NewGroup(groupName)
self.groups[groupName] = group
self.selector.AddGroup(group)
w.Write([]byte("success"))
}
func (self *AdminServer) Balance(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
groupName := r.FormValue("group_name")
group := self.groups[groupName]
group.Init()
self.selector.AddScaleGroup(group)
self.selector.Balance()
logger.LogDebug("rebalance")
w.Write([]byte("success"))
}
func (self *AdminServer) EndBalance(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
self.selector.EndBalance()
w.Write([]byte("success"))
}
func (self *AdminServer) DisplayError(err error, w io.Writer) {
w.Write([]byte(err.Error()))
}
func RegisterSelector(selector *shard.Selector) {
Server.selector = selector
}
// 管理后台
func NewAdminServer(addr string) {
router := httprouter.New()
Server = &AdminServer{}
Server.groups = make(map[string]*datasource.Group)
Server.tplDir, _ = os.Getwd()
Server.tplDir += "/admin/tpl/"
router.GET("/group/list", Server.Groups)
router.GET("/group/add", Server.AddDs2Group)
router.GET("/group/new", Server.NewGroup)
router.GET("/group/balance", Server.Balance)
router.GET("/group/endbalance", Server.EndBalance)
go http.ListenAndServe(addr, router)
}