返回介绍

6.2 HTTP 方式调用

发布于 2020-10-24 07:04:30 字数 3711 浏览 1023 评论 0 收藏 0

大部分场景下, rpcx服务是通过 TCP 进行通讯的, 但是你也可以直接通过 http 进行访问, http请求需要设置一些 header, 这和 gateway 中的 header 是一样的。

很明显,通过http调用不可能取得和 TCP 一样的性能, 因为 http 调用是一问一答方式进行通讯的, 并不能并发的请求(除非你使用很多client), 但是调用方式简单, 也可以应用在一些场景中。

可以http调用的服务必须使用 TCP 方式部署,而不能使用 UDP或者其他方式, 它和TCP共用同一个接口。 一个连接只能使用http调用或者TCP调用。

你可以使用你熟悉的语言进行调用,设置你使用的编解码器,最常用的是JSON编解码,注意一定要添加相应的header,否则rpcx服务不知道该如果处理这个htp请求。

下面是一个http调用的例子:

func main() {
    cc := &codec.MsgpackCodec{}

    args := &Args{
        A: 10,
        B: 20,
    }

    data, _ := cc.Encode(args)

    req, err := http.NewRequest("POST", "http://127.0.0.1:8972/", bytes.NewReader(data))
    if err != nil {
        log.Fatal("failed to create request: ", err)
        return
    }

    h := req.Header
    h.Set(gateway.XMessageID, "10000")
    h.Set(gateway.XMessageType, "0")
    h.Set(gateway.XSerializeType, "3")
    h.Set(gateway.XServicePath, "Arith")
    h.Set(gateway.XServiceMethod, "Mul")

    res, err := http.DefaultClient.Do(req)
    if err != nil {
        log.Fatal("failed to call: ", err)
    }
    defer res.Body.Close()

    // handle http response
    replyData, err := ioutil.ReadAll(res.Body)
    if err != nil {
        log.Fatal("failed to read response: ", err)
    }

    reply := &Reply{}
    err = cc.Decode(replyData, reply)
    if err != nil {
        log.Fatal("failed to decode reply: ", err)
    }

    log.Printf("%d * %d = %d", args.A, args.B, reply.C)
}

不能进行双向通讯, 也就是服务端不能主动发送请求给客户端。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文