Create & Init Project...

This commit is contained in:
2019-04-22 18:49:16 +08:00
commit fc4fa37393
25440 changed files with 4054998 additions and 0 deletions

View File

@@ -0,0 +1,39 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"discovery.go",
"http.go",
],
importpath = "go-common/app/infra/discovery/http",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/infra/discovery/conf:go_default_library",
"//app/infra/discovery/model:go_default_library",
"//app/infra/discovery/service:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,159 @@
package http
import (
"net/http"
"strconv"
"time"
"go-common/app/infra/discovery/model"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
)
const (
_pollWaitSecond = 30 * time.Second
)
func register(c *bm.Context) {
arg := new(model.ArgRegister)
if err := c.Bind(arg); err != nil {
return
}
i := model.NewInstance(arg)
if i.Status == 0 || i.Status > 2 {
c.JSON(nil, ecode.RequestErr)
return
}
// register replication
if arg.DirtyTimestamp > 0 {
i.DirtyTimestamp = arg.DirtyTimestamp
}
svr.Register(c, i, arg.LatestTimestamp, arg.Replication)
c.JSON(nil, nil)
}
func renew(c *bm.Context) {
arg := new(model.ArgRenew)
if err := c.Bind(arg); err != nil {
return
}
// renew
c.JSON(svr.Renew(c, arg))
}
func cancel(c *bm.Context) {
arg := new(model.ArgCancel)
if err := c.Bind(arg); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(nil, svr.Cancel(c, arg))
}
func fetchAll(c *bm.Context) {
c.JSON(svr.FetchAll(c), nil)
}
func fetch(c *bm.Context) {
arg := new(model.ArgFetch)
if err := c.Bind(arg); err != nil {
return
}
c.JSON(svr.Fetch(c, arg))
}
func fetchs(c *bm.Context) {
arg := new(model.ArgFetchs)
if err := c.Bind(arg); err != nil {
return
}
c.JSON(svr.Fetchs(c, arg))
}
func poll(c *bm.Context) {
arg := new(model.ArgPolls)
if err := c.Bind(arg); err != nil {
return
}
ch, new, err := svr.Polls(c, arg)
if err != nil && err != ecode.NotModified {
c.JSON(nil, err)
return
}
// wait for instance change
select {
case e := <-ch:
if len(arg.Treeid) != 0 {
c.JSON(e[strconv.FormatInt(arg.Treeid[0], 10)], nil)
} else {
c.JSON(e[arg.Appid[0]], nil)
}
if !new {
svr.DelConns(arg) // broadcast will delete all connections of appid
}
case <-time.After(_pollWaitSecond):
c.JSON(nil, ecode.NotModified)
svr.DelConns(arg)
case <-c.Writer.(http.CloseNotifier).CloseNotify():
c.JSON(nil, ecode.NotModified)
svr.DelConns(arg)
}
}
func polls(c *bm.Context) {
arg := new(model.ArgPolls)
if err := c.Bind(arg); err != nil {
return
}
if len(arg.Treeid) != len(arg.LatestTimestamp) && len(arg.Appid) != len(arg.LatestTimestamp) {
c.JSON(nil, ecode.RequestErr)
return
}
ch, new, err := svr.Polls(c, arg)
if err != nil && err != ecode.NotModified {
c.JSON(nil, err)
return
}
// wait for instance change
select {
case e := <-ch:
c.JSON(e, nil)
if !new {
svr.DelConns(arg) // broadcast will delete all connections of appid
}
case <-time.After(_pollWaitSecond):
c.JSON(nil, ecode.NotModified)
svr.DelConns(arg)
case <-c.Writer.(http.CloseNotifier).CloseNotify():
c.JSON(nil, ecode.NotModified)
svr.DelConns(arg)
}
}
func polling(c *bm.Context) {
arg := new(model.ArgPolling)
if err := c.Bind(arg); err != nil {
return
}
c.JSON(svr.Polling(c, arg))
}
func set(c *bm.Context) {
var (
arg = new(model.ArgSet)
)
if err := c.Bind(arg); err != nil {
return
}
// len of status,metadata must equal to len of hostname or be zero
if (len(arg.Hostname) != len(arg.Status) && len(arg.Status) != 0) ||
(len(arg.Hostname) != len(arg.Metadata) && len(arg.Metadata) != 0) {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(nil, svr.Set(c, arg))
}
func nodes(c *bm.Context) {
c.JSON(svr.Nodes(c), nil)
}

View File

@@ -0,0 +1,42 @@
package http
import (
"go-common/app/infra/discovery/conf"
"go-common/app/infra/discovery/service"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
var (
svr *service.Service
)
// Init init http
func Init(c *conf.Config, s *service.Service) {
svr = s
engineInner := bm.DefaultServer(c.BM.Inner)
innerRouter(engineInner)
if err := engineInner.Start(); err != nil {
log.Error("bm.DefaultServer error(%v)", err)
panic(err)
}
}
// innerRouter init local router api path.
func innerRouter(e *bm.Engine) {
group := e.Group("/discovery")
{
group.POST("/register", register)
group.POST("/renew", renew)
group.POST("/cancel", cancel)
group.GET("/fetch/all", fetchAll)
group.GET("/fetch", fetch)
group.GET("/fetchs", fetchs)
group.GET("/poll", poll)
group.GET("/polls", polls)
//manager
group.POST("/set", set)
group.GET("/polling", polling)
group.GET("/nodes", nodes)
}
}