广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Grpc 跨语言远程调用 python
  • 710
分享到

Grpc 跨语言远程调用 python

语言Grpcpython 2023-01-31 02:01:06 710人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

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

grpc介绍

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

在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。因为 gRPC 对 Http/2 协议的支持使其在 AndroidiOS 等客户端后端服务的开发领域具有良好的前景。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.jsPython、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

--结束END--

本文标题: Grpc 跨语言远程调用 python

本文链接: https://www.lsjlt.com/news/186166.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Grpc 跨语言远程调用 python
    grpc介绍 gRPC 一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。 在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用...
    99+
    2023-01-31
    语言 Grpc python
  • 怎么用Python语言的grpc实现消息传送
    这篇“怎么用Python语言的grpc实现消息传送”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么用Python语言的gr...
    99+
    2023-07-05
  • go语言调用python
    https://github.com/google/grumpy go语言调用python 的github ...
    99+
    2023-01-31
    语言 python
  • Python怎么调用R语言
    这篇文章给大家分享的是有关Python怎么调用R语言的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。rpy2是Python调用R程序的模块,旨在方便Python调用R中的相关函数,而不需要先将数据写入txt再传给R...
    99+
    2023-06-14
  • C语言程序怎么调用Python函数
    本篇文章为大家展示了C语言程序怎么调用Python函数,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python脚本,存为pytest.pydef add(a,b):  ...
    99+
    2023-06-17
  • c语言跨文件调用变量怎么实现
    在C语言中,如果需要跨文件调用变量,可以通过使用`extern`关键字来实现。 假设有两个文件`file1.c`和`file2.c`...
    99+
    2023-10-27
    c语言
  • C语言中程序如何调用Python脚本
    目录一、环境配置0x00 平台0x01 添加 包含目录 和 库目录0x02 添加依赖项二、案例三、常用API有时候在写C语言程序的时候又想利用一下pyt...
    99+
    2022-11-12
  • Go语言中net包RPC远程调用方式有哪些
    这篇文章主要介绍Go语言中net包RPC远程调用方式有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、服务端在代码中,启动了三个服务package mainimport ("log...
    99+
    2023-06-25
  • python 调用c语言方法详解
      Python是一种强大的编程语言, Python在代码的编写中可以使用任何一种编程语言,可以利用其内置函数或模块来完成自己的任务。但是在 Python中调用其他语言的程序时,需要有特定的环境,例如:C、C++等。 在 python中调...
    99+
    2023-09-13
    python c语言 pycharm
  • Python调用R语言实例讲解
    网络上经常看到有人问数据分析是学习Python好还是R语言好,还有一些争论Python好还是R好的文章。每次看到这样的文章我都会想到李舰和肖凯的《数据科学中的R语言》,书中一直强调,...
    99+
    2022-11-11
  • C#跨PC远程调用程序并显示UI界面
    在项目中有一个需求是需要在局域网内跨PC远程调用一个程序,并且要求有界面显示,调查了一些资料,能实现远程调用的.Net技术大概有PsExec、WMI、Schedule Task。 这...
    99+
    2022-11-13
  • c语言怎么调用多线程
    在C语言中,可以使用线程库来调用多线程。C语言标准库并不直接提供多线程支持,但是你可以使用第三方库如POSIX threads(pt...
    99+
    2023-09-15
    c语言
  • 通过 Redis 实现 RPC 远程方法调用(支持多种编程语言)
    我发现经常研究并且为之兴奋的一件事就是对系统进行扩展。现在这对不同的人有着不同的意思。作为移植Monolithic应用到Microservices架构方法中的一部分,如何处理Microservices架构是...
    99+
    2022-06-04
    编程语言 多种 方法
  • python调用易语言编写的dll文件
     目前易语言编写的dll文件都是32位的dll,所以必须用32位的python去调用。     32位的dll必须用32位的python调用,64位的dll必须用64位的python调用。 原因如下:     在64位的windows系统...
    99+
    2023-01-31
    文件 易语言 python
  • c语言多线程库怎么调用
    在C语言中,可以使用pthread库来进行多线程编程。以下是一个简单的多线程程序示例:```c#include #include #...
    99+
    2023-09-21
    c语言
  • c语言主程序怎么调用子程序
    在C语言中,主程序可以通过函数调用的方式来调用子程序。以下是一个简单的示例:```c#include // 声明子程序void su...
    99+
    2023-10-12
    c语言
  • Python怎么调用自然语言处理包pyhanlp
    本篇内容主要讲解“Python怎么调用自然语言处理包pyhanlp ”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python怎么调用自然语言处理包pyhanlp ”吧!一句话安装pyhanlp...
    99+
    2023-06-02
  • c语言怎么调用python函数返回值
    在c语言中调用python函数返回值,具体方法如下:void test1() { Py_Initialize();//初始化python getcurrent(); PyObject *pModule = NULL, *pFunc = NU...
    99+
    2022-10-14
  • Go语言net包RPC远程调用三种方式http与json-rpc及tcp
    目录一、服务端二、http客户端三、TCP客户端四、json客户端五、运行结果rpc有多种调用方式,http、json-rpc、tcp 一、服务端 在代码中,启动了三个服务 pa...
    99+
    2022-11-12
  • Python编程语言比C语言编程好用的理由是什么
    Python编程语言比C语言编程好用的理由是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。我们大家都知道Python编程语言在实际的运行中可以把相关程序分解为模块,但是...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作