google开发并开源的一款高性能、开源、通用的rpc框架
特点
- 支持多种语言
- 基于IDL文件定义服务,通过proto3工具生成指定语言的数据结构、服务端接口以及客户端stub
- 基于HTTP/2设计,支持双向流、消息头压缩、单TCP的多路复用、服务端推送等特性
- 序列化支持PB(语言无关的高性能序列化框架)和JSON
安装
- 安装grpc包。go install google.golang.org/grpc@latest
- 下载安装protoc,移动到PATH路径下。https://github.com/protocolbuffers/protobuf/releases
- 下载protoc的go插件。go install github.com/golang/protobuf/protoc-gen-go@latest
idl: hello.proto
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
syntax = "proto3";
package service;
option go_package = "hello/service";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
|
执行protoc命令生成go文件:
protoc -I pb/ pb/hello.proto –go_out=plugins=grpc:.
server
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
package main
import (
"context"
"fmt"
"hello/service"
"net"
"google.golang.org/grpc"
)
type RPCService struct {
}
func (srv *RPCService) SayHello(ctx context.Context, req *service.HelloRequest) (*service.HelloReply, error) {
name := req.Name
return &service.HelloReply{Message: "Hello " + name}, nil
}
func main() {
grpcServer := grpc.NewServer()
service.RegisterGreeterServer(grpcServer, &RPCService{})
listener, err := net.Listen("tcp", "127.0.0.1:8080")
if err != nil {
fmt.Println("net Listen error", err)
}
grpcServer.Serve(listener)
}
|
client
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
package main
import (
"context"
"fmt"
"hello/service"
"google.golang.org/grpc"
)
func main() {
conn, err := grpc.Dial("127.0.0.1:8080", grpc.WithInsecure())
if err != nil {
panic(err)
}
client := service.NewGreeterClient(conn)
rep, err := client.SayHello(context.TODO(), &service.HelloRequest{Name: "zw"})
if err != nil {
panic(err)
}
fmt.Println(rep.Message)
}
|