- Part Ⅰ 开发起步
- Part Ⅱ 注册中心
- Part Ⅲ 特性
- Part Ⅳ 插件
- Part Ⅴ 其它
- Part Ⅵ 网关
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
6.2 HTTP 方式调用
大部分场景下, 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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论