You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ngs/examples/cluster/main.go

180 lines
4.2 KiB
Go

package main
import (
"errors"
"git.noahlan.cn/northlan/ngs"
"git.noahlan.cn/northlan/ngs/examples/cluster/chat"
"git.noahlan.cn/northlan/ngs/examples/cluster/gate"
"git.noahlan.cn/northlan/ngs/examples/cluster/master"
"git.noahlan.cn/northlan/ngs/internal/log"
"git.noahlan.cn/northlan/ngs/serialize/json"
"git.noahlan.cn/northlan/ngs/session"
"github.com/urfave/cli"
"net/http"
"os"
"path/filepath"
"runtime"
)
func main() {
app := cli.NewApp()
app.Name = "ClusterDemo"
app.Author = "NorthLan"
app.Email = "6995syu@163.com"
app.Description = "cluster demo"
app.Commands = []cli.Command{
{
Name: "master",
Flags: []cli.Flag{
cli.StringFlag{
Name: "listen,l",
Usage: "--l --listen :8888 Master service listen address",
Value: "127.0.0.1:34567",
},
},
Action: runMaster,
},
{
Name: "gate",
Flags: []cli.Flag{
cli.StringFlag{
Name: "master",
Usage: "master server address",
Value: "127.0.0.1:34567",
},
cli.StringFlag{
Name: "listen,l",
Usage: "Gate service listen address",
Value: "",
},
cli.StringFlag{
Name: "gate-address",
Usage: "Client connect address",
Value: "",
},
},
Action: runGate,
},
{
Name: "chat",
Flags: []cli.Flag{
cli.StringFlag{
Name: "master",
Usage: "master server address",
Value: "127.0.0.1:34567",
},
cli.StringFlag{
Name: "listen,l",
Usage: "Chat service listen address",
Value: "",
},
},
Action: runChat,
},
}
//log.SetFlags(log.LstdFlags | log.Lshortfile)
if err := app.Run(os.Args); err != nil {
log.Fatalf("Startup server error %+v", err)
}
}
func runMaster(args *cli.Context) error {
listen := args.String("listen")
if listen == "" {
return errors.New("master listen address cannot empty")
}
webDir := filepath.Join(srcPath(), "master", "web")
log.Println("Ngs master server web content directory", webDir)
log.Println("Ngs master listen address", listen)
log.Println("Open http://127.0.0.1:12345/web/ in browser")
http.Handle("/web/", http.StripPrefix("/web/", http.FileServer(http.Dir(webDir))))
go func() {
if err := http.ListenAndServe(":12345", nil); err != nil {
panic(err)
}
}()
// Register session closed callback
session.Lifetime.OnClosed(master.OnSessionClosed)
// Startup Ngs server with the specified listen address
ngs.Listen(listen,
ngs.WithMaster(),
ngs.WithComponents(master.Services),
ngs.WithSerializer(json.NewSerializer()),
ngs.WithDebugMode(),
)
return nil
}
func srcPath() string {
_, file, _, _ := runtime.Caller(0)
return filepath.Dir(file)
}
func runGate(args *cli.Context) error {
listen := args.String("listen")
if listen == "" {
return errors.New("gate listen address cannot empty")
}
masterAddr := args.String("master")
if masterAddr == "" {
return errors.New("master address cannot empty")
}
gateAddr := args.String("gate-address")
if gateAddr == "" {
return errors.New("gate address cannot empty")
}
log.Println("Current server listen address", listen)
log.Println("Current gate server address", gateAddr)
log.Println("Remote master server address", masterAddr)
// Startup Ngs server with the specified listen address
ngs.Listen(listen,
ngs.WithAdvertiseAddr(masterAddr),
ngs.WithClientAddr(gateAddr),
ngs.WithComponents(gate.Services),
ngs.WithSerializer(json.NewSerializer()),
ngs.WithIsWebsocket(true),
ngs.WithWSPath("/ngs"),
ngs.WithCheckOriginFunc(func(_ *http.Request) bool { return true }),
ngs.WithDebugMode(),
)
return nil
}
func runChat(args *cli.Context) error {
listen := args.String("listen")
if listen == "" {
return errors.New("chat listen address cannot empty")
}
masterAddr := args.String("master")
if listen == "" {
return errors.New("master address cannot empty")
}
log.Println("Current chat server listen address", listen)
log.Println("Remote master server address", masterAddr)
// Register session closed callback
session.Lifetime.OnClosed(chat.OnSessionClosed)
// Startup Ngs server with the specified listen address
ngs.Listen(listen,
ngs.WithAdvertiseAddr(masterAddr),
ngs.WithComponents(chat.Services),
ngs.WithSerializer(json.NewSerializer()),
ngs.WithDebugMode(),
)
return nil
}