凌云的博客

行胜于言

什么是 gRPC

分类:network| 发布时间:2025-01-03 17:42:00

概述

gRPC(Google Remote Procedure Calls 的缩写)是一个跨平台的高性能远程过程调用(RPC)框架。

gRPC最初由Google创建,它使用一个通用的RPC基础设施Stubby来连接其数据中心内外运行的大量微服务,始于2001年。 2015年3月,Google决定构建下一个版本的Stubby并将其开源,于是就有了gRPC。 现在除了Google之外,许多组织都在使用它来支持从微服务到计算的“最后一英里”(移动、Web和物联网)的用例。

gRPC基于HTTP/2协议传输数据,使用Protocol Buffers作为 接口描述语言 ,并提供认证(authentication)、双向流(bidirectional streaming)和流量控制、阻塞或非阻塞绑定以及取消和超时(Deadlines)等功能。 它为许多语言生成跨平台的客户端和服务器绑定。 最常见的使用场景包括在微服务风格的架构中连接服务,或将移动设备客户端连接到后端服务。

gRPC对HTTP/2的复杂使用使得在浏览器中无法实现gRPC客户端,而需要使用代理。

在gRPC中,客户端应用程序可以像调用本地对象一样直接调用位于不同机器上的服务器应用程序的方法, 这使得创建分布式应用程序和服务变得更加简单。

与许多RPC系统一样,gRPC基于定义服务的思想,指定可以远程调用的方法及其参数和返回类型。 在服务器端,服务器实现该接口并运行一个gRPC服务器来处理客户端的调用。 在客户端,客户端有一个 stub(存根)(在某些语言中仅称为客户端),它提供与服务器相同的方法。

gRPC 客户端和服务器可以在各种环境中运行并互相通信——从Google内部的服务器到您自己的桌面——并且可以使用gRPC支持的任何语言编写。 因此,例如,您可以轻松地在Java中创建一个gRPC服务器,并使用Go、Python或Ruby编写客户端。 此外,最新的Google API将提供gRPC版本的接口,让您可以轻松地将Google功能集成到您的应用程序中。

使用 Protocol Buffers

默认情况下,gRPC 使用 Protocol Buffers 来序列化结构数据。

这里简单描述下,它们是怎么工作的。

首先需要使用 proto 文件定义服务和消息,比如:

syntax = "proto3";
option go_package = "cs-cjl.com/helloworld/helloworld";

// 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;
}

这里以 golang 为例子,需要先安装 protoc, 然后安装生成 golang stub 的插件:

go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

更新你的 PATH 环境变量使得 protoc 可以找到 golang 插件

export PATH="$PATH:$(go env GOPATH)/bin"

使用 protoc 生成协议相关代码:

protoc --go_out=. --go-grpc_out=. helloworld.proto

接下来就可以编写服务端和客户端代码了,具体可以参考官方的例子:

helloworld

参考