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使用Tkinter显示网络图片的方法
Apr 24 Python
浅析Python编写函数装饰器
Mar 18 Python
Python简单检测文本类型的2种方法【基于文件头及cchardet库】
Sep 18 Python
python  Django中的apps.py的目的是什么
Oct 15 Python
pandas 条件搜索返回列表的方法
Oct 30 Python
在matplotlib的图中设置中文标签的方法
Dec 13 Python
python+selenium实现简历自动刷新的示例代码
May 20 Python
对Python中class和instance以及self的用法详解
Jun 26 Python
Python编译成.so文件进行加密后调用的实现
Dec 23 Python
使用Python将图片转正方形的两种方法实例代码详解
Apr 29 Python
Django静态资源部署404问题解决方案
May 11 Python
详解查看Python解释器路径的两种方式
Oct 15 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 allow_url_include的应用和解释
2010/04/22 PHP
在PHP中使用curl_init函数的说明
2010/11/02 PHP
[原创]ThinkPHP让../Public在模板不解析(直接输出)的方法
2015/10/09 PHP
jquery 插件实现图片延迟加载效果代码
2010/02/06 Javascript
Jquery图形报表插件 jqplot简介及参数详解
2012/10/10 Javascript
js获取checkbox复选框选中的选项实例
2014/08/24 Javascript
js实现跨域访问的三种方法
2015/12/09 Javascript
javascript中的3种继承实现方法
2016/01/27 Javascript
谈谈JS中常遇到的浏览器兼容问题和解决方法
2016/12/17 Javascript
从零学习node.js之express入门(六)
2017/02/25 Javascript
Angular中的$watch方法详解
2017/09/18 Javascript
webpack4.x打包过程详解
2018/07/18 Javascript
node.js基于socket.io快速实现一个实时通讯应用
2019/04/23 Javascript
javascript实现画板功能
2020/04/12 Javascript
three.js 制作动态二维码的示例代码
2020/07/31 Javascript
[59:15]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.20
2020/11/20 DOTA
跟老齐学Python之有容乃大的list(2)
2014/09/15 Python
详解Python的Flask框架中的signals信号机制
2016/06/13 Python
Python测试网络连通性示例【基于ping】
2018/08/03 Python
python直接获取API传递回来的参数方法
2018/12/17 Python
对Python3使运行暂停的方法详解
2019/02/18 Python
利用Python半自动化生成Nessus报告的方法
2019/03/19 Python
python 实现创建文件夹和创建日志文件的方法
2019/07/07 Python
python将print输出的信息保留到日志文件中
2019/09/27 Python
python list数据等间隔抽取并新建list存储的例子
2019/11/27 Python
基于python实现微信好友数据分析(简单)
2020/02/16 Python
Python安装OpenCV的示例代码
2020/03/05 Python
python语言中有算法吗
2020/06/16 Python
接口可以包含哪些成员
2012/09/30 面试题
生物制药专业自我鉴定
2014/02/19 职场文书
2015年银行员工工作总结
2015/04/24 职场文书
张丽莉观后感
2015/06/16 职场文书
中国文明网2015年“向国旗敬礼”活动网上签名寄语
2015/09/24 职场文书
2016年员工年度考核评语
2015/12/02 职场文书
关于职业道德的心得体会
2016/01/18 职场文书
基于Apache Hudi在Google云构建数据湖平台的思路详解
2022/04/07 Servers