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 SQLite3数据库操作类分享
Jun 10 Python
Pyhton中防止SQL注入的方法
Feb 05 Python
Python基于二分查找实现求整数平方根的方法
May 12 Python
Python中shutil模块的常用文件操作函数用法示例
Jul 05 Python
Python函数的周期性执行实现方法
Aug 13 Python
django 在原有表格添加或删除字段的实例
May 27 Python
Python实现简单的文本相似度分析操作详解
Jun 16 Python
TensorFlow 显存使用机制详解
Feb 03 Python
python通过matplotlib生成复合饼图
Feb 06 Python
Python configparser模块应用过程解析
Aug 14 Python
Python监听键盘和鼠标事件的示例代码
Nov 18 Python
tensorflow+k-means聚类简单实现猫狗图像分类的方法
Apr 28 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项目的方法
2006/10/09 PHP
php模拟js函数unescape的函数代码
2012/10/20 PHP
基于php下载文件的详解
2013/06/02 PHP
PHP中echo和print的区别
2014/08/28 PHP
Zend Framework教程之Application和Bootstrap用法详解
2016/03/10 PHP
php验证身份证号码正确性的函数
2016/07/20 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
浅谈laravel框架sql中groupBy之后排序的问题
2019/10/17 PHP
使两个iframe的高度与内容自适应,且相等
2006/11/20 Javascript
JS防止用户多次提交的简单代码
2013/08/01 Javascript
javascript 构造函数方式定义对象
2015/01/02 Javascript
轻松掌握JavaScript策略模式
2016/08/25 Javascript
AngularJS学习第二篇 AngularJS依赖注入
2017/02/13 Javascript
无法获取隐藏元素宽度和高度的解决方案
2017/03/07 Javascript
javascript实现动态显示颜色块的报表效果
2017/04/10 Javascript
jquery实现放大镜简洁代码(推荐)
2017/06/08 jQuery
ComboBox(下拉列表框)通过url加载调用远程数据的方法
2017/08/06 Javascript
深入浅析ES6 Class 中的 super 关键字
2017/10/20 Javascript
vue draggable resizable gorkys与v-chart使用与总结
2019/09/05 Javascript
基于ts的动态接口数据配置的详解
2019/12/18 Javascript
vue 避免变量赋值后双向绑定的操作
2020/11/07 Javascript
[43:43]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第三场 11.29
2020/12/02 DOTA
对Python中数组的几种使用方法总结
2018/06/28 Python
Pandas读取并修改excel的示例代码
2019/02/17 Python
Python根据当前日期取去年同星期日期
2019/04/14 Python
Python3.5迭代器与生成器用法实例分析
2019/04/30 Python
Java如何基于wsimport调用wcf接口
2020/06/17 Python
Python SMTP发送电子邮件的示例
2020/09/23 Python
草莓网化妆品澳大利亚站:Strawberrynet AU
2017/12/18 全球购物
房产协议书范本2014
2014/09/30 职场文书
党干部专题民主生活会对照检查材料思想汇报
2014/10/06 职场文书
2014年电厂个人工作总结
2014/11/27 职场文书
单位更名证明
2015/06/18 职场文书
《中彩那天》教学反思
2016/02/24 职场文书
sql时间段切分实现每隔x分钟出一份高速门架车流量
2022/02/28 SQL Server
MySql如何将查询的出来的字段进行转换
2022/06/14 MySQL