gRPC(Python)总结+踩坑记录

  总结一下在使用gRPC的过程中踩过的那些坑, 一定要仔细看官方文档!!!
  参考文档:
    Language Guide (proto3)
    Python Generated Code

1.前言

  出于项目需要,使用Python对gRPC进行二次开发。以前从没有接触过相关的概念,对于RPC、xml、json的了解也只限于听过名字的程度。初步接触gRPC的推荐阅读资源:
    gRPC官方(基本上所有资料都在这里,但全英文和一些专有名词看得我头疼)
    Protobuf3语言指南(中文翻译版)
    gRPC | Python视频教程
    grpc| python 实战 grpc
    python grpc框架之一 简单示例
    Carson带你学序列化:手把手带你分析 Protocol Buffer使用源码

2.开发流程

在这里插入图片描述
  使用如下命令将proto文件编译为两个可供二次开发使用的python文件(文件具体内容不用管,也不是很看得懂)

python -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. xxx.proto

xxx_pb2.py —— 和gRPC通信时双方交互的数据格式有关
xxx_pb2_grpc.py —— 和gRPC通信双方有关

  使用Python进行二次开发的时候直接调用这两个文件里的方法就行了。

3.proto具体语法

  proto3语法的官方文档
  中文翻译版本
  Generated-code reference(go语言版本中文翻译)

4.Python二次开发

  在使用Python进行gRPC的二次开发的时候,我们一般会自定义client和server,两者的主要目标如下:

5.gRPC拓展

  1.gRPC自定义Resolver(地址解析器)和Balancer(负载均衡器),不过好像是客户端做的,服务器端可以做吗?可以再看看。
  2.gRPC基于Http2.0,支持流式通信,多路复用。
  Http2.0多路复用
    多个流复用一个TCP连接;
    一个流代表了一个完整的请求-响应过程,流中的数据被分为具有同一ID的多个帧进行传输;
    一个域名只建立一条TCP连接。
  3.gRPC使用protobuf定义接口数据,二进制编码,减少需要传输的数据量(protobuf轻量:与json比较,json为key-value,每个key都占用多个字节,int类型固定字节数。protobuf使用tag,编号标记key,仅占一字节,支持Varint,数据按实际长度存储)

6.踩过的坑

bytes
  使用bytes()将变量转换为bytes类型时,有以下三种情况:
    如果是数字,则不需要指定编码方式;
    如果是string,则需要指定编码方式;
    如果是数组,则数组里的数字需要在0-256之间。

序列化/反序列化
  实际上转换为bytes类型时,应该使用SerializeToString()方法
在这里插入图片描述
  相应的,反序列化的时候使用ParseFromString()方法
在这里插入图片描述
   bytes&序列化/反序列化示例

6.线程池和并发RPC请求

在这里插入图片描述
  server方法里有两个和并发有关的参数,thread_pool和maximum_concurrent_rpcs。
在这里插入图片描述
  如果thread_pool中workers的数量小于maximum_concurrent_rpcs,则server能同时处理workers个RPC请求,其他的请求将进入等待队列,超过maximum_concurrent_rpcs数量的请求将直接被reject(参考链接)。
  以上图中的参数为例,虽然有4个worker,但server最多能同时处理2个并发RPC请求,其他的将直接被reject。
在这里插入图片描述
  如果不指定maximum_concurrent_rpcs的情况呢?是否可以处理无穷多个并发RPC请求?等待队列存储的并发请求有数量限制吗?超过此数量的并发请求是否会被直接reject?
  python gRPC有自己的并发api——Asyncio api,但是目前还处在测试阶段(2022年06月),双向流模式下连个example都没有。而且使用Python这种解释型语言进行gRPC开发的性能基本上是垫底的,当时被python迷了心窍吧,现在只能重新换其他语言进行开发了(go/java)。
  比较不同技术的 gRPC 性能
  gRPC性能比较

在这里插入图片描述

7.kafka消息队列

  原来打算使用消息队列提升服务器在高并发情况下的性能,但后来发现还是想得太简单了。
  Kafka基本概念
    topic——类似于数据库的表名,存储的是同一个topic的数据;
    partition——将数据分区,分别位于多个broker(服务器)上,实现负载均衡;
在这里插入图片描述
  win下运行kafka的流程
    官网下载,二进制版本;
    解压,cmd(bash会出错)进入解压后的文件夹;
    输入下列命令,启动zookeeper和kafka。

    .\bin\windows\zookeeper-server-start.bat .\config\zookeeper.properties
    .\bin\windows\kafka-server-start.bat .\config\server.properties



To be a sailor of the world bound for all ports.
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java + gRPC + grpc-gateway 的实践主要分为以下几个步骤: 1. 定义 proto 文件 在 proto 文件中定义需要调用的服务以及方法,同时指定请求和响应的数据类型。例如: ``` syntax = "proto3"; package example; service ExampleService { rpc ExampleMethod (ExampleRequest) returns (ExampleResponse) {} } message ExampleRequest { string example_field = 1; } message ExampleResponse { string example_field = 1; } ``` 2. 使用 protoc 编译 proto 文件 使用 protoc 编译 proto 文件,生成 Java 代码。例如: ``` protoc --java_out=./src/main/java ./example.proto ``` 3. 实现 gRPC 服务 在 Java 代码中实现定义的 gRPC 服务,例如: ``` public class ExampleServiceImpl extends ExampleServiceGrpc.ExampleServiceImplBase { @Override public void exampleMethod(ExampleRequest request, StreamObserver<ExampleResponse> responseObserver) { // 实现具体逻辑 ExampleResponse response = ExampleResponse.newBuilder().setExampleField("example").build(); responseObserver.onNext(response); responseObserver.onCompleted(); } } ``` 4. 启动 gRPC 服务器 使用 gRPC 提供的 ServerBuilder 构建 gRPC 服务器,并启动服务器。例如: ``` Server server = ServerBuilder.forPort(8080).addService(new ExampleServiceImpl()).build(); server.start(); ``` 5. 集成 grpc-gateway 使用 grpc-gateway 可以将 gRPC 服务转换为 HTTP/JSON API。在 proto 文件中添加以下内容: ``` import "google/api/annotations.proto"; service ExampleService { rpc ExampleMethod (ExampleRequest) returns (ExampleResponse) { option (google.api.http) = { post: "/example" body: "*" }; } } ``` 在 Java 代码中添加以下内容: ``` Server httpServer = ServerBuilder.forPort(8081).addService(new ExampleServiceImpl()).build(); httpServer.start(); String grpcServerUrl = "localhost:8080"; String httpServerUrl = "localhost:8081"; ProxyServerConfig proxyConfig = new ProxyServerConfig(grpcServerUrl, httpServerUrl, "/example"); HttpProxyServer httpProxyServer = new HttpProxyServer(proxyConfig); httpProxyServer.start(); ``` 6. 测试 使用 HTTP/JSON API 调用 gRPC 服务,例如: ``` POST http://localhost:8081/example Content-Type: application/json { "example_field": "example" } ``` 以上就是 Java + gRPC + grpc-gateway 的实践步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

carpe~diem

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值