grpc例子

什么是RPC

RPC(Remote Procedure Call Protocol)-- 远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络协议的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

 

什么是gRPC

gRPC 是Google开源的一款高性能的 RPC 框架,它基于 ProtoBuf 序列化协议进行开发,支持多种开发语言(Golang、Python、Java、C/C++等)。gRPC 提供了一种简单的方法来定义服务,同时客户端可以充分利用 HTTP/2 stream 的特性,从而有助于节省带宽、降低 TCP 的连接次数、节省CPU的使用等。

 

本文参考官方文档[grpc.html],以及gRPC的GitHub开源项目grpc/grpc。并通过一个小demo展示框架用法。

安装gRPC及gRPC工具

pip install grpcio
pip install grpcio-tools

grpcio-tools包含了protobuf的编辑工具 protoc,用来根据 .proto 服务定义生成服务器端和客户端代码。

 

自定义 gRPC 接口

假定这里我们需要定义一个数据接收服务Receiver,用来接收客户端传递给服务器端的数据。

syntax = "proto3";
import "google/protobuf/struct.proto";// 服务定义
service Receiver {rpc receive (Event) returns (Reply) {}
}// 接收消息定义
message Event {string appid = 1;int32 xwhen = 2;string xwho = 3;string xwhat = 4;google.protobuf.Struct xcontext = 5;
}// 返回消息定义
message Reply {int32 status = 1;string message = 2;
}

 

编译 proto 文件生成服务接口

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

这里会生成两个python文件:

receiver_pb2.py
receiver_pb2_grpc.py

 

编写Server端代码

# _*_ coding: utf-8 _*_import grpc
import receiver_pb2
import receiver_pb2_grpcimport time
from concurrent import futures_ONE_DAY_IN_SECONDS = 60 * 60 * 24class Receiver(receiver_pb2_grpc.ReceiverServicer):# 重写父类方法,返回消息def receive(self, request, context):print('request:', request)return receiver_pb2.Reply(message='Hello, %s!' % request.xwho)if __name__ == '__main__':server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))receiver_pb2_grpc.add_ReceiverServicer_to_server(Receiver(), server)server.add_insecure_port('[::]:50051')server.start()print('server start...')try:while True:time.sleep(_ONE_DAY_IN_SECONDS)except KeyboardInterrupt:server.stop(0)

 

编写client端代码

# _*_ coding: utf-8 _*_import grpc
import receiver_pb2
import receiver_pb2_grpc
from google.protobuf import struct_pb2def run():channel = grpc.insecure_channel('localhost:50051')stub = receiver_pb2_grpc.ReceiverStub(channel)# 自定义struct结构struct = struct_pb2.Struct()struct['idfa'] = 'idfa1'struct['amount'] = 123response = stub.receive(receiver_pb2.Event(xwhat='install', appid='fuckgod', xwhen=123, xwho='jerry', xcontext=struct))print("client status: %s received: %s" % (response.status, response.message))if __name__ == '__main__':run()

 

测试流程

(1)启动server:python server.py &

(2)运行client.py发送消息

server输出:

server start...
request: 
appid: "fuckgod"
xwhen: 123
xwho: "jerry"
xwhat: "install"
xcontext {fields {key: "amount"value {number_value: 123.0}}fields {key: "idfa"value {string_value: "idfa1"}}
}

client输出:

client status: 0 received: Hello, jerry!

表示测试成功。

转载自https://zhuanlan.zhihu.com/p/37158888

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568567.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【股票】融资融券基本概念

融资融券交易(securities margin trading)又称“证券信用交易”或保证金交易,2008年4月23日国务院颁布的《证券公司监督管理条例》对融资融券做了如下定义:融资融券业务,是指在证券交易所或者国务院批准的其他证券交易场所进行的证券交易中&a…

python 字符串中特定字符替换,截取

特定字符串替换 t2018-08-07 t1t.replace(-,) print(t1) #输出为20180807 字符串截取与拼接 pathE:/项目/Djangocode/RSMDSys/static/imagedata/1535974092.287188.jpg path1path.split(/) print(path1:,path1) path2path.split(/,4) print(path2:,path2) print(type(path2…

【性能测试】性能测试的基础理论

转发自博客园贺满:https://www.cnblogs.com/puresoul/p/5456855.html ,有删减。 随着软件行业的快速发展,现代的软件系统越来越复杂,功能越来越多,测试人员除了需要保证基本的功能测试质量,性能也随越来越受…

MySQL 处理插入重主键唯一键重复值办法

本篇文章主要介绍在插入数据到表中遇到键重复避免插入重复值的处理方法,主要涉及到IGNORE,ON DUPLICATE KEY UPDATE,REPLACE;接下来就分别看看这三种方式的处理办法。 IGNORE 当使用INSERT语句向表中添加一些行数据并且在处理期间发生错误时,…

【性能测试】性能测试的基本流程

转发自博客园贺满:https://www.cnblogs.com/puresoul/p/5463477.html,有删减。 本文主要介绍下性能测试的基本流程,性能测试从实际执行层面来看,测试的过程一般分为这么几个阶段,如下图: 下面分别介绍下每个…

