golang grpc 案例

发布时间:2024-11-22 04:59:09

golang grpc介绍与案例 概念与用途 - gRPC是一种高性能、开源的远程过程调用(RPC)框架,由Google开发并用于底层通信协议的编写。它支持多种编程语言,包括Golang。 - gRPC基于Protocol Buffers进行通信,其主要目的是简化分布式应用程序之间的通信。Protocol Buffers是一种轻量级的数据序列化格式,可以通过定义消息格式来方便地传输和存储结构化数据。 安装gRPC - 安装gRPC需要首先安装Golang,然后运行以下命令: ``` go get -u google.golang.org/grpc ``` gRPC案例:实现一个简单的计算器服务 - 创建proto文件calculator.proto,定义Calculator服务及其方法: ```protobuf syntax = "proto3"; service Calculator { rpc Add (AddRequest) returns (AddResponse) {} } message AddRequest { int32 num1 = 1; int32 num2 = 2; } message AddResponse { int32 result = 1; } ``` - 使用protoc编译器生成Golang代码: ``` protoc --go_out=plugins=grpc:. calculator.proto ``` - 实现服务端代码calculator_server.go: ```go package main import ( "context" "log" "net" pb "your_package_path/calculator" // 替换为实际的包路径 "google.golang.org/grpc" ) type server struct{} func (s *server) Add(ctx context.Context, req *pb.AddRequest) (*pb.AddResponse, error) { num1 := req.GetNum1() num2 := req.GetNum2() result := num1 + num2 return &pb.AddResponse{Result: result}, nil } func main() { lis, err := net.Listen("tcp", "localhost:50051") if err != nil { log.Fatalf("failed to listen: %v", err) } s := grpc.NewServer() pb.RegisterCalculatorServer(s, &server{}) log.Println("Server listening on localhost:50051") if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } } ``` - 实现客户端代码calculator_client.go: ```go package main import ( "context" "log" "os" "strconv" "time" pb "your_package_path/calculator" // 替换为实际的包路径 "google.golang.org/grpc" ) func main() { address := "localhost:50051" if len(os.Args) > 1 { address = os.Args[1] } // 建立与服务端的连接 conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock()) if err != nil { log.Fatalf("did not connect: %v", err) } defer conn.Close() c := pb.NewCalculatorClient(conn) // 构造请求 num1 := 10 num2 := 20 req := &pb.AddRequest{ Num1: int32(num1), Num2: int32(num2), } // 发送请求 ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() res, err := c.Add(ctx, req) if err != nil { log.Fatalf("could not add: %v", err) } // 处理响应结果 result := res.GetResult() log.Printf("Result: %d + %d = %d", num1, num2, result) } ``` 运行与测试 - 启动服务器: ``` go run calculator_server.go ``` - 运行客户端进行计算: ``` go run calculator_client.go ``` 结果将会输出: ``` Result: 10 + 20 = 30 ``` 总结 通过这个简单的gRPC案例,我们展示了如何使用Golang实现一个计算器服务,利用gRPC进行远程过程调用。gRPC提供了一种高效、灵活的方式来构建分布式应用程序,既能够减少通信复杂性,又能够提高性能和扩展性。 尽管本文只展示了一个简单的案例,但你可以根据自己的需求使用gRPC构建更复杂的系统或微服务架构。同时,你也可以使用gRPC来访问已有的RESTful API,从而实现升级或替换现有系统的目标。 总之,gRPC是一个强大的工具,可在不同的领域和应用中发挥作用。希望这篇文章能够为你入门gRPC提供一些帮助和指导。

相关推荐