Python3 集成 gRPC 服务

2024-08-21 04:04
文章标签 服务 集成 python3 grpc

本文主要是介绍Python3 集成 gRPC 服务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Python3 集成 gRPC 服务及 protocol buffers

    • 1、gRPC是什么?
      • 1.1、gRPC大致请求流程
      • 1.2、gRPC特性
      • 1.3、gRPC优势和劣势
        • 1.3.1、优势
        • 1.3.2、劣势
    • 2、构建一个python3的gRPC服务
      • 2.1、虚拟环境搭建(可选择自动安装pip)
      • 2.1、引入相关依赖
      • 2.2、创建项目
        • 2.2.1、项目整体结构
      • 2.3、编写proto
      • 2.4、将example.proto文件编译成python文件
      • 2.5、 执行后将在~/grpc_example/proto文件下新增3个文件
      • 2.6、 编写服务端
      • 2.7、编写客户端
      • 2.8、启动服务端
      • 2.9、启动客户端
    • 3、运行效果展示
      • 3.1、服务端效果
      • 3.2、客户端效果
    • 4、gRPC官网地址

1、gRPC是什么?

  • 在说gRPC之前,我们先说REST通信。当前在设计软件产品的时候,开发人员可能接触的更多的是基于REST的通信。REST通信是非常灵活的一种方式,将资源发布在网络,由客户端通过http或者http2协议与资源进行交互,现在的微服务基本上都是运用这种技术框架。而RPC是和REST不同的一种通信架构。

  • RPC 最终的效果是让开发人员的可以像调用本地方法一样调用远程服务提供的方法。gRPC是RPC的一种,目前许多公司按照自己的需求和需要设计了自己的RPC通信架构,gRPC就是由谷歌研发的一个RPC通信框架。g代表global全球化的意思。它是一种高性能、支持多种开发语言的通信架构。

1.1、gRPC大致请求流程

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

2、对请求信息使用 Protobuf 进行对象序列化。

3、服务端(gRPC Server)接收到请求后,反序列化请求信息,进行业务逻辑处理并返回。

4、对响应结果使用 Protobuf 进行对象序列化。

5、客户端接受到服务端响应,反序列化返回的信息。回调被调用的 A 方法,唤醒正在等待响应(阻塞)的客户端调用并返回响应结果。
gRPC请求流程

1.2、gRPC特性

  • grpc可以跨语言使用。支持多种语言 支持C++、Java、Go、Python、Ruby、C#、Node.js、Android Java、Objective-C、PHP等编程语言

  • 基于 IDL ( 接口定义语言(Interface Define Language))文件定义服务,通过 proto3 工具生成指定语言的数据结构、服务端接口以及客户端Stub;

  • 通信协议基于标准的 HTTP/2 设计,支持·双向流、消息头压缩、单 TCP 的多路复用、服务端推送等特性,这些特性使得 gRPC 在移动端设备上更加省电和节省网络流量;

  • 序列化支持 PB(Protocol Buffer)和 JSON,PB 是一种语言无关的高性能序列化框架,基于 HTTP/2 + PB, 保障了 RPC 调用的高性能。

  • 安装简单,扩展方便(用该框架每秒可达到百万个RPC)

1.3、gRPC优势和劣势

1.3.1、优势
  • Protobuf序列化和反序列化的速度,是JSON的5倍。
  • gRPC是为HTTP/2而设计的,它是HTTP的一个主要版本,与HTTP 1.x相比具有显著的性能优势:二进制框架和压缩。HTTP/2协议在发送和接收方面都很紧凑和高效。通过单个TCP连接复用多个HTTP/2调用。多路复用消除了线头阻塞。
1.3.2、劣势
  • 浏览器支持有限,

  • 当下,不可能直接从浏览器调用gRPC服务。gRPC大量使用HTTP/2功能,没有浏览器提供支持gRPC客户机的Web请求所需的控制级别。gRPC Web并非支持所有gRPC功能。不支持客户端和双向流,并且对服务器流的支持有限。

  • 不是人类可读的

  • HTTP API请求以文本形式发送,可以由人读取和创建。

  • 但它的二进制格式是不可读的。

2、构建一个python3的gRPC服务

步骤:

  1. 引入相关依赖
  2. 编写protobuf
  3. 将protobuf转成python代码
  4. 开发gRPC服务

2.1、虚拟环境搭建(可选择自动安装pip)

  • 创建虚拟环境
- 自动安装pip执行命令:
python3 -m venv myenv- 手动pip执行命令:
python3 -m venv --without-pip myenv
  • 启动虚拟环境
source /xxx/xxx/myenv/bin/activate
  • 手动安装pip
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
sudo python3 get-pip.py

2.1、引入相关依赖

通过pip3安装对应的包

pip3 install grpcio-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip3 install grpcio -i https://pypi.tuna.tsinghua.edu.cn/simple/

2.2、创建项目

mkdir -P ~/grpc_example/{proto,client,server}
2.2.1、项目整体结构

项目整体结构

2.3、编写proto

vim ~/grpc_example/proto/example.proto

syntax = "proto3";package your_package_name;message YourRequest {string name = 1;
}message YourResponse {string message = 1;
}service YourService {rpc YourRPCMethod (YourRequest) returns (YourResponse);
}

