项目简介
一个基于gRPC协议的示例项目,旨在展示如何使用gRPC进行远程过程调用(RPC)和数据传输。
关于grpc
gRPC是Google开发的高性能、开源的RPC框架,支持多种语言,并且具有诸如双向流式数据传输、流式处理、身份验证等先进功能,可用于构建分布式系统、微服务、Web应用程序等。
项目目录
项目代码
- calculator.proto
syntax = "proto3";
option go_package = "./calculator";
package calculator; //包名
service Calculator {
rpc Add(AddRequest) returns (AddResponse) {}
}
message AddRequest {
int32 a = 1;
int32 b = 2;
}
message AddResponse {
int32 result = 1;
}
- 生成pg.go和*_grpc.pb.go
protoc.exe --go_out=. --go-grpc_out=. calculator.proto
- 服务端server.go
package main
import (
"context"
"flag"
"fmt"
"log"
"net"
"google.golang.org/grpc"
pb "go_grpc_demo/calculator/calculator"
)
var (
port = flag.Int("port", 50051, "The server port")
)
type server struct {
pb.UnimplementedCalculatorServer
}
func (s *server) Add(ctx context.Context, req *pb.AddRequest) (*pb.AddResponse, error) {
result := req.A + req.B
return &pb.AddResponse{
Result: result}, nil
}
func main() {
flag.Parse()
lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
pb.RegisterCalculatorServer(s, &server{
})
log.Printf("server listening at %v", lis.Addr())
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
- 客户端client.go
package main
import (
"context"
"flag"
"log"
"time"
"google.golang.org/grpc"
pb "go_grpc_demo/calculator/calculator"
)
var (
serverAddr = flag.String("server_addr", "localhost:50051", "The server address in the format of host:port")
)
func main() {
flag.Parse()
// 连接到 gRPC 服务器
conn, err := grpc.Dial(*serverAddr, grpc.WithInsecure())
if err != nil {
log.Fatalf("failed to connect: %v", err)
}
defer conn.Close()
// 创建 Calculator 客户端
c := pb.NewCalculatorClient(conn)
// 发送 Add 请求
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
req := &pb.AddRequest{
A: 1, B: 2}
resp, err := c.Add(ctx, req)
if err != nil {
log.Fatalf("failed to add: %v", err)
}
log.Printf("%d + %d = %d", req.A, req.B, resp.Result)
}
项目运行效果
- 服务端
- 客户端
备注
安装 protoc 编译器
下载地址: https://github.com/protocolbuffers/protobuf/releases
# 安装protoc-gen-go-grpc
go install google.golang.org/grpc/cmd/[email protected]