在linux用python搭建grpc服务

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

借鉴文章

https://blog.csdn.net/bocai_xiaodaidai/article/details/103958468


一、grpc简介

gRPC 是一款高性能、开源的 RPC 框架,产自 Google,基于 ProtoBuf 序列化协议进行开发,支持多种语言(Golang、Python、Java等),本篇只介绍 Python 的 gRPC 使用。因为 gRPC 对 HTTP/2 协议的支持使其在 Android、IOS 等客户端后端服务的开发领域具有良好的前景。gRPC 提供了一种简单的方法来定义服务,同时客户端可以充分利用 HTTP2 stream 的特性,从而有助于节省带宽、降低 TCP 的连接次数、节省CPU的使用等

二、使用步骤

1.引入库

代码如下(示例):

pip install grpcio #gRPC 的安装 
pip install protobuf  #ProtoBuf 相关的 python 依赖库
pip install grpcio-tools   #python grpc 的 protobuf 编译工具

2.项目目录

目录如下(示例):
在这里插入图片描述

3.创建文件

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

grpc是一套传输协议,我们需要在底层实现这套传输协议.当然这些工作都已经被做完了,所以我们只要学会使用一个具有grpc传输协议的服务器和在客户端上调用grpc传输协议传输数据就可以了.

grpc传输协议传输的数据类型为protobuf数据.ProtoBuf是由Google开发的一种数据序列化协议(类似于XML、JSON、hessian)。ProtoBuf能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面。压缩和传输效率高,语法简单,表达力强。
所以grpc都是和protobuf一块使用。
在这里插入图片描述

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

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

先创建 base_package目录
然后运行

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

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

5.创建服务端

在服务器端代码中需要实现proto文件中定义的服务接口(FormatData),并重写处理函数(DoFormat),将重写后的服务类实例化以后添加到grpc服务器中.

这是在服务器linux配置的。目录一样,复制就行,没办法把目录设置源,就自己用sys加

import grpc
import time
import os
import sys
import datetime
import json
sys.path.append("/home/写自己地址/Shanmh/grpc")
sys.path.append("/home/写自己地址/Shanmh/grpc/base_package")
from concurrent import futures
from base_package import data_pb2, data_pb2_grpc

_ONE_DAY_IN_SECONDS = 60 * 60 * 24
_HOST = '192.168.6.222'#linux ip 示例
_PORT = '8080'


class FormatData(data_pb2_grpc.FormatDataServicer):
    # 重写接口函数
    def DoFormat(self, request, context):
        str = request.text
        person=json.loads(str)
        print("已经收到信息",person["name"])
        return data_pb2.actionresponse(text="received")  # 返回一个类实例


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:
            print("runing!!")
            time.sleep(3)
    except KeyboardInterrupt:
        grpcServer.stop(0)  # 关闭服务器


if __name__ == '__main__':
    serve()

6.客户端


```python
import grpc
from base_package import data_pb2, data_pb2_grpc
import os
import time
import json
_HOST = '192.168.6.222' #linux ip
_PORT = '8080'

person={"name":"zangsan","age":15}

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

if __name__ == '__main__':
    run()

可以看到是可以传送字典数据的


总结

先运行服务端,在运行客户端

本文借鉴后运行成功,留存备忘

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Python搭建gRPC,你需要按照以下步骤进行操作: 1. 首先,你需要定义一个.proto文件,该文件描述了你的服务和消息类型。你可以使用Protocol Buffers语言来定义.proto文件。例如,你可以创建一个名为hello.proto的文件来定义你的服务和消息类型。 2. 接下来,你需要使用gRPC的工具包来生成gRPC服务类。你可以使用以下命令来生成服务类: ``` python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. hello.proto ``` 这将生成一个名为hello_pb2.py的文件,其中包含你定义的消息类型,以及一个名为hello_pb2_grpc.py的文件,其中包含你定义的gRPC服务类。\[2\] 3. 如果你的.proto文件依赖其他.proto文件,你需要在生成服务类之前先生成这些依赖文件的服务类。你可以使用类似的命令来生成这些依赖文件的服务类。例如: ``` python -m grpc_tools.protoc -I. --python_out=../grpc_file --grpc_python_out=../grpc_file receivedata.proto ``` 这将生成一个名为receivedata_pb2.py的文件和一个名为receivedata_pb2_grpc.py的文件,用于处理receivedata.proto文件中定义的消息类型和gRPC服务类。\[1\] 4. 一旦你生成了gRPC服务类,你就可以在Python代码中使用它们来实现你的gRPC服务。你可以根据你的需求编写服务器端和客户端代码,并使用生成的服务类来处理请求和发送响应。 总结起来,要在Python搭建gRPC,你需要定义.proto文件,使用gRPC的工具包生成服务类,处理依赖文件的服务类,并在Python代码中使用生成的服务类来实现你的gRPC服务。\[2\]\[3\] #### 引用[.reference_title] - *1* [用python 搭建一个grpc服务](https://blog.csdn.net/m0_37772653/article/details/127785777)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [gRPC 框架 简单使用(python版)](https://blog.csdn.net/Java_KW/article/details/124334604)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [python如何实现GRPC服务python实现简单的grpc通信](https://blog.csdn.net/qq_36583400/article/details/126558846)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值