gPRC入门指南

本文介绍了gRPC的基本概念,它允许像调用本地方法一样调用远程服务,支持多种语言。ProtocolBuffers是gRPC默认的数据序列化机制,提供了一种高效的数据表示方式。通过.proto文件定义服务和消息类型,protoc编译器能够生成相应的客户端和服务端代码。gRPC服务示例包括SayHello方法,接收HelloRequest并返回HelloReply。

本文是 https://grpc.io/docs/what-is-grpc/introduction/ 的摘译

一个 gRPC 和 protocol buffers 的入门指南

概述

gPRC功能是让你能像调用本地方法一样,调用定义在服务器上的方法。这对分布式服务很有用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DkP6Vwq9-1618537019688)(https://cdnimg-1254066503.cos.ap-beijing.myqcloud.com/fengrin.me/post/introduction-to-grpc1.png)]

gRPC 的客户端和服务端可在任何环境下运行,例如 Google 网站和你自己的笔记本电脑。他们可以用任何 gRPC 支持的语言实现(gRPC 支持 Java, Python, GO 等语言)。而且客户端的语言可以和服务端不一致,比如客户端可以用 Java 写,服务端则可以用 GO 写。

而且 Google 自身有很多对外的 API 开放,这些 API 有 gRPC 版本,你可以很容易集成到你自己的程序中。

Protocol Buffers

gPRC默认使用 Protocol Buffers, 这是 Google 的开源的成熟的序列化结构数据的机制(类似JSON)。

message Person {
  string name = 1;
  int32 id = 2;
  bool has_ponycopter = 3;
}

上面是一个普通的 .proto 文件。Protocol buffer 数据用 messages 的形式组织。每个 message 都是一个小的逻辑记录,包含了一系列的键值组合(这里称之为"fields"(字段))。

然后,一旦定义了数据结构,你可以用 protoc 编译器生成 proto 定义的调用类。比如 name(), set_name(),还有一些对 proto 结构进行序列化或 parse 以与原始字节进行转换。例如,如果你用 C++,把上面 Proto 文件编译成一个 Person 类。然后你可以用这个类来填充、序列化、获取 protocol buffer 的 Person 消息。

gRPC 服务是定义在普通的 proto 文件中,包含 RPC 方法参数和返回值。

// The greeter service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

gRPC 使用 protoc 作为 gRPC 插件,来从 proto 文件生成一些代码。这些生成代码你是可以看到的,就像正常的 protocol buffer 代码一样。

### gRPC框架简介 gRPC 是一种高性能、开源和通用的 RPC 框架,基于 HTTP/2 协议标准开发[^1]。它支持多种编程语言之间的互操作性,并通过 Protocol Buffers (protobuf) 定义服务接口和服务消息结构[^2]。 #### 下载与安装 在 Go 语言环境中,可以使用 `google.golang.org/grpc` 包来实现 gRPC 功能。可以通过以下两种方式之一获取该包: - 使用命令 `go get -u -v google.golang.org/grpc` 手动下载并更新依赖项。 - 或者,在启用了模块化的项目中运行 `go mod tidy` 自动管理依赖关系[^1]。 #### 编写 .proto 文件 为了定义服务及其方法签名以及数据模型,开发者通常会编写 `.proto` 文件。例如: ```proto syntax = "proto3"; package hello; // 定义 HelloService 接口 service HelloService { rpc SayHello(HelloRequest) returns (HelloResponse); } message HelloRequest { string name = 1; } message HelloResponse { string message = 1; } ``` 此代码片段展示了一个名为 `HelloService` 的简单服务,其中包含一个远程过程调用(RPC),即 `SayHello` 方法[^1]。 #### 编译 proto 文件 要生成客户端和服务端所需的存根类,需执行如下编译指令: ```bash protoc --cpp_out=. \ --grpc_out=. \ --plugin=protoc-gen-grpc=/usr/local/bin/grpc_cpp_plugin \ IM.Login.proto ``` 这条命令指定了输出目录 (`--cpp_out`) 和插件路径 (`--plugin`) 来处理 C++ 风格的服务绑定逻辑[^2]。 #### 实现服务器端逻辑 以下是基于前面提到的 `.proto` 文件的一个基本服务器端实现例子: ```go import ( "context" pb "path/to/generated/proto" "net" "google.golang.org/grpc" ) type server struct{} func (s *server) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) { return &pb.HelloResponse{Message: "Hello " + req.Name}, nil } func main() { lis, _ := net.Listen("tcp", ":50051") s := grpc.NewServer() pb.RegisterHelloServiceServer(s, &server{}) if err := s.Serve(lis); err != nil { panic(err) } } ``` 这段程序展示了如何注册自定义的服务处理器到 gRPC Server 中去监听指定地址上的请求[^1]。 #### 创建客户端应用 下面给出的是连接至上述服务器的应用实例: ```go import ( "context" "log" "time" pb "path/to/generated/proto" "google.golang.org/grpc" ) const address = "localhost:50051" func main() { conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock()) if err != nil { log.Fatalf("did not connect: %v", err) } defer conn.Close() c := pb.NewHelloServiceClient(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) } log.Printf("Greeting: %s", r.Message) } ``` 这个脚本说明了怎样建立安全通道之外的一般通信流程。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值