python golang中grpc 使用示例代码详解


Posted in Python onJune 03, 2020

python

1、使用前准备,安装这三个库

pip install grpcio
pip install protobuf
pip install grpcio_tools

2、建立一个proto文件hello.proto

// [python quickstart](https://grpc.io/docs/quickstart/python.html#run-a-grpc-application)
// python -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. hello.proto

// helloworld.proto
syntax = "proto3";
package test;

service Greeter {
 rpc SayHello(HelloRequest) returns (HelloReply) {}
 rpc SayHelloAgain(HelloRequest) returns (HelloReply) {}

}
service Greetera{
 rpc SayStudent(Studentid) returns (Student){}
}
message Student {
 string msg=1;//json
}


message Studentid{
 string id=1;
}
message HelloRequest {
 string name = 1;
}

message HelloReply {
 string message = 1;
}

3、执行命令就会对应生成两个py文件

hello_pb2.py

hello_pb2_grpc.py

python -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. hello.proto

4、py服务端代码hello.server.py:

from concurrent import futures
import time
import grpc
import hello_pb2
import hello_pb2_grpc
import json
# 实现 proto 文件中定义的 GreeterServicer
class Greeter(hello_pb2_grpc.GreeterServicer):
 # 实现 proto 文件中定义的 rpc 调用
 def SayHello(self, request, context):
 return hello_pb2.HelloReply(message = 'hello {msg}'.format(msg = request.name))
 def SayHelloAgain(self, request, context):
 return hello_pb2.HelloReply(message='hello {msg}'.format(msg = request.name))

class Gretera(hello_pb2_grpc.GreeteraServicer):
 def SayStudent(self,request,context):
 print(request.id)
 if request.id=="0":
 c=hello_pb2.Student(msg=json.dumps({"name":"owen","age":22,"sex":"男"}))
 else:
 c=hello_pb2.Student(msg=json.dumps({"name":"lihui","age":23,"sex":"女"}))
 return c
def serve():
 # 启动 rpc 服务
 server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
 hello_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
 hello_pb2_grpc.add_GreeteraServicer_to_server(Gretera(),server)
 server.add_insecure_port('[::]:50052')
 server.start()
 try:
 while True:
 time.sleep(60*60*24) # one day in seconds
 except KeyboardInterrupt:
 server.stop(0)
if __name__ == '__main__':
 serve()

py客户端代码hello.client.py:

import grpc
import hello_pb2
import hello_pb2_grpc
import json
def run():
 # 连接 rpc 服务器
 channel = grpc.insecure_channel('localhost:50051')
 # 调用 rpc 服务
 stub = hello_pb2_grpc.GreeterStub(channel)
 response = stub.SayHello(hello_pb2.HelloRequest(name='czl'))
 print("Greeter client received: " + response.message)
 response = stub.SayHelloAgain(hello_pb2.HelloRequest(name='nsdnfkjda'))
 print("Greeter client received: " + response.message)
 stub1 = hello_pb2_grpc.GreeteraStub(channel)
 response1 = stub1.SayStudent(hello_pb2.Studentid(id='1'))
 print(json.loads(response1.msg))
if __name__ == '__main__':
 run()

golang

由于grpc是跨语言的所以这里用golang做为示范,golang客户端代码,小编这里也踩了许多坑,最主要的是两个proto文件一定要一致,golang 中使用必须安装protoc,windows将环境变量指向安装目录的bin下面:

1、protocal buffer安装

从 https://github.com/google/protobuf/releases  下载 对应自己的系统(环境变量记得改)

2、安装 golang protobuf

go get -u github.com/golang/protobuf/proto // golang protobuf 库
go get -u github.com/golang/protobuf/protoc-gen-go //protoc --go_out 工具

3、安装 gRPC-go

go get google.golang.org/grpc

4、生成go文件

protoc --go_out=plugins=grpc:文件目录 对应的.proto文件
protoc --go_out=plugins=grpc:. hello.proto

生成hello.pb.go,调用的实现hello_go_client.go:

