微服务系列(3)gRPC介绍
gRPC是一个高性能、开源和通用的RPC框架,面向移动和HTTP/2设计。gRPC基于HTTP/2标准设计,带来诸如双向流、流控、头部压缩、单TCP连接上的多路复用请求等待。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。
RPC
RPC(Remote Procedure Call Protocol) – 远程过程调用协议,他是一种通过网络从远程计算机上请求服务,而不需要了解底层网络技术的协议。
Golang本身有rpc包net/rpc
,可以方便的使用,来构建自己的rpc服务。
RPC调用流程分析
远程过程调用流程图
- 调用客户端句柄;执行传送参数
- 调用本地系统内核发送网络消息
- 消息传送到远程主机
- 服务器句柄得到消息并取得参数
- 执行远程过程
- 执行的过程将结果返回服务器句柄
- 服务器句柄返回结果,调用远程系统内核
- 消息传回本地主机
- 客户端句柄由内核接收消息
- 客户接收句柄返回的数据
RPC调用示例
服务端
1package main
2
3import (
4 "io"
5 "log"
6 "net"
7 "net/http"
8 "net/rpc"
9)
10
11type Hello string
12
13// 函数关键字 (对象) 函数名 (客户端发送过来的内容, 返回给对方的内容) 错误返回
14func (h *Hello) SayHello(recv string, reply *string) error {
15 log.Println("客户端发送过来的内容为:", recv)
16 *reply = "hello " + recv
17 return nil
18}
19
20func main() {
21 // 页面请求
22 http.HandleFunc("/hello", sayHello)
23
24 // 将类实例化为对象
25 hello := new(Hello)
26 // 服务端注册一个对象
27 rpc.Register(hello)
28 rpc.HandleHTTP()
29
30 ln, err := net.Listen("tcp", ":10000")
31 if err != nil {
32 log.Println(err)
33 return
34 }
35 http.Serve(ln, nil)
36}
37
38func sayHello(w http.ResponseWriter, r *http.Request) {
39 io.WriteString(w, "hello")
40}
客户端
1package main
2
3import (
4 "log"
5 "net/rpc"
6)
7
8func main() {
9 // 建立网络连接
10 cli, err := rpc.DialHTTP("tcp", "127.0.0.1:10000")
11 if err != nil {
12 log.Printf("网络连接失败,err:%v\n", err)
13 return
14 }
15
16 var hello string
17 err = cli.Call("Hello.SayHello", "jerry", &hello)
18 if err != nil {
19 log.Printf("call failed, err:%v\n", err)
20 return
21 }
22 log.Println("Result:", hello)
23}
运行测试
服务端
1go run main.go
22020/03/14 17:26:03 客户端发送过来的内容为: jerry
客户端
1go run main.go
22020/03/14 17:26:03 Result: hello jerry
gRPC介绍
- 原文作者:黄忠德
- 原文链接:https://huangzhongde.cn/post/2020-03-14-Microservice_gRPC/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。