首页 > 其他分享 >gRPC 应用指引

gRPC 应用指引

时间:2023-04-25 12:11:51浏览次数:54  
标签:指引 请求 gRPC 流式 RPC 应用 服务端 客户端

一、核心概念、架构及生命周期

1、服务定义

gRPC 默认使用 protocol buffers

service HelloService {
  rpc SayHello (HelloRequest) returns (HelloResponse);
}

message HelloRequest {
  string greeting = 1;
}

message HelloResponse {
  string reply = 1;
}

gRPC 可以定义四种类型服务:

  • Unary RPCs:一次请求,一次回复。

    rpc SayHello(HelloRequest) returns (HelloResponse);
    
  • 服务端流式请求:客户端发送一次请求,服务端流式返回一系列数据。

    rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);
    
  • 客户端流式请求:客户端流式写入一系列请求,然后发送到服务端。客户端写完请求后,等待服务端接受并返回结果。

    rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);
    
  • 双向流式请求:客户端和服务端双向发送数据流,各自独立。可以随读随写,或者一次性读完再写。

    rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);
    

2、API 使用

首先在 .proto 文件中定义一个服务,然后使用 gRPC 提供的 pb 编译插件来生成客户端和服务端代码。

  • 服务端:实现定义的服务,响应客户端请求。gRPC 框架解码请求,执行服务方法,编码返回结果。
  • 客户端:本地 stub 包含实现的服务方法,客户端可以直接调用 stub 的相应方法,以 pb 消息类型包装请求参数发送到服务器,同时返回服务器返回的结果。

3、同步和异步

同步 RPC 请求(发送请求,阻塞直到服务端返回结果)和我们通常所说的 RPC 定义最为接近。但是,在实际应用中,非阻塞异步请求更适合。

4、RPC 生命周期

a)Unary RPC

客户端发送一次请求,获取一次返回。

  • 客户端请求本地 stub 方法,服务端获取到通知,并伴随着客户端的请求数据,包括客户端 metadata、方法名及 deadline。服务端可以直接返回自身的 metadata(必须在业务结果返回前返回)或者等待客户端的请求消息(自定义)。
  • 服务端收到客户端请求消息,然后执行相应的方法,组装相应的数据结果,伴随着请求状态信息(状态码及可能状态消息)返回给客户端。
  • 如果状态为 OK,则客户端可以获取到结果进行处理,完成整个调用过程。

b)服务端流式 RPC

服务端返回的是一个数据流。在服务端发送完业务数据后,会继续返回状态信息。

c)客户端流式 RPC

客户端发送的是一个请求数据流。

d)双向流式 RPC

客户端和服务端双向发送数据流,各自独立。可以随读随写,或者一次性读完再写。

5、Deadlines/Timeouts

gRPC 允许客户端声明超时(请求 DEADLINE_EXCEEDED 异常之前等待的时间)。服务端可以通过此来判定请求是否超时及剩余处理时间。

6、RPC 终止

gRPC 中客户端和服务端都可以独立终止请求。比如服务端已经成功响应请求,但是客户端超时终止;服务端在接收完客户端请求数据前限频校验终止请求流程。

7、RPC 请求取消

客户端和服务端都可以在任何时候取消 RPC 流程。

8、Metadata

RPC 请求元数据,kv 列表形式,key 为 string 类型,value 通常为string,也可以为二进制。

key 大小写敏感,不能以 grpc- 做前缀(保留),二进制 value 的 key 以 -bin 结尾。

gRPC 不会使用用户自定义的元数据。

元数据使用,不同开发语言可能不同。

9、Channels

gRPC channel 是客户端到服务端的链接。用以创建客户端 stub。

channel 提供相应的参数配置控制 gRPC 请求行为,例如交互数据压缩等。

channel 的状态包括已建立链接及空闲。 

二、最佳实践

rpc 请求初始化包括:客户端负载均衡,传输层 HTTP/2 请求创建及请求服务端相应的业务接口。

尽量重用 stubs 和 channels。

2、提供心跳机制以确保 HTTP/2 连接即使在系统业务不活跃时段仍能保持活跃,避免因 RPC 请求初始化导致的响应延迟。

3、对于可能存续长时间的数据流请求交互,适宜使用流式处理,避免频繁的 RPC 初始化。但是流式处理也存在无法动态均衡负载的及debug 困难的问题。虽然可以在小规模请求上提升性能,但是会因为负载均衡因素及复杂性降低整体扩展性。(python 除外)

