美文网首页
gRPC学习笔记1 - 简单介绍

gRPC学习笔记1 - 简单介绍

作者: 张云飞Vir | 来源:发表于2020-04-03 10:48 被阅读0次

    0. 背景

    gRPC 是谷歌开源的轻量级 RPC 通信框架,在微服务架构中经常用到。

    1. gRPC 简介

    gRPC 是谷歌开源的轻量级 RPC 通信框架,其中的通信协议基于二进制数据流,使得 gRPC 具有优异的性能。

    gRPC 支持 HTTP 2.0 协议,使用二进制帧进行数据传输,还可以为通信双方建立持续的双向数据流。

    基础概念

    在gRPC中,客户端应用程序可以直接调用不同机器上服务器应用程序上的方法,就好像它是本地对象一样,这使创建分布式应用程序和服务变得很容易。

    分解介绍:

    • (1) 定义一个服务:gRPC基于定义服务的思想,指定可以使用参数和返回类型远程调用的方法。
    • (2) 服务器端实现服务:服务器实现此接口并运行gRPC服务器来接收客户端调用。
    • (3) 客户端通过存根调用:客户端有一个存根,它提供与服务器相同的方法,执行时就像调用了服务端的方法。
    image.png

    gRPC使得客户机和服务器可以在不同环境中运行和相互通信,比如分布在不同地区,物理环境。和支持各种开发语言进行开发。

    2. gRPC 使用 protobuf 作为通信协议

    两个微服务之间通过基于 HTTP 2.0 二进制数据帧通信,使用 gRPC 内置的 protobuf 协议,其 DSL 语法 可清晰定义服务间通信的数据结构

    对应 开发语言中的 struct 和 函数, gRPC 通过 protobuf 通信协议来描述(定义)序列化的数据的结构和服务调用方法。

    下面分别描述:

    • 定义数据结构
    • 定义服务方法

    2.1 定义数据结构

    protobuf 中 ,用 message 表示传输的 数据结构实体对象,示例:

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

    它描述了传输过程中的消息的数据结构,protobuf 提供了序列化和反序列化的方法。protobuf 提供了编译和生成代码的工具,通过 protoc 工具生成基于各个开发语言的源代码。可以参考我的另一篇文章Go 语言中使用 Protocol Buffers

    2.2 定义服务方法

    就像开发语言中的函数,方法,服务定义 可以定义和描述 数据访问方法,描述了方法名称,调用参数,和返回参数等,示例:

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

    这里定义的服务方法,也可以借助 protobuf 生成源代码。然后它作为服务端和客户端之间的调用方法约定。

    3. 四类服务方法

    gRPC 允许你定义四类服务方法:

    3.1 普通RPC调用

    即客户端发送一个请求给服务端,从服务端获取一个应答,就像一次普通的函数调用。

    rpc SayHello(HelloRequest) returns (HelloResponse){
    }
    

    3.2 服务端流式 RPC

    即客户端发送一个请求给服务端,可获取一个数据流用来读取一系列消息。客户端从返回的数据流里一直读取直到没有更多消息为止。

    rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse){
    }
    

    3.3 客户端流式 RPC

    即客户端用提供的一个数据流写入并发送一系列消息给服务端。一旦客户端完成消息写入,就等待服务端读取这些消息并返回应答。

    rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse) {
    }
    

    3.4 双向流式 RPC

    即两边都可以分别通过一个读写数据流来发送一系列消息。

    rpc BidiHello(stream HelloRequest) returns (stream HelloResponse){
    }
    

    4. 其他概念

    4.1 超时时间

    gRPC 允许客户端在调用一个远程方法前指定一个最后期限值。

    4.2 终止/取消 RPC 调用

    客户端或者服务端都可以再任何时间取消一个 RPC 调用

    4.2 RPC 生命周期

    一个简单的 RPC 形式:客户端发出单个请求,获得单个响应。

    • (1) 客户端通过桩(Stub)调用一个方法,服务端会得到相关通知 ,通知包括客户端的元数据,方法名,允许的响应期限(如果可以的话)
    • (2) 服务端既可以在任何响应之前直接发送回初始的元数据,也可以等待客户端的请求信息,到底哪个先发生,取决于具体的应用。
    • (3) 服务端获得客户端的请求信息后,处理消息和组装响应消息内容。如果执行成功的话,它的响应会和包含状态码,可选的状态信息,可选的追踪信息一起返回给客户端 。
    • (4) 假如状态是 OK 的话,客户端会得到应答,则束客户端调用。

    5. 参考

    quickstart
    https://www.grpc.io/docs/quickstart/go/

    基本概念
    https://www.grpc.io/docs/guides/concepts/

    指南
    https://www.grpc.io/docs/guides/

    https://www.grpc.io/docs/guides/concepts/

    gRPC 官方文档中文版
    http://doc.oschina.net/grpc?t=57966

    END

    相关文章

      网友评论

          本文标题:gRPC学习笔记1 - 简单介绍

          本文链接:https://www.haomeiwen.com/subject/fgoxphtx.html