我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Grpc 跨语言远程调用 python

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Grpc 跨语言远程调用  python

grpc介绍

gRPC 一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。

在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。因为 gRPC 对 HTTP/2 协议的支持使其在 Android、IOS 等客户端后端服务的开发领域具有良好的前景。gRPC 提供了一种简单的方法来定义服务,同时客户端可以充分利用 HTTP2 stream 的特性,从而有助于节省带宽、降低 TCP 的连接次数、节省CPU的使用等。

Grpc 跨语言远程调用  python demo

特性

  • 基于HTTP/2

    • HTTP/2 提供了连接多路复用、双向流、服务器推送、请求优先级、首部压缩等机制。可以节省带宽、降低TCP链接次数、节省CPU,帮助移动设备延长电池寿命等。gRPC 的协议设计上使用了HTTP2 现有的语义,请求和响应的数据使用HTTP Body 发送,其他的控制信息则用Header 表示。
  • IDL使用ProtoBuf

    • gRPC使用ProtoBuf来定义服务,ProtoBuf是由Google开发的一种数据序列化协议(类似于XML、JSON、hessian)。ProtoBuf能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面。压缩和传输效率高,语法简单,表达力强。
  • 多语言支持 ( C, C++, Python, PHP, Nodejs, C#, Objective-C、Golang、Java)

    • gRPC支持多种语言,并能够基于语言自动生成客户端和服务端功能库。目前已提供了C版本grpc、Java版本grpc-java 和 Go版本grpc-go,其它语言的版本正在积极开发中,其中,grpc支持C、C++、Node.js、Python、Ruby、Objective-C、PHP和C#等语言,grpc-java已经支持Android开发。

gRPC已经应用在Google的云服务和对外提供的API中,其主要应用场景如下:

  • 低延迟、高扩展性、分布式的系统
  • 同云服务器进行通信的移动应用客户端
  • 设计语言独立、高效、精确的新协议
  • 便于各方面扩展的分层设计,如认证、负载均衡、日志记录、监控等

gRPC优缺点:

优点:

protobuf二进制消息,性能好/效率高(空间和时间效率都很不错)
proto文件生成目标代码,简单易用
序列化反序列化直接对应程序中的数据类,不需要解析后在进行映射(XML,JSON都是这种方式)
支持向前兼容(新加字段采用默认值)和向后兼容(忽略新加字段),简化升级
支持多种语言(可以把proto文件看做IDL文件)

Netty等一些框架集成

缺点:
  • GRPC尚未提供连接池,需要自行实现

  • 尚未提供“服务发现”、“负载均衡”机制

  • 因为基于HTTP2,绝大部多数HTTP Server、Nginx都尚不支持,即Nginx不能将GRPC请求作为HTTP请求来负载均衡,而是作为普通的TCP请求。(nginx1.9版本已支持)

  • Protobuf二进制可读性差(貌似提供了Text_Fromat功能)
  • 默认不具备动态特性(可以通过动态定义生成消息类型或者动态编译支持)

grpc坑:

http2只允许单个链接传输10亿流数据。原因在于:  htt2使用31位×××标示流,服务端使用奇数,客户端使用偶数,所以总共10亿可用

解决思路:超过一定数量的流,需要重启链接。

gRPC通信方式

gRPC有四种通信方式:

1、 Simple RPC

简单rpc  这就是一般的rpc调用,一个请求对象对应一个返回对象 

proto语法:

rpc simpleHello(Person) returns (Result) {}

2、 Server-side streaming RPC

服务端流式rpc  一个请求对象,服务端可以传回多个结果对象 

proto语法 :

rpc serverStreamHello(Person) returns (stream Result) {}

3、 Client-side streaming RPC

客户端流式rpc  客户端传入多个请求对象,服务端返回一个响应结果 

proto语法 :

rpc clientStreamHello(stream Person) returns (Result) {}

4、 Bidirectional streaming RPC

双向流式rpc  结合客户端流式rpc和服务端流式rpc,可以传入多个对象,返回多个响应对象 

proto语法 :

rpc biStreamHello(stream Person) returns (stream Result) {}

服务定义及ProtoBuf

gRPC使用ProtoBuf定义服务, 我们可以一次性的在一个 .proto 文件中定义服务并使用任何支持它的语言去实现客户端和服务器,反过来,它们可以在各种环境中,从云服务器到你自己的平板电脑—— gRPC 帮你解决了不同语言及环境间通信的复杂性。使用 protocol buffers 还能获得其他好处,包括高效的序列号,简单的 IDL 以及容易进行接口更新。

gRPC 的安装: pip install grpcio

安装 ProtoBuf 相关的 python 依赖库: pip install protobuf

安装 python grpc 的 protobuf 编译工具: pip install grpcio-tools

新建data.proto文件,定义传输的数据格式和grpc服务要实现的函数

syntax = "proto3";
package example;

service FormatData {   //定义服务,用在rpc传输中
  rpc DoFormat(actionrequest) returns (actionresponse){}
}
message actionrequest {
  string text = 1;
}
message actionresponse{
  string text=1;
}

生成proto数据的python调用格式和grpc服务接口

在proto文件目录下 调用下列命令

python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. ./data.proto

会生成:data_pb2.py 与 data_pb2_grpc.py, 其中data_pb2.py是数据格式调用的文件,data_pb2_grpc.py是grpc传输协议接口调用的文件.

创建实现了grpc传输协议的服务器端

在服务器端代码中需要实现proto文件中编写的服务接口,并重写处理函数,将重写后的服务类实例化以后添加到grpc服务器中,这样创建的grpc服务器就可以实现自定义的proto传输服务了

# 实现了 server 端用于接收客户端发送的数据,并对数据进行大写处理后返回给客户端

# ! /usr/bin/env python
# -*- coding: utf-8 -*-
import grpc
import time
from concurrent import futures
from example import data_pb2, data_pb2_grpc

_ONE_DAY_IN_SECONDS = 60 * 60 * 24
_HOST = 'localhost'
_PORT = '8080'
import json

# 实现一个派生类,重写rpc中的接口函数.自动生成的grpc文件中比proto中的服务名称多了一个Servicer
class FormatData(data_pb2_grpc.FormatDataServicer):
    # 重写接口函数.输入和输出都是proto中定义的Data类型
    def DoFormat(self, request, context):
        str = request.text
        print(str, type(str))

        return data_pb2.actionresponse(text=json.dumps(str.upper()))  # 返回一个类实例

def serve():
    # 定义服务器并设置最大连接数,corcurrent.futures是一个并发库,类似于线程池的概念
    grpcServer = grpc.server(futures.ThreadPoolExecutor(max_workers=4))  # 创建一个服务器
    data_pb2_grpc.add_FormatDataServicer_to_server(FormatData(), grpcServer)  # 在服务器中添加派生的接口服务(自己实现了处理函数)
    grpcServer.add_insecure_port(_HOST + ':' + _PORT)  # 添加监听端口
    grpcServer.start()  # 启动服务器
    try:
        while True:
            time.sleep(_ONE_DAY_IN_SECONDS)
    except KeyboardInterrupt:
        grpcServer.stop(0)  # 关闭服务器

if __name__ == '__main__':
    serve()

创建实现能识别proto数据类和实现grpc传输协议.

# 实现了客户端用于发送数据并打印接收到 server 端处理后的数据

# ! /usr/bin/env python
# -*- coding: utf-8 -*-
import grpc
from example import data_pb2, data_pb2_grpc

_HOST = 'localhost'
_PORT = '8080'
import json

def run():
    conn = grpc.insecure_channel(_HOST + ':' + _PORT)  # 监听频道
    print(conn)
    client = data_pb2_grpc.FormatDataStub(channel=conn)  # 客户端使用Stub类发送请求,参数为频道,为了绑定链接
    print(client)
    data = {'name': 'xjt', 'age': 18}
    response = client.DoFormat(data_pb2.actionrequest(text=json.dumps(data)))  # 返回的结果就是proto中定义的类
    print("received: " + response.text)

if __name__ == '__main__':
    run()

客户端链接的主机号和端口号,必须是服务器创建的主机号和端口号.

先运行服务端,在运行客户端,结果如下:

client.py

Grpc 跨语言远程调用  python demo

server.py

Grpc 跨语言远程调用  python demo

最终目录结构

Grpc 跨语言远程调用  python demo

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Grpc 跨语言远程调用 python

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Grpc 跨语言远程调用 python

grpc介绍gRPC 一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服
2023-01-31

go语言调用python

https://github.com/google/grumpygo语言调用python 的github
2023-01-31

怎么用Python语言的grpc实现消息传送

这篇“怎么用Python语言的grpc实现消息传送”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么用Python语言的gr
2023-07-05

C语言程序怎么调用Python函数

本篇文章为大家展示了C语言程序怎么调用Python函数,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python脚本,存为pytest.pydef add(a,b): print "in pyth
2023-06-17

Python怎么调用R语言

这篇文章给大家分享的是有关Python怎么调用R语言的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。rpy2是Python调用R程序的模块,旨在方便Python调用R中的相关函数,而不需要先将数据写入txt再传给R
2023-06-14

c语言如何调用python

从 c 语言调用 python 代码有两种方式:直接嵌入 python 解释器或使用 python c 扩展库。前者通过 py_initialize() 初始化解释器、pyrun_simplestring() 运行代码和 py_finali
c语言如何调用python
2024-05-22

c语言跨文件调用变量怎么实现

在C语言中,如果需要跨文件调用变量,可以通过使用`extern`关键字来实现。假设有两个文件`file1.c`和`file2.c`,需要在`file2.c`中调用`file1.c`中定义的变量。首先,在`file1.c`中定义一个全局变
2023-10-27

Go语言中net包RPC远程调用方式有哪些

这篇文章主要介绍Go语言中net包RPC远程调用方式有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、服务端在代码中,启动了三个服务package mainimport ("log""net""net/http
2023-06-25

c语言怎么调用多线程

在C语言中,可以使用线程库来调用多线程。C语言标准库并不直接提供多线程支持,但是你可以使用第三方库如POSIX threads(pthread)库或Windows线程库等来实现多线程编程。下面是一个使用POSIX threads库进行多线程
2023-09-15

通过 Redis 实现 RPC 远程方法调用(支持多种编程语言)

我发现经常研究并且为之兴奋的一件事就是对系统进行扩展。现在这对不同的人有着不同的意思。作为移植Monolithic应用到Microservices架构方法中的一部分,如何处理Microservices架构是我研究RPC的原因。 RPC(或者
2022-06-04

c语言多线程库怎么调用

在C语言中,可以使用pthread库来进行多线程编程。以下是一个简单的多线程程序示例:```c#include #include #define NUM_THREADS 5// 线程函数void* threadFunction(void*
2023-09-21

python调用易语言编写的dll文件

目前易语言编写的dll文件都是32位的dll,所以必须用32位的python去调用。    32位的dll必须用32位的python调用,64位的dll必须用64位的python调用。原因如下:    在64位的windows系统中,一个6
2023-01-31

c语言主程序怎么调用子程序

在C语言中,主程序可以通过函数调用的方式来调用子程序。以下是一个简单的示例:```c#include // 声明子程序void subprogram();// 主程序int main() {printf("主程序\n");// 调用子程序s
2023-10-12

python程序调用远程服务的方法

小编给大家分享一下python程序调用远程服务的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言项目是基于python3的PC桌面项目。因为需要对外发布we
2023-06-07

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录