美文网首页
9 人团本之基于 HTTP2 搬一个 RPC 的砖 | 水木双

9 人团本之基于 HTTP2 搬一个 RPC 的砖 | 水木双

作者: r00xx | 来源:发表于2021-01-31 23:41 被阅读0次

代码链接: HalokidRPC

协议格式

type Halokid struct {

    Header          string     

    Service        string     

    Method          string     

    Payload        []byte     

}

通信方式

HTTP2, 关于 http2 的特性请自行 research

服务端

常规来说 HTTP2 需要使用 TLS,需要生成证书,但是 go 有一个不需要 TLS 就可以使用 HTTP2 的实现,它就是 H2C,它是一个基于 TCP 之上构建的 HTTP2,拥有 http2 的一切特性,但是数据不加密,缺乏安全保证,我们服务端就采用 H2C 来实现

PS

https,基于 TLS 之上构建的 HTTP2

h2c,直接在 TCP 之上构建的 HTTP/2, 协议也是用 http

func main() {

  s := server.NewServer()

  s.RegisterSvc("Echo", new(service.Echo))

  log.Printf("s -------------- %+v", s)

  s.Run(":9527")

}

客户端

默认用浏览器(postman) 之类的来请求服务端,目前只支持 TLS 之上的 HTTP2(即 https),所以这个 RPC 服务端如果用浏览器来请求,会退为 HTTP1。直接用代码的 client 来请求,协议才是 HTTP2。

用 client 代码来请求,返回数据如下:

&{Status:200 OK StatusCode:200 Proto:HTTP/2.0 ProtoMajor:2 ProtoMinor:0 Header:map[Content-Length:[19] Content-Type:[text/plain; charset=utf-8] Date:[Sat, 30 Jan 2021 12:30:43 GMT]] Body:{cs:0xc0000ecdc0} ContentLength:19 TransferEncoding:[] Close:false Uncompressed:false Trailer:map[] Request:0xc000104000 TLS:}

func main() {

  client := http.Client{

    Transport:    &http2.Transport{

      AllowHTTP:  true,

      DialTLS: func(network, addr string, cfg *tls.Config) (conn net.Conn, err error) {

        return net.Dial(network, addr)

      },

    },

  }

  url := "http://127.0.0.1:9527"

  payload, err := json.Marshal(map[string]string {

    "name": "halokid",

  })

  ColorfulRabbit.CheckError(err, "客户端序列化payload请求错误")

  req, _ := http.NewRequest("POST", url, bytes.NewBuffer(payload))

  req.Header.Add("svc", "Echo")

  req.Header.Add("method", "Say")

  rsp, _ := client.Do(req)

  log.Printf("RPC请求返回 --------- %+v", rsp)

  defer rsp.Body.Close()

  reply, _ := ioutil.ReadAll(rsp.Body)

  log.Printf("RPC请求返回reply --------- %+v", string(reply))

}

服务调用流程

本文链接:https://www.pangulab.com/post/kb-yo8n7r.html, 参与评论 »

--EOF--

相关文章

  • 9 人团本之基于 HTTP2 搬一个 RPC 的砖 | 水木双

    代码链接:HalokidRPC[https://github.com/halokid/halokidRPC] 协议...

  • RPC原理解析

    GRPC是google开源的一个高性能、跨语言的RPC框架,基于HTTP2协议,基于protobuf 3.x,基于...

  • (android端)GRPC的使用和MVC模式封装

    GRPC是google开源的一个高性能、跨语言的RPC框架,基于HTTP2协议,基于protobuf来声明数...

  • GRPC基础知识

    简介 GRPC是google开源的一个高性能、跨语言的RPC框架,基于HTTP2协议,基于protobuf 3.x...

  • Grpc-java实践

    一.Grpc简介 一个2016年才由google正式发布的的RPC框架,基于http2,protobuf协议 官网...

  • 团本摸金成为主流,混团号职业选择推荐

    搬砖是地下城与勇士的一大特色,很多玩家都有过搬砖的经历,搬砖的方式有很多种,目前最受玩家欢迎的就是团本摸金了,早在...

  • Sublime Text3 常用插件推荐

    我是一个爱搬砖的搬砖人 1、 Package Control 2、SublimeEnhancements 这个插...

  • xtradechain机器人搬砖套利

    什么是搬砖套利,btc怎么搬砖,交易所搬砖套利,xtradechain智能机器人搬砖套利,量化交易套利,外汇套利,...

  • 搬砖人

    不管你是实习的、初级的、中级的、高级的,你终究还是个搬砖人 既然是搬砖人,那就不废话了,码字去了

  • 搬砖人

    为期十天的老家春节日,今晚结束,返程搬砖。 这十天里,主要是吃吃喝喝睡睡。大多数时间是无规律的。探亲访...

网友评论

      本文标题:9 人团本之基于 HTTP2 搬一个 RPC 的砖 | 水木双

      本文链接:https://www.haomeiwen.com/subject/thbdtltx.html