Grpc简介及使用
简介
在 gRPC 中,客户端应用程序可以像本地对象一样直接调用不同机器上的服务器应用程序上的方法,可以更轻松地创建分布式应用程序和服务。
服务端实现了接口,运行一个gRPC服务端来处理客户端调用。客户端提供与服务器相同的方法。
使用
- 编写.proto文件
- 使用protoc生成.pd.go和-grpc.pd.go文件
- 编写服务端代码
- 实现接口
- 监听端口
- 新建grpc服务
- 注册接口的实现(结构体)
- 调用grpc服务的Server方法
- 编写客户端代码
- 拨号建立连接
- 创建客户端
- 客户端调用服务端实现的接口方法
.proto文件
1 2 3 4 5 6 7 8 9 10 11 12 13
| syntax = "proto3"; option go_package = ".;helloService";
message helloReq { string name = 1; int32 age = 2; } message helloRep { string say = 1; } service HelloServer { rpc Say(helloReq) returns (helloRep) {}; }
|
服务端
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
| package main
import ( "context" "google.golang.org/grpc" pd "grpc_helloworld/server/proto" "log" "net" )
type Server struct { pd.UnimplementedHelloServerServer }
func (s *Server) Say(ctx context.Context, q *pd.HelloReq) (*pd.HelloRep, error) { return &pd.HelloRep{ Say: q.Name, }, nil } func main() { listen, _ := net.Listen("tcp", ":8080") newServer := grpc.NewServer() pd.RegisterHelloServerServer(newServer, new(Server)) err := newServer.Serve(listen) if err != nil { log.Print("err:", 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
| package main
import ( "context" "fmt" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" pd "grpc_helloworld/client/proto" "log" )
func main() { conn, err := grpc.Dial(":8080", grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { fmt.Print(err) } defer conn.Close() client := pd.NewHelloServerClient(conn) feature, err := client.Say(context.Background(), &pd.HelloReq{ Name: "hello", Age: 0, }) if err != nil { log.Print(err) } fmt.Print(feature) }
|
Go work使用
- 进入工作目录
- 使用
go work init
创建go.work文件
- 生成proto文件夹及文件
- 创建服务端及客户端文件夹并分别生成go.mod文件
- 关联依赖