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写asp详细讲解
Dec 16 Python
python解析xml模块封装代码
Feb 07 Python
Python中使用 Selenium 实现网页截图实例
Jul 18 Python
探究Python中isalnum()方法的使用
May 18 Python
R vs. Python 数据分析中谁与争锋?
Oct 18 Python
pandas.dataframe中根据条件获取元素所在的位置方法(索引)
Jun 07 Python
python中正则表达式 re.findall 用法
Oct 23 Python
python 列表转为字典的两个小方法(小结)
Jun 28 Python
Python 3.6打包成EXE可执行程序的实现
Oct 18 Python
使用Pytorch来拟合函数方式
Jan 14 Python
Python响应对象text属性乱码解决方案
Mar 31 Python
Python偏函数Partial function使用方法实例详解
Jun 17 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 采集程序中常用的函数
2009/12/09 PHP
PHP编程之设置apache虚拟目录
2016/07/08 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
php 读取文件夹下所有图片、文件的实例
2018/10/17 PHP
PHP实现的敏感词过滤方法示例
2019/03/06 PHP
关于Laravel-admin的基础用法总结和自定义model详解
2019/10/08 PHP
javascript控制swfObject应用介绍
2012/11/29 Javascript
php中给js数组赋值方法
2014/03/10 Javascript
JS文字球状放大效果代码分享
2015/08/19 Javascript
如何防止JavaScript自动插入分号
2015/11/05 Javascript
ajax分页效果(bootstrap模态框)
2017/01/23 Javascript
浅谈JS如何实现真正的对象常量
2017/06/25 Javascript
微信小程序实现留言功能
2018/10/31 Javascript
js中Generator函数的深入讲解
2019/04/07 Javascript
微信小程序分包加载代码实现方法详解
2019/09/23 Javascript
vue 实现cli3.0中使用proxy进行代理转发
2019/10/30 Javascript
js Math数学简单使用操作示例
2020/03/13 Javascript
javascript实现放大镜功能
2020/12/09 Javascript
tensorflow TFRecords文件的生成和读取的方法
2018/02/06 Python
Python检查 云备份进程是否正常运行代码实例
2019/08/22 Python
如何基于python实现不邻接植花
2020/05/01 Python
Python使用pyexecjs代码案例解析
2020/07/13 Python
Python用K-means聚类算法进行客户分群的实现
2020/08/23 Python
萌新的HTML5 入门指南
2020/11/06 HTML / CSS
Java中会存在内存泄漏吗,请简单描述
2016/12/22 面试题
趣味游戏活动方案
2014/02/07 职场文书
《桂花雨》教学反思
2014/04/12 职场文书
企业诚信承诺书
2014/05/23 职场文书
大学毕业生管理学求职信
2014/09/01 职场文书
合理化建议书
2015/02/04 职场文书
2015清明节祭奠英烈寄语大全
2015/03/04 职场文书
生日赠语
2015/06/23 职场文书
初中化学教学反思
2016/02/22 职场文书
简单介绍 http请求响应参数、无连接无状态、MIME、状态码、端口、telnet、curl
2021/03/31 HTML / CSS
Redis可视化客户端小结
2021/06/10 Redis
详解在OpenCV中如何使用图像像素
2022/03/03 Python