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实现异步回调机制代码分享
Jan 10 Python
Python导入txt数据到mysql的方法
Apr 08 Python
Python写的一个简单监控系统
Jun 19 Python
在Django中创建URLconf相关的通用视图的方法
Jul 20 Python
git进行版本控制心得详谈
Dec 10 Python
详解python中asyncio模块
Mar 03 Python
python获取程序执行文件路径的方法(推荐)
Apr 26 Python
Django + Uwsgi + Nginx 实现生产环境部署的方法
Jun 20 Python
python使用opencv实现马赛克效果示例
Sep 28 Python
Python PyQt5运行程序把输出信息展示到GUI图形界面上
Apr 27 Python
Pandas替换及部分替换(replace)实现流程详解
Oct 12 Python
scrapy实践之翻页爬取的实现
Jan 05 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通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
PHPStorm+XDebug进行调试图文教程
2016/06/13 PHP
使用PHP免费发送定时短信的实例
2016/10/24 PHP
PHP实现权限管理功能示例
2017/09/22 PHP
javascript实现unicode和字符的互相转换
2007/07/18 Javascript
jquery ui对话框实例代码
2013/05/10 Javascript
js实现文字跟随鼠标移动而移动的方法
2015/02/28 Javascript
解决node.js安装包失败的几种方法
2016/09/02 Javascript
Angular2 路由问题修复详解
2017/03/01 Javascript
JavaScript利用fetch实现异步请求的方法实例
2017/07/26 Javascript
webpack+vue2构建vue项目骨架的方法
2018/01/09 Javascript
webpack4简单入门实例
2018/09/06 Javascript
NodeJS使用Range请求实现下载功能的方法示例
2018/10/12 NodeJs
傻瓜式vuex语法糖kiss-vuex整理
2018/12/21 Javascript
详解vuex之store源码简单解析
2019/06/13 Javascript
Layui点击图片弹框预览的实现方法
2019/09/16 Javascript
JS 获取文件后缀,判断文件类型(比如是否为图片格式)
2020/05/09 Javascript
以一个投票程序的实例来讲解Python的Django框架使用
2016/02/18 Python
手把手教你python实现SVM算法
2017/12/27 Python
分析python动态规划的递归、非递归实现
2018/03/04 Python
Django框架中序列化和反序列化的例子
2019/08/06 Python
pandas 对日期类型数据的处理方法详解
2019/08/08 Python
使用Tensorflow将自己的数据分割成batch训练实例
2020/01/20 Python
TensorFlow MNIST手写数据集的实现方法
2020/02/05 Python
PyCharm GUI界面开发和exe文件生成的实现
2020/03/04 Python
Python实时监控网站浏览记录实现过程详解
2020/07/14 Python
Jupyter notebook命令和编辑模式常用快捷键汇总
2020/11/17 Python
马来西亚与新加坡长途巴士售票网站:BusOnlineTicket.com
2018/11/05 全球购物
美国女士内衣在线折扣商店:One Hanes Place
2019/03/24 全球购物
链表面试题-一个链表的结点结构
2015/05/04 面试题
新郎婚宴答谢词
2014/01/19 职场文书
2014收银员工作总结范文
2014/12/16 职场文书
党支部创先争优公开承诺书
2015/04/30 职场文书
小学生纪律委员竞选稿
2015/11/19 职场文书
晚会开幕词范文
2016/03/04 职场文书
MySQL派生表联表查询实战过程
2022/03/20 MySQL