4、每一个 gRPC channel 可以使用 0 个或多个 HTTP/2 链接,每个链接可以承载一定数量的的并发数据流。当链接上活跃的 RPC 请求达到上限,新进的请求会进入调用端等待队列。因此,对于高负载或持久的流式请求会因此产生性能问题。对于此,可以使用如下两种方式处理:

  • 对于此类业务请求使用额外的 chennel。
  • 使用 gRPC 连接池来均衡处理请求(需要特定的处理来避免重复使用同一个 channel) 

5、对于 Java 语言

  • 使用非阻塞 stubs 来并行处理 RPC 请求。

  • 提供自定义连接池,根据实际的业务负载来配置相关参数。

标签:指引,请求,gRPC,流式,RPC,应用,服务端,客户端
From: https://www.cnblogs.com/niejunlei/p/17350126.html

相关文章

  • 实验3 控制语句与组合数据类型应用编程
    实验任务1#task1实验内容importrandomprint('用列表存取随机整数:')lst=[random.randint(0,100)foriinrange(5)]print(lst)print('\n用集合存储随机整数:')s1={random.randint(0,100)foriinrange(5)}print(s1)......
  • 5月腾冲 | 2023年易智瑞遥感应用培训班报名开启
    传递遥感技术助力遥感应用2023年易智瑞遥感应用培训班—5月腾冲站 主办单位易智瑞信息技术有限公司培训简介遥感应用培训班自2009年启动以来,已经举办了14年。已先后在20多个城市举办了120多场培训,共有7000多名学员参加。每年培训班内容都会根据学......
  • 小程序容器技术保障车载业务生态中的应用安全
    随着智能交通和车联网技术的快速发展,越来越多的车载应用程序(APP)进入人们的视野,从而推动了车载业务生态的不断发展。然而,车载应用程序的安全问题也引起了人们的广泛关注。为此,小程序容器技术作为一种有效的安全保障措施,受到了越来越多车联网企业和用户的青睐。小程序容器技术通过......
  • C#实现应用不重复开启
    privatevoidFormMain_Load(objectsender,EventArgse){if(CheckRunning("程序名"))//设定程序禁止重复运行,并返回检查当前进程是否重复开启的实例的结果。"identifier"不能与其它程序一样,这是区分互斥所的标识符。{Process.GetCurrentProcess().Kill();//关掉当前进......
  • 产品推荐丨智慧水利行业应用终端+云平台
    智慧水利是我国智慧城市建设的重要延伸,是新时代水利现代化的战略目标,贯穿于防汛抗旱减灾、水资源合理配置和高效利用、水资源和河湖健康保障等体系。随着水利技术的集成发展与场景的成熟应用,我国水利现已完成从自动化阶段到信息化阶段的过渡,逐渐迈向智慧化阶段。基于水利部提出的......
  • 基于显扬科技自主研发3D机器视觉HY-M5在易拉罐包装检测的应用
    行业现状:易拉罐包装行业发展迅速,是中国食品工业的重要组成部分。近年来,随着经济水平的提高和生活方式变化,各类预包装食品需求剧增,碳酸饮料和啤酒等饮料消费大幅增加,直接带动易拉罐包装行业高速发展。中国易拉罐行业产业链成熟,行业具有资本密集、技术含量高、环境要求高等特点。易拉......
  • 浅析低代码开发的典型应用构建场景
    在数字经济蓬勃发展的大势之下,企业软件开发人员供给不足、开发速度慢、开发成本高、数字化和智能化成效不明显等问题日益凸出,阻碍了企业的数字化转型。而近年来,低代码的出现推动了经济社会的全面提效,也成为人才供求矛盾的润滑剂。低代码迎合企业数字化转型需求,一方面降低软件开发......
  • 储物柜语音方案设计,NV040C的应用
    智能储物柜又称之为自动存包柜、电子寄存柜、电子储物柜等,在我们日常生活中可以帮助购物者或娱乐休闲的人们保证财产的安全。智能储物柜已广泛应用于超市、百货店、学校、图书馆、娱乐场所、工厂、机关、医院、电影城、游泳馆、海滨浴场、地铁站、火车站、机场等一切公共场所。而......
  • Qt 打包应用程序
    1.准备调试通过没有bug的项目;2. 在QT项目中,使用release进行调试。    3. 然后点击运行,在release目录下生成.exe文件。      4. release调试目录一般有两种,查看“项目”中的“概要”可以找到release的路径      5. release目录如下   ......
  • openEuler Developer Day 2023 电力行业技术创新及应用论坛成功举办
    开放原子开源基金会旗下openEuler社区发起的顶级开发者峰会——openEulerDeveloperDay2023于4月20日-21日在上海召开。麒麟信安作为openEuler项目群白金捐赠人,联合主办本次盛会,并与华为共同承办2023电力行业技术创新及应用论坛。120余位电力行业用户代表、专家、openEuler社......