深入理解RPC与Go语言中grpc的使用方法

0 下载量 183 浏览量 更新于2024-10-16 收藏 53KB ZIP 举报
资源摘要信息:"RPC简介和grpc的使用" 知识点一:RPC基础 RPC(Remote Procedure Call)远程过程调用是一种计算机通信协议。这个协议允许一台计算机上的程序调用另一台计算机上的子程序,而开发者无需额外地为这种分布式交互编写网络通信代码。RPC协议隐藏了底层网络通信的复杂性,开发者可以像本地过程调用一样来编写分布式应用。 知识点二:RPC的组成 一个典型的RPC系统通常包含以下几个关键组件: 1. 客户端(Client):发起RPC调用的应用程序。 2. 服务端(Server):等待被调用的远程方法所在的宿主。 3. 服务接口(Service Interface):定义了哪些方法可以被远程调用。 4. 传输协议(Transport Protocol):规定了消息的格式和数据传输的方式,如TCP、HTTP等。 5. 序列化/反序列化机制(Serialization/Deserialization):将调用信息和数据在客户端和服务端之间进行转换。 知识点三:gRPC简介 gRPC是一个高性能、开源和通用的RPC框架,由Google主导开发。它基于HTTP/2协议传输,使用Protocol Buffers作为接口描述语言。gRPC支持多种语言,使得不同语言编写的服务可以轻松通信。 知识点四:gRPC的特点 1. 多语言支持:gRPC提供了多种语言的实现,可以使用不同的语言开发客户端和服务端。 2. HTTP/2支持:gRPC基于HTTP/2进行通信,具有头部压缩、多路复用和服务器推送等特性。 3. 声明式服务:使用Protocol Buffers定义服务,由框架自动生成客户端和服务端的代码。 4. 跨语言和跨平台:由于其使用Protocol Buffers,gRPC天然支持跨语言通信。 5. 双向流支持:gRPC支持双向流式通信,允许服务端和客户端持续发送消息。 知识点五:gRPC架构 gRPC的架构主要由三部分组成: 1. gRPC核心库:提供gRPC的基础功能和API。 2. Protocol Buffers:gRPC使用的接口定义语言和消息序列化格式。 3. 生成的代码:根据服务定义生成客户端和服务端的代码。 知识点六:gRPC使用流程 1. 定义服务:使用Protocol Buffers定义服务接口和消息格式。 2. 生成代码:通过gRPC工具生成客户端和服务端的存根代码。 3. 实现服务:在服务端实现定义的服务接口。 4. 运行服务:启动gRPC服务端,并等待客户端请求。 5. 客户端调用:在客户端使用gRPC库发起远程调用。 知识点七:go语言grpc的简单demo 在Go语言中使用gRPC,首先需要定义服务接口,然后使用Protocol Buffers编写服务描述文件。通过protoc编译器生成Go代码,服务端实现这些接口,客户端使用生成的代码发起调用。 具体步骤如下: 1. 定义服务接口:编写一个.proto文件,使用Protocol Buffers语法定义服务和消息类型。 2. 编译服务定义:使用protoc编译器针对.proto文件生成Go代码。 3. 实现服务端:导入生成的Go代码,并实现定义的服务接口。 4. 启动服务端:初始化gRPC服务器,并注册实现的服务接口。 5. 实现客户端:创建gRPC客户端,调用服务端的方法。 知识点八:go语言实现grpc客户端和服务端 1. 定义proto文件,例如: ```protobuf syntax = "proto3"; package example; service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} } message HelloRequest { string name = 1; } message HelloReply { string message = 1; } ``` 2. 使用protoc编译器生成Go代码: ```shell protoc --go_out=. --go-grpc_out=. example.proto ``` 3. 服务端实现: ```go package main import ( "context" "log" "net" "***/grpc" pb "path/to/your/generated/package" ) type server struct { pb.UnimplementedGreeterServer } func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { log.Printf("Received: %v", in.GetName()) return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil } func main() { lis, err := net.Listen("tcp", ":50051") if err != nil { log.Fatalf("failed to listen: %v", err) } s := grpc.NewServer() pb.RegisterGreeterServer(s, &server{}) if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } } ``` 4. 客户端调用: ```go package main import ( "context" "log" "fmt" "time" "***/grpc" pb "path/to/your/generated/package" ) func main() { conn, err := grpc.Dial(":50051", grpc.WithInsecure(), grpc.WithBlock()) if err != nil { log.Fatalf("did not connect: %v", err) } defer conn.Close() c := pb.NewGreeterClient(conn) ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() r, err := c.SayHello(ctx, &pb.HelloRequest{Name: "world"}) if err != nil { log.Fatalf("could not greet: %v", err) } fmt.Println(r.GetMessage()) } ``` 知识点九:构建和运行 构建和运行gRPC服务,可以使用如下命令: ```shell # 构建服务端 go build -o server main.go # 构建客户端 go build -o client main.go # 先运行服务端 ./server # 再运行客户端 ./client ``` 通过以上步骤,就可以使用Go语言实现一个简单的gRPC服务端和客户端,并通过gRPC进行通信。