grpc基础

gRPC多路复用

1、多路复用是指:在同一个tcp连接上,可以同时进行多个请求和回应

  • 复用一条tcp连接
  • 多路的流

可以在一个流上进行多次请求回应

2、多路复用的作用是提高了网络利用率

3、多路复用的产生原理:

  • http2.0协议引入了二进制分帧机制:将请求和回应分割成一系列的帧,通过流的方式进行传输
    • http1.x以换行符作为纯文本的分隔符,而http2.0将传输的信息分割为更小的帧。并且对帧采用二进制的格式编码
    • 流的概念:
      • 流其实就是一个虚拟的通道,这个通道可以承载双向的消息
      • 请求回应,交替进行(但是必须是上一条请求回应完成之后才可以发送第二条请求)
      • 带编号
    • 消息:逻辑上的http数据包
    • 帧的概念:http2.0通信的最小单位
      • 带编号
      • 每个帧都会携带具体流的编号
    • 只使用一个连接即可并发发送多个请求和回应,并且这些请求和回应之间互不影响
  • 多路复用就是有多个并发的流同时执行
  • 一个tcp连接上可以同时存在多个流,每个流都有唯一的标识符和优先级,可以独立传输
  • 多个流可以并发传输,通过帧头中标识符进行区分和组装,从而实现多路复用

4、多路复用的优点:

  • 减少了tcp的连接数,减少了网络延迟和资源消耗
  • 提高了网络利用率
  • 提高了系统性能

5、应用场景:

  • 需要频繁进行网络通信的场景:
    • 实时通信
    • 流媒体传输
    • 分布式系统
  • 尤其是移动端和低带宽场景,可以减少网络带宽和电量消耗

gRPC服务端启动流程

1、gRPC简介

  • 高性能、开源的以及与语言无关的通用rpc框架

rpc就是远程过程调用:调用远程微服务的时候就像是在本地调用一样。

  • 协议采用http2
  • 序列化工具采用protobuffer

protobuffer是一个二进制的协议

  • 用于解决分布式系统通信的问题

2、启动流程

  • 定义服务的接口

  • proto3 IDL写模板文件
  • protoc进行编译生产c++代码
  • 实现服务

  • 继承protoc编译产生的服务接口
  • 实现接口方法
  • 创建服务器
    • 指定监听地址
    • 注册服务发现
  • 启动服务器

gRPC服务类型

1、不同种版本的http协议:

  • http1.0

  • http1.1

  • http2.0:采用的是流模式,全双工的通讯模式。某种意义上来说实现了分帧分流:
    • 客户端发送多个,服务端回应一个
    • 客户端发送一个,服务端回应多个
    • 客户端发送多个,服务端回应多个

服务端不需要按照顺序给客户端发送回应,也就是说实现了乱序发送、乱序接收

2、gRPC的四种服务类型:

  • 源于采用了http 2.0协议传输
  • http1.0长链接,请求回应模式
  • http1.1 pipeline模式
  • http2.0 stream,分帧分流,乱序发送、乱序接收

3、unary RPCs:

  • 一元rpc模式(这里的模式就是服务类型的意思),简单rpc模式
  • 即客户端发送一个请求给服务端,从服务端获取一个应答,就像一次普通的函数调用

4、server streaming RPCs:服务端流rpc模式(http 2.0)

  • 这里流stream的意思就是说服务端可以针对于客户端发来的一条请求发出多条回应消息。
    • 即客户端发送一个请求给服务端,可获取一个数据流用来读取一系列消息;客户端从返回的数据流里一直读取直到没有更多消息为止。
  • 通常情况下在服务端的回应比较耗时的时候,会采用这种服务端流rpc模式

5、client streaming RPCs:客户端流rpc模式(http 2.0)

  • 客户端将要发给服务端的请求拆分成多个请求进行发送。服务端基于收到的客户端的所有请求之后,进行统一的消息处理以及消息回应。
    • 即客户端用提供的一个数据流写入并发送一系列消息给服务端;一旦客户端完成消息写入,就等待服务端读取这些消息并返回应答。
  • 通常情况下在客户端要发给服务端的请求比较耗时的时候,会采用这种模式

6、bidirectional streaming RPCs:双向流RPC模式(http 2.0)

  • 请求回应都分为多个步骤或者说都比较耗时
    • 即两边都可以分别通过一个读写数据流来发送一系列消息。这两个数据流操作时相互独立的,所以客户端和服务端能按其希望的任意顺序读写
  • 举个例子:服务端可以在写应答之前等待所有的客户端消息,或者它可以先读一个消息再写一个消息,或者时读写相结合的其他方式
  • 每个数据流里消息的顺序会被保持

gRPC自定义解析器:resolver

1、resolver的作用:

  • resolver是用来解析服务器地址的组件,将主机名解析为IP地址或者其他网络协议中的地址
  • 我们通常使用resolver来实现服务发现
  • 解决两类问题
    • 客户端根据域名或者是服务名获取对端的IP地址,之后就可以建立连接
    • 如果对端挂了,那么就需要做到如果感知这一事件并且可以重新建立连接

2、c++实现:

  • 创建resolveFactory接口的实现类
  • 实现resolver接口以解析服务器地址
  • 注册resolver到channel上

keepalive的设置

1、keepalive是用来维持连接的,所以它是针对连接设置的

  • 用于设置客户端和服务端在长时间闲置期间维持连接的时间
  • 避免在闲置期间因为网络或其他问题导致连接中断
  • 通过发送心跳包(应用层)的方式实现

2、连接设置

  • 定制grpc连接的保持方式,以提高连接的可靠性和稳定性
  • 调整在多长时间内没有活动后,维持连接的时间长度
  • 设置选项
    • GRPC_ARG_KEEPALIVE_TIME_MS

客户端和服务端在发送第一帧keepalive心跳包的时候,它需要等待多长时间(这段时间内需要等待多少keepalive的心跳包),该值通常为2hrs

  • GRPC_ARG_KEEPALIVE_TIMEOUT_MS

客户端在向服务器发送一帧keepalive心跳包的时候,经过多长时间会将连接标记为失效,该值通常为20s

  • GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS

没有grpc活动的时候,就没有keepalive;只有有grpc活动的时候才会有keepalive保活

3、流设置

  • 定制grpc的流设置选项,以提高数据传输效率和可靠性
  • 设置选项
    • flow_control_window:用于控制流量以避免数据包丢失或超时
    • max_receive(send)_message_length:消息包大小超过4m,将被拒绝
    • initial_sequence_number:发送序列号的初始值

学习链接

https://xxetb.xetslk.com/s/12PH1r

  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值