package tcp import ( "os" "os/signal" "strings" "syscall" "time" "git.links123.net/links123.com/skeleton/cmd/tcp/router" "git.links123.net/links123.com/skeleton/service/store/cache" "git.links123.net/links123.com/skeleton/service/store/mysql" "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/wpajqz/linker" "github.com/wpajqz/linker/plugins" ) // RunCommand cobra subcommand tcp func RunCommand() *cobra.Command { var host, port string cmd := &cobra.Command{ Use: "tcp", Short: "Run the tcp service", Run: func(cmd *cobra.Command, args []string) { go Start(host, port) // 阻塞退出 捕获信号 signalChan := make(chan os.Signal) signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM) logrus.Infof("caught signal %+v, begin garbage collection", <-signalChan) Stop() }, } cmd.PersistentFlags().StringVarP(&host, "host", "o", "0.0.0.0", "server hostname") cmd.PersistentFlags().StringVarP(&port, "port", "p", "8081", "server port") return cmd } // Start use for cobra or testing func Start(host, port string) { // init db mysql.Init() // init cache cache.Init() // init server server := linker.NewServer(linker.Config{ Timeout: 30 * time.Second, PluginForPacketSender: []linker.PacketPlugin{ &plugins.Encryption{}, &plugins.Debug{Sender: true}, }, PluginForPacketReceiver: []linker.PacketPlugin{ &plugins.Decryption{}, &plugins.Debug{Sender: false}, }, }) // build router r := router.BuildRouter() server.BindRouter(r) // start server err := server.RunTCP("tcp", strings.Join([]string{host, port}, ":")) if err != nil { panic(err) } } // Stop stop the http service graceful func Stop() { // tcp server graceful shutdown missing cache.Close() mysql.Close() }