【发布时间】:2019-01-24 11:17:19
【问题描述】:
我正在尝试在我的系统中实现rpc 和http 服务器。
所以要同时收听服务器,我运行了 2 goroutines
这是一个代码
func main() {
// Recovering all errors during the process
defer errorHandler()
wg.Add(2)
go RPCConnect()
fmt.Println("Listening for RPC 127.0.0.1:" + config.rpcPort)
go HTTPConnect()
fmt.Println("Listening for HTTP 127.0.0.1:" + config.httpPort)
wg.Wait()
}
func RPCConnect() {
err := rpc.Register(pool)
if err != nil {
panic(err)
}
rpc.HandleHTTP()
listener, e := net.Listen("tcp", ":"+config.rpcPort)
if e != nil {
panic(e)
}
err = http.Serve(listener, nil)
if err != nil {
panic(err)
}
}
func HTTPConnect() {
var httpPool HTTPPool
r := mux.NewRouter()
r.HandleFunc("/create", httpPool.Create).Methods("POST")
r.HandleFunc("/generate", httpPool.Generate).Methods("POST")
r.HandleFunc("/list", httpPool.List).Methods("GET")
r.HandleFunc("/delete", httpPool.Delete).Methods("POST")
err := http.ListenAndServe("localhost:"+config.httpPort, r)
if err != nil {
panic(err)
}
}
我不知道这是不是最好的方法。有人可以告诉我更简单灵活的方法吗?
如果问题不相关,我提前道歉
【问题讨论】:
-
这很好,除了
sync.WaitGroup不是必需的:http.Serve/http.ListenAndServe仅在错误时返回。根据您的情况,替代解决方案可能是通过以下方式将两个进程并排部署:a)创建两个二进制文件(cmd/http和cmd/rpc)或 b)创建一个二进制文件但使用一个标志来确定它是否应该在 HTTP 中运行或 RPC“模式”。 -
@EmilePels 谢谢!