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原始套接字编程示例分享
Feb 21 Python
Python中的rjust()方法使用详解
May 19 Python
在Python的Django框架中生成CSV文件的方法
Jul 22 Python
Python字典,函数,全局变量代码解析
Dec 18 Python
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
Jun 13 Python
用uWSGI和Nginx部署Flask项目的方法示例
May 05 Python
python实现邮件发送功能
Aug 10 Python
Python 函数list&read&seek详解
Aug 28 Python
详解如何用python实现一个简单下载器的服务端和客户端
Oct 28 Python
python爬虫模拟浏览器访问-User-Agent过程解析
Dec 28 Python
pytorch 彩色图像转灰度图像实例
Jan 13 Python
浅谈怎么给Python添加类型标注
Jun 08 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多维数组去掉重复值示例分享
2014/03/02 PHP
ThinkPHP在新浪SAE平台的部署实例
2014/10/31 PHP
PHP读取大文件的几种方法介绍
2016/10/27 PHP
Yii2框架实现数据库常用操作总结
2017/02/08 PHP
CodeIgniter整合Smarty的方法详解
2017/08/25 PHP
详解PHP中的外观模式facade pattern
2018/02/05 PHP
JS input文本框禁用右键和复制粘贴功能的代码
2010/04/15 Javascript
eval与window.eval的差别分析
2011/03/17 Javascript
再谈querySelector和querySelectorAll的区别与联系
2012/04/20 Javascript
解析jquery获取父窗口的元素
2013/06/26 Javascript
jquery进行数组遍历如何跳出当前的each循环
2014/06/05 Javascript
jquery获取选中的文本和值的方法
2014/07/08 Javascript
移除AngularJS下URL中的#字符的方法
2015/06/19 Javascript
GitHub上一些实用的JavaScript的文件压缩解压缩库推荐
2016/03/13 Javascript
jquery.zclip轻量级复制失效问题
2017/01/08 Javascript
JavaScript 函数的定义-调用、注意事项
2017/04/16 Javascript
无限循环轮播图之运动框架(原生JS实现)
2017/10/01 Javascript
mongoose更新对象的两种方法示例比较
2017/12/19 Javascript
vue.js过滤器+ajax实现事件监听及后台php数据交互实例
2018/05/22 Javascript
jquery的$().each和$.each的区别
2019/01/18 jQuery
原生js实现each方法实例代码详解
2019/05/27 Javascript
微信小程序开发之获取用户手机号码(php接口解密)
2020/05/17 Javascript
[04:30]显微镜下的DOTA2第五期——拉比克
2013/09/26 DOTA
Python中optparse模块使用浅析
2015/01/01 Python
python调用系统ffmpeg实现视频截图、http发送
2018/03/06 Python
Python基于Tkinter模块实现的弹球小游戏
2018/12/27 Python
使用python读取.text文件特定行的数据方法
2019/01/28 Python
Mac中PyCharm配置Anaconda环境的方法
2020/03/04 Python
Python下载网易云歌单歌曲的示例代码
2020/08/12 Python
欧洲最大的拼图游戏商店:JigsawPuzzle.co.uk
2018/07/04 全球购物
研究生自我鉴定范文
2013/10/30 职场文书
企业授权委托书范本
2014/04/02 职场文书
故意伤害人身损害赔偿协议书
2014/11/19 职场文书
万能检讨书开头与结尾怎么写
2015/02/17 职场文书
2015年感恩父亲节演讲稿
2015/03/19 职场文书
2019初中学生入团申请书
2019/06/27 职场文书