python logging模块学习

python 的日志logging模块学习 1.简单的将日志打印到屏幕 import logging logging.debug(This is debug message) logging.info(This is info message) logging.warning(This is warning message) 屏幕上打印: WARNING:root:This is warning message 默认情况下,…

【性能测试】性能测试工具选择

转发自博客园贺满:https://www.cnblogs.com/puresoul/p/5503134.html,有删减。 本篇文章主要简单总结下性能测试工具的原理以及如何选型。性能测试和功能测试不同,性能测试的执行是基本功能的重复和并发,需要模拟多用户&#xff0…

python 将图片与字符串相互转换

import base64 image1.jpg#将图片encode为二进制字符串方法一 with open(image,rb) as f:strbase64.b64encode(f.read()) print(type(str))#将图片encode为二进制字符串方法二 fopen(image,rb) f_strbase64.b64encode(f.read()) f.close() print(type(f_str))#将二进制字符串&a…

【测试工具】禅道项目管理工具设置触发邮箱

禅道支持邮件提醒,当需求、任务、bug等发生变化的时候,可以发邮件提醒。 禅道提醒邮件默认通知范围(禅道9.8版本,可以在 后台-消息-设置中设置哪些动作需要发信): 1、Bug:指派给抄送 添加&#…

python文件地址拼接

方法一: jmeter_config os.path.join(os.getcwd(), rconf/config.jmx)#运行结果 #E:\项目\gRPC\test #E:\项目\gRPC\test\conf/config.jmx 方法二: file_address "./fileimage/" image r".jpg" print(file_address) #运行结果…

【性能测试】Linux系统监控-Top命令

前面转载的三篇文章主要介绍了性能测试的相关概念,其中有提到服务器,服务器的配置是性能测试中必须考虑的,而且性能测试中也必须监控服务器。 这篇文章主要介绍一下如何通过Linux服务器自带的top命令监控运行情况,以下是直接top命…

【性能测试】Linux系统监控-CPU信息

我们知道CPU对于服务器来说非常重要,下面我们从几个方面介绍linux服务器CPU相关信息: 先要理解以下几个概念: 1、一台物理机的物理CPU的个数 2、一个CPU上的核数 3、一个核上面支持的线程数 有下面的计算公式: 总核数 物理C…

python json文件传输图片

第一步、将图片转为str image1.jpg print(type(image)) def imageToStr(image):with open(image,rb) as f:image_bytebase64.b64encode(f.read())print(type(image_byte))image_strimage_byte.decode(ascii) #byte类型转换为strprint(type(image_str))return image_str image1…

python时间time模块介绍

先看几个概念: 时间戳:从1970年1月1日00:00:00开始按秒计算的偏移量。举个例子,现在是2017年6月11的下午16:54:32,那么print(time.time())输出的值是1497171320.99就代表现在的时间戳。 元组(struct_time)…

【Linux】Linux简介以及 与UNIX区别

一直以来对Linux、Unix、linux内核、linux发行版的概念比较模糊,最近查找资料并经过自己的整理,主要总结了Linux和UNIX的区别和联系、内核和操作系统的关系、Linux操作系统和结构、发行版本CentOS介绍。 Linux 和 UNIX 的关系/区别 Linux 是一个类似 U…

python 数据库查询返回list或tuple

MySQLdb默认查询结果都是返回tuple,输出时候不是很方便,必须按照0,1这样读取,无意中在网上找到简单的修改方法,就是传递一个cursors.DictCursor就行。 默认程序: import MySQLdb db MySQLdb.connect(ho…

【视频】视频文件格式和视频编码

我们经常在电脑、电视、手机或者其他终端产品看视频,我们对视频有个大概了解,比如清晰度、大小、视频类型等,但是对于视频内部结构我们应该一无所知,现在我们来一步一步解开视频的神秘面纱。 首先大家要清楚两个概念,视…

python list,str的拼接与转换

一、str转换为list <list> <str>.split(<separator>) <str>: 需要进行分隔提取的字符串 <separator>&#xff1a;从<str2>提取元素时依据的分隔符&#xff0c;一般也是一个str类型&#xff0c;如, <list>: 返回值&#xff0c;lis…

【文字识别】Python3使用百度AI进行文字识别

将图片翻译成文字一般被称为光学文字识别&#xff08;Optical Character Recognition&#xff0c;OCR&#xff09;。可以实现OCR 的底层库并不多&#xff0c;目前很多库都是使用共同的几个底层OCR 库&#xff0c;或者是在上面进行定制。 Tesseract 是一个OCR 库&#xff0c;目前…

no connection could be made because the target machine actively refused it.问题解决

第一步&#xff1a;查看端口占用情况netstat -ano 第二步&#xff1a;关闭两台电脑的360&#xff0c;防火墙 第三歩&#xff1a;查看端口。若为两台电脑之间通信。则应使用服务器这台电脑的ip进行连接。利用ipconfig查看本机ip&#xff08;Ipv4地址&#xff09; 因为127.0.0…