漫谈grpc 3:从实践到原理,带你参透 gRPC

原文链接:万字长文 | 从实践到原理,带你参透 gRPC

大家好,我是煎鱼。

gRPC 在 Go 语言中大放异彩,越来越多的小伙伴在使用,最近也在公司安利了一波,希望这一篇文章能带你一览 gRPC 的巧妙之处,本文篇幅比较长,请做好阅读准备。

图片

漫谈grpc 3:从实践到原理,带你参透 gRPC

本文目录如下:

图片

漫谈grpc 3:从实践到原理,带你参透 gRPC

简述

gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持。

gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特性。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。

调用模型

图片

漫谈grpc 3:从实践到原理,带你参透 gRPC

1、客户端(gRPC Stub)调用 A 方法,发起 RPC 调用。

2、对请求信息使用 Protobuf 进行对象序列化压缩(IDL)。

3、服务端(gRPC Server)接收到请求后,解码请求体,进行业务逻辑处理并返回。

4、对响应结果使用 Protobuf 进行对象序列化压缩(IDL)。

5、客户端接受到服务端响应,解码请求体。回调被调用的 A 方法,唤醒正在等待响应(阻塞)的客户端调用并返回响应结果。

调用方式 一、Unary RPC:一元 RPC

图片

漫谈grpc 3:从实践到原理,带你参透 gRPC

Server

type SearchService struct{} func (s *SearchService) Search(ctx context.Context, r *pb.SearchRequest) (*pb.SearchResponse, error) {     return &pb.SearchResponse{Response: r.GetRequest() + " Server"}, nil } const PORT = "9001" func main() {     server := grpc.NewServer()     pb.RegisterSearchServiceServer(server, &SearchService{})     lis, err := net.Listen("tcp", ":"+PORT)     ...     server.Serve(lis) }

漫谈grpc 3:从实践到原理,带你参透 gRPC

创建 gRPC Server 对象,你可以理解为它是 Server 端的抽象对象。

将 SearchService(其包含需要被调用的服务端接口)注册到 gRPC Server。的内部注册中心。这样可以在接受到请求时,通过内部的 “服务发现”,发现该服务端接口并转接进行逻辑处理。

创建 Listen,监听 TCP 端口。

gRPC Server 开始 lis.Accept,直到 Stop 或 GracefulStop。

Client

func main() {     conn, err := grpc.Dial(":"+PORT, grpc.WithInsecure())     ...     defer conn.Close()     client := pb.NewSearchServiceClient(conn)     resp, err := client.Search(context.Background(), &pb.SearchRequest{         Request: "gRPC",     })     ... }

漫谈grpc 3:从实践到原理,带你参透 gRPC

创建与给定目标(服务端)的连接句柄。

创建 SearchService 的客户端对象。

发送 RPC 请求,等待同步响应,得到回调后返回响应结果。

二、Server-side streaming RPC:服务端流式 RPC

图片

漫谈grpc 3:从实践到原理,带你参透 gRPC

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgffdj.html