【问题标题】:HTTP & RPC at the same time同时使用 HTTP 和 RPC
【发布时间】:2019-01-24 11:17:19
【问题描述】:

我正在尝试在我的系统中实现rpchttp 服务器。 所以要同时收听服务器,我运行了 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/httpcmd/rpc)或 b)创建一个二进制文件但使用一个标志来确定它是否应该在 HTTP 中运行或 RPC“模式”。
  • @EmilePels 谢谢!

标签: http go rpc


【解决方案1】:

建议的方法非常好。

如果您只想使用一个端口而不是两个,有几个第三方工具可以做到这一点:

1) https://github.com/soheilhy/cmux

2) https://github.com/grpc-ecosystem/grpc-gateway

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-23
    • 2015-01-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 2017-03-18
    相关资源
    最近更新 更多