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读写excel的方法
Nov 18 Python
Python操作CouchDB数据库简单示例
Mar 10 Python
关于Python面向对象编程的知识点总结
Feb 14 Python
Python实现删除列表中满足一定条件的元素示例
Jun 12 Python
python微信跳一跳系列之棋子定位像素遍历
Feb 26 Python
python抽取指定url页面的title方法
May 11 Python
解决python报错MemoryError的问题
Jun 26 Python
python批量爬取下载抖音视频
Jun 17 Python
python 3.7.4 安装 opencv的教程
Oct 10 Python
Python学习笔记之函数的参数和返回值的使用
Nov 20 Python
使用TensorBoard进行超参数优化的实现
Jul 06 Python
python中xlutils库用法浅析
Dec 29 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
中东人咖啡哲学
2021/03/03 咖啡文化
PHP将字符分解为多个字符串的方法
2014/11/22 PHP
PHP设计模式之装饰器模式定义与用法详解
2018/04/02 PHP
Alliance vs AM BO3 第一场2.13
2021/03/10 DOTA
javascript css在IE和Firefox中区别分析
2009/02/18 Javascript
获取HTML DOM节点元素的方法的总结
2009/08/21 Javascript
jQuery cdn使用介绍
2013/05/08 Javascript
alert中断settimeout计时功能
2013/07/26 Javascript
JS简单的图片放大缩小的两种方法
2013/11/11 Javascript
jQuery中not()方法用法实例
2015/01/06 Javascript
jQuery中$.click()无效问题分析
2015/01/29 Javascript
jquery衣服颜色选取插件效果代码分享
2015/08/28 Javascript
jquery背景跟随鼠标滑动导航
2015/11/20 Javascript
Node.js文件操作方法汇总
2016/03/22 Javascript
JS生成某个范围的随机数【四种情况详解】
2016/04/20 Javascript
JavaScript原型继承_动力节点Java学院整理
2017/06/30 Javascript
js实现手表表盘时钟与圆周运动
2020/09/18 Javascript
区分vue-router的hash和history模式
2020/10/03 Javascript
[19:24]DOTA2客户端使用指南 一分钟快速设置轻松超神
2013/09/24 DOTA
[47:43]完美世界DOTA2联赛PWL S3 Magama vs GXR 第二场 12.19
2020/12/24 DOTA
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
python实现封装得到virustotal扫描结果
2014/10/05 Python
Python的Bottle框架中获取制定cookie的教程
2015/04/24 Python
利用Tkinter(python3.6)实现一个简单计算器
2017/12/21 Python
解决Tensorflow使用pip安装后没有model目录的问题
2018/06/13 Python
python查询文件夹下excel的sheet名代码实例
2019/04/02 Python
Django 数据库同步操作技巧详解
2019/07/19 Python
python爬虫 爬取58同城上所有城市的租房信息详解
2019/07/30 Python
TensorFlow 显存使用机制详解
2020/02/03 Python
浅谈图像处理中掩膜(mask)的意义
2020/02/19 Python
怎么处理XML的中文问题
2015/03/26 面试题
对教师的评语
2014/04/28 职场文书
2014年勤工助学工作总结
2014/11/24 职场文书
2015年幼儿园元旦亲子活动方案
2014/12/09 职场文书
担保书格式范文
2015/09/22 职场文书
python如何在word中存储本地图片
2021/04/07 Python