python grpc例子_grpc实战示例

本文是一篇关于gRPC的Python实现教程,介绍了如何使用protobuf进行接口定义,创建gRPC服务器和客户端。通过示例展示了如何在Python中连接MySQL数据库,并进行数据操作。gRPC是一种高性能、开源的RPC框架,使用ProtoBuf(Protocol Buffers)作为接口描述语言。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

grpc 是rpc的一类。

grpc官网 : http://www.grpc.io/docs/tutorials/basic/python.html

序列化使用的是:https://developers.google.com/protocol-buffers/

cs模式,stub校验

四种模式,其实也就两种大模式有stream,没stream的;使用stream只不过是为了减少系统的开销

以下例子是python版,其它版体是大同小异

使用步聚:

1)定义IDL

syntax = "proto3";

package hello;

service Greeter {

rpc SayHello (HelloRequest) returns (stream HelloReply) {}

}

service ConnMysql {

rpc ConnectMysql (MyqlRequest) returns (MysqlResponse) {}

}

message HelloRequest {

string message = 1;

int64 age = 2;

}

message HelloReply {

string message = 1;

int64 age = 2;

}

message MyqlRequest {

string dbname = 1;

}

//连接mysql,响应返回值

message MysqlResponse {

repeated string selectlist = 1;

}

生成接口代码:

python -m grpc.tools.protoc -I=. --python_out=/Users/admin/devops/logCenter/logops/grpc/  --grpc_python_out=/Users/admin/devops/logCenter/logops/grpc/  proto/log.proto

生成的是一个log_pb2.py

2)写server端代码

# coding:utf-8

import log_pb2

from concurrent import futures

import grpc

import time

_ONE_DAY_IN_SECONDS = 60 * 60 * 24

import MySQLdb

class Greeter(log_pb2.GreeterServicer):

def SayHello(self, request, context):

try:

conn = MySQLdb.connect(

host='127.0.0.1',

port=3306,

user='root',

passwd='hugo',

db='jiraconnector'

)

cur = conn.cursor()

sqli = "insert into api_taskid (task_id,task_name,task_env,create_time) VALUES (%s,%s,%s,%s)"

cur.execute(sqli, (request.message, request.age, '4', '2016-06-20 06:54:28.488573'))

cur.close()

conn.commit()

conn.close()

print request.message

print request.age

yield log_pb2.HelloReply(message='hello hugo', age=10)

except Exception as e:

print e

class ConnMysql(log_pb2.ConnMysqlServicer):

def ConnectMysql(self, request, context):

print request.dbname

return log_pb2.MysqlResponse(selectlist='1')

def server():

server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))

log_pb2.add_GreeterServicer_to_server(Greeter(), server)

log_pb2.add_ConnMysqlServicer_to_server(ConnMysql(), server)

server.add_insecure_port('127.0.0.1:15000')

server.start()

try:

while True:

time.sleep(_ONE_DAY_IN_SECONDS)

except KeyboardInterrupt:

server.stop(0)

if __name__ == '__main__':

server()

3)写client端

# coding:utf-8

import grpc

import log_pb2

_TIMEOUT_SECONDS = 10

def run():

try:

# with log_pb2.beta_create_Greeter_stub(,'127.0.0.1',15000) as stub :

# response = stub.SayHello(log_pb2.HelloRequest(message='hello hugo',name='18'),_TIMEOUT_SECONDS)

# print response

channel = grpc.insecure_channel('127.0.0.1:15000')

stub = log_pb2.GreeterStub(channel)

response = stub.SayHello(log_pb2.HelloRequest(message='hugo000000', age=19), _TIMEOUT_SECONDS)

conn_mysql_stub = log_pb2.ConnMysqlStub(channel)

res = conn_mysql_stub.ConnectMysql(log_pb2.MyqlRequest(dbname='jiraconnector'), _TIMEOUT_SECONDS)

print res

print response.next()

except Exception as e:

print e

if __name__ == '__main__':

run()

4)结果

selectlist: "1"

message: "hello hugo"

age: 10

总结:简单易用,文档规范。

常见错误

<_rendezvous of rpc that terminated with exception calling application: object is not iterable>

log.proto: Required fields are not allowed in proto3.

log.proto: Required fields are not allowed in proto3.

reference :

http://maqiangthunder.github.io/2016/07/04/%E6%9D%82/gRPC/

https://github.com/geekan/grpc-python-demos/blob/master/helloworld/client.py

http://guojing.me/posts/grpc-python-bind-source-code-1/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值