package main
import (
 "context"
 "encoding/json"
 "google.golang.org/grpc"
 "log"
 "student/test" //对应的生成文件目录
)
type Studenmsg struct {
 Name string
 Age int
 Sex string
}
func main() {
 // 建立连接到gRPC服务
 conn, err := grpc.Dial("127.0.0.1:50052", grpc.WithInsecure())
 if err != nil {
 log.Fatalf("did not connect: %v", err)
 }
 // 函数结束时关闭连接
 defer conn.Close()
 // 创建Waiter服务的客户端
 t := test.NewGreeteraClient(conn)
 tr,err:=t.SayStudent(context.Background(),&test.Studentid{Id:"1"})
 if err != nil {
 log.Fatalf("could not greet: %v", err)
 }
 var st Studenmsg
 err=json.Unmarshal([]byte(tr.Msg),&st)//这里说明一下发过来的数据是json格式转化成struct
 if err!=nil{
 log.Println(err.Error())
 }
 log.Println(st.Name,st.Age,st.Sex)
}

总结

到此这篇关于python golang中grpc 使用示例代码详解的文章就介绍到这了,更多相关python golang grpc 使用内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python创建日历实例
Aug 21 Python
python+requests+unittest API接口测试实例(详解)
Jun 10 Python
python学习教程之Numpy和Pandas的使用
Sep 11 Python
Python3 replace()函数使用方法
Mar 19 Python
解决Python获取字典dict中不存在的值时出错问题
Oct 17 Python
Django项目使用CircleCI的方法示例
Jul 14 Python
Tensorflow模型实现预测或识别单张图片
Jul 19 Python
使用Python生成200个激活码的实现方法
Nov 22 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
Jan 18 Python
如何使用pandas读取txt文件中指定的列(有无标题)
Mar 05 Python
Python基于httpx模块实现发送请求
Jul 07 Python
深入了解Python 变量作用域
Jul 24 Python
Opencv图像处理:如何判断图片里某个颜色值占的比例
Jun 03 #Python
QML用PathView实现轮播图
Jun 03 #Python
Python基于smtplib协议实现发送邮件
Jun 03 #Python
Pytorch环境搭建与基本语法
Jun 03 #Python
如何学习Python time模块
Jun 03 #Python
使用openCV去除文字中乱入的线条实例
Jun 02 #Python
Python能做什么
Jun 02 #Python
You might like
PHP 字符截取 解决中文的截取问题,不用mb系列
2009/09/29 PHP
php下关于中英数字混排的字符串分割问题
2010/04/06 PHP
国外PHP程序员的13个好习惯小结
2012/02/20 PHP
基于php设计模式中单例模式的应用分析
2013/05/15 PHP
简单谈谈PHP中的include、include_once、require以及require_once语句
2016/04/23 PHP
PHP+原生态ajax实现的省市联动功能详解
2017/08/15 PHP
jquery中html、val与text三者属性取值的联系与区别介绍
2013/12/29 Javascript
JavaScript截断字符串的方法
2015/07/15 Javascript
jQuery NProgress.js加载进度插件的简单使用方法
2018/01/31 jQuery
JavaScript实现简单的文本逐字打印效果示例
2018/04/12 Javascript
Vue利用canvas实现移动端手写板的方法
2018/05/03 Javascript
javascript解析json格式的数据方法详解
2020/08/07 Javascript
原生JavaScript实现购物车
2021/01/10 Javascript
[57:22]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第五场
2018/04/10 DOTA
python实现对一个完整url进行分割的方法
2015/04/29 Python
Python正则简单实例分析
2017/03/21 Python
python散点图实例之随机漫步
2018/08/27 Python
python pands实现execl转csv 并修改csv指定列的方法
2018/12/12 Python
python实现车牌识别的示例代码
2019/08/05 Python
Python sys模块常用方法解析
2020/02/20 Python
Python编程快速上手——正则表达式查找功能案例分析
2020/02/28 Python
简单了解django处理跨域请求最佳解决方案
2020/03/25 Python
Django 解决开发自定义抛出异常的问题
2020/05/21 Python
HTML5 与 XHTML2
2008/10/17 HTML / CSS
英国浴室洗脸盆购物网站:Click Basin
2018/06/08 全球购物
Timberland德国官网:靴子、鞋子、衣服、夹克及配件
2019/12/10 全球购物
大学生毕业求职找工作的自我评价
2013/09/29 职场文书
入党自我鉴定范文
2013/10/04 职场文书
市场营销专科应届生求职信
2013/11/24 职场文书
个性与发展自我评价
2014/02/11 职场文书
收入及婚姻状况证明
2014/11/20 职场文书
单位实习鉴定评语
2015/01/04 职场文书
班委竞选稿范文
2015/11/21 职场文书
2019行政前台转正申请书范文3篇
2019/08/15 职场文书
如何判断微信付款码和支付宝付款码
2021/04/01 PHP
Oracle配置dblink访问PostgreSQL的操作方法
2022/03/21 PostgreSQL