grpc简明案例
# 1、Protocol Buffers
# 2、快速开始
以计算斐波那契数列作为服务快速编写一个grpc demo
目录结构:
.
├── client
├── proto
└── server
1
2
3
4
2
3
4
# 2.1、protobuf编写
fibonacci.proto
syntax = "proto3";
package fibonacci;
// 指定生成go文件的存放位置及其包名
option go_package = "./fibonacci";
service Fibonacci {
rpc GetSequence(FibonacciRequest) returns (FibonacciResponse) {}
}
message FibonacciRequest {
int32 length = 1;
}
message FibonacciResponse {
repeated int64 sequence = 1;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
代码生成
protoc --go_out=. --go-grpc_out=. fibonacci.proto
1
目录结构:
.
├── client
├── proto
│ ├── fibonacci
│ │ ├── fibonacci_grpc.pb.go
│ │ └── fibonacci.pb.go
│ └── fibonacci.proto
└── server
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 2.2、Server端编写
# 2.2.1、引入fibonacci.proto生成的代码
import pb ".../proto/fibonacci"
1
# 2.2.2、定义服务对象
type Server struct {
pb.UnimplementedFibonacciServer
}
1
2
3
2
3
# 2.2.3、实现斐波那契计算函数
func (s *Server) GetSequence(ctx context.Context, req *pb.FibonacciRequest) (*pb.FibonacciResponse, error) {
length := req.GetLength()
sequence := make([]int64, length)
if length > 0 {
sequence[0] = 0
}
if length > 1 {
sequence[1] = 1
}
for i := int32(2); i < length; i++ {
sequence[i] = sequence[i-1] + sequence[i-2]
}
return &pb.FibonacciResponse{Sequence: sequence}, nil
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 2.2.4、开启服务
func main() {
lis, err := net.Listen("tcp", ":50051")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
pb.RegisterFibonacciServer(s, &Server{})
fmt.Println("Server is running on port :50051")
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 2.2.5、完整server.go
package main
import (
"context"
"fmt"
pb "[yourpath]/proto/fibonacci"
"log"
"net"
"google.golang.org/grpc"
)
type Server struct {
pb.UnimplementedFibonacciServer
}
// 斐波那契数列计算函数
func (s *Server) GetSequence(ctx context.Context, req *pb.FibonacciRequest) (*pb.FibonacciResponse, error) {
length := req.GetLength()
sequence := make([]int64, length)
if length > 0 {
sequence[0] = 0
}
if length > 1 {
sequence[1] = 1
}
for i := int32(2); i < length; i++ {
sequence[i] = sequence[i-1] + sequence[i-2]
}
return &pb.FibonacciResponse{Sequence: sequence}, nil
}
func main() {
lis, err := net.Listen("tcp", ":50051")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
pb.RegisterFibonacciServer(s, &Server{})
fmt.Println("Server is running on port :50051")
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
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
34
35
36
37
38
39
40
41
42
43
44
45
46
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
34
35
36
37
38
39
40
41
42
43
44
45
46
# 2.3、client端编写
func main() {
conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewFibonacciClient(conn)
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
req := &pb.FibonacciRequest{Length: 10}
res, err := c.GetSequence(ctx, req)
if err != nil {
log.Fatalf("could not get fibonacci sequence: %v", err)
}
fmt.Printf("Fibonacci sequence: %v\n", res.GetSequence())
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
上次更新: 2024/07/08, 18:19:51