2.4、将example.proto文件编译成python文件

python3 -m  grpc_tools.protoc -I ./proto --python_out=./proto --pyi_out=./proto --grpc_python_out=./proto proto/example.proto

2.5、 执行后将在~/grpc_example/proto文件下新增3个文件

example_pb2.py
example_pb2_grpc.py
example_pb2.pyi

2.6、 编写服务端

vim ~/grpc_example/client/client.py

# -*- coding:utf-8 -*-
import sys
import pathlibabspathfile = pathlib.Path(__file__)
package_path = abspathfile.absolute().parent.parent.parent
sys.path.append(str(package_path))import grpc
from concurrent import futures
from example.proto import example_pb2
from example.proto import example_pb2_grpcclass YourService(example_pb2_grpc.YourServiceServicer):def YourRPCMethod(self, request, context):name = request.name# 实现自己的RPC方法逻辑response = example_pb2.YourResponse()response.message = "Hello, " + nameprint("response", response)return responsedef serve():server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))example_pb2_grpc.add_YourServiceServicer_to_server(YourService(), server)server.add_insecure_port("[::]:50051")print("开启服务")server.start()server.wait_for_termination()if __name__ == '__main__':serve()

2.7、编写客户端

vim ~/grpc_example/server/server.py

# -*- coding:utf-8 -*-
import sys
import pathlibabspathfile = pathlib.Path(__file__)
package_path = abspathfile.absolute().parent.parent.parent
sys.path.append(str(package_path))import grpc
from example.proto import example_pb2
from example.proto import example_pb2_grpcdef run():channel = grpc.insecure_channel("localhost:50051")stub = example_pb2_grpc.YourServiceStub(channel)request = example_pb2.YourRequest()request.name = "zsc"# 设置请求参数response = stub.YourRPCMethod(request)print("response", response)if __name__ == '__main__':run()

2.8、启动服务端

python3 ~/grpc_example/server/server.py

2.9、启动客户端

python3 ~/grpc_example/client/client.py

3、运行效果展示

3.1、服务端效果

服务端

3.2、客户端效果

客户端

4、gRPC官网地址

  • gRpc官网地址:https://www.grpc.io

  • gRpc中文文档地址:http://doc.oschina.net/grpc

这篇关于Python3 集成 gRPC 服务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092061

相关文章

MyBatis-Plus 与 Spring Boot 集成原理实战示例

《MyBatis-Plus与SpringBoot集成原理实战示例》MyBatis-Plus通过自动配置与核心组件集成SpringBoot实现零配置,提供分页、逻辑删除等插件化功能,增强MyBa... 目录 一、MyBATis-Plus 简介 二、集成方式(Spring Boot)1. 引入依赖 三、核心机制

SpringBoot集成P6Spy的实现示例

《SpringBoot集成P6Spy的实现示例》本文主要介绍了SpringBoot集成P6Spy的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录本节目标P6Spy简介抛出问题集成P6Spy1. SpringBoot三板斧之加入依赖2. 修改

解决若依微服务框架启动报错的问题

《解决若依微服务框架启动报错的问题》Invalidboundstatement错误通常由MyBatis映射文件未正确加载或Nacos配置未读取导致,需检查XML的namespace与方法ID是否匹配,... 目录ruoyi-system模块报错报错详情nacos文件目录总结ruoyi-systnGLNYpe

springboot项目中集成shiro+jwt完整实例代码

《springboot项目中集成shiro+jwt完整实例代码》本文详细介绍如何在项目中集成Shiro和JWT,实现用户登录校验、token携带及接口权限管理,涉及自定义Realm、ModularRe... 目录简介目的需要的jar集成过程1.配置shiro2.创建自定义Realm2.1 LoginReal

SpringBoot集成Shiro+JWT(Hutool)完整代码示例

《SpringBoot集成Shiro+JWT(Hutool)完整代码示例》ApacheShiro是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,在现代应用开发中,Shiro因... 目录一、背景介绍1.1 为什么使用Shiro?1.2 为什么需要双Token?二、技术栈组成三、环境

Java 与 LibreOffice 集成开发指南(环境搭建及代码示例)

《Java与LibreOffice集成开发指南(环境搭建及代码示例)》本文介绍Java与LibreOffice的集成方法,涵盖环境配置、API调用、文档转换、UNO桥接及REST接口等技术,提供... 目录1. 引言2. 环境搭建2.1 安装 LibreOffice2.2 配置 Java 开发环境2.3 配

SpringBoot集成EasyExcel实现百万级别的数据导入导出实践指南

《SpringBoot集成EasyExcel实现百万级别的数据导入导出实践指南》本文将基于开源项目springboot-easyexcel-batch进行解析与扩展,手把手教大家如何在SpringBo... 目录项目结构概览核心依赖百万级导出实战场景核心代码效果百万级导入实战场景监听器和Service(核心

Nginx进行平滑升级的实战指南(不中断服务版本更新)

《Nginx进行平滑升级的实战指南(不中断服务版本更新)》Nginx的平滑升级(也称为热升级)是一种在不停止服务的情况下更新Nginx版本或添加模块的方法,这种升级方式确保了服务的高可用性,避免了因升... 目录一.下载并编译新版Nginx1.下载解压2.编译二.替换可执行文件,并平滑升级1.替换可执行文件

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick