pip install grpcio pip install protobuf pip install grpcio_tools
// [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; }
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()
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()
由于grpc是跨语言的所以这里用golang做为示范,golang客户端代码,小编这里也踩了许多坑,最主要的是两个proto文件一定要一致,golang 中使用必须安装protoc,windows将环境变量指向安装目录的bin下面:
go get -u github.com/golang/protobuf/proto // golang protobuf 库 go get -u github.com/golang/protobuf/protoc-gen-go //protoc --go_out 工具
go get google.golang.org/grpc
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 使用内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
- C#中异步调用示例与详解
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServi ...
- 第8.13节 Python类中内置方法__repr__详解
当我们在交互环境下输入对象时会直接显示对象的信息,交互环境下输入print(对象)或代码中print(对象)也会输出对象的信息,这些输出信息与两个内置方法:__str__方法和__repr__方法有关 ...
- (Go)07.Go语言中strings和strconv包示例代码详解02
1.strings使用 统计字符串出现次数 strings.Count(s string, substr string) int Count 用于计算字符串 substr 在字符串 s 中出现的非重叠 ...
- (Go)07.Go语言中strings和strconv包示例代码详解01
1.strings使用 前缀和后缀 HasPrefix判断字符串s是否以prefix开头: 示例: package main import ( "fmt" "string ...
- 第8.14节 Python类中内置方法__str__详解
一. object类内置方法__str__和函数str 类的内置方法__str__和内置函数str实际上实现的是同一功能,实际上str调用的就是__str__方法,只是调用方式不同,二者的调用语法如下 ...
- vue-cli中进行微信支付代码详解
最近做微信支付,颇经历一番波折,这里总结一下,便于以后少走弯路: 在进行微信支付,除了需要公众号之外,你还需要一个微信商户.根据商户规则进行商户申请 这是公众号的基本开发配置,这里在微信授权的时候就已 ...
- **Python中的深拷贝和浅拷贝详解
Python中的深拷贝和浅拷贝详解 这篇文章主要介绍了Python中的深拷贝和浅拷贝详解,本文讲解了变量-对象-引用.可变对象-不可变对象.拷贝等内容. 要说清楚Python中的深浅拷贝,需要 ...
- 利用python求解物理学中的双弹簧质能系统详解
利用python求解物理学中的双弹簧质能系统详解 本文主要给大家介绍了关于利用python求解物理学中双弹簧质能系统的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 物理的 ...
- python中requests库使用方法详解
目录 python中requests库使用方法详解 官方文档 什么是Requests 安装Requests库 基本的GET请求 带参数的GET请求 解析json 添加headers 基本POST请求 ...
随机推荐
- 搜索引擎-SHODAN
shodan这个搜索引擎不会爬取网页内容,而是爬取所有的联网设备. 这个搜索引擎还是很强大的,下图就是我用shodan查自己的案例服务器的结果: 如图,可以查到这台服务器安装了wdcp管理面板,黑客完 ...
- python 3内置函数
2018-07-14 enumerate() 用于指定下标 例: m = ['a','b','c'] for i,j in enumerate(m,1): print(i,j) 输出: 1 a 2 b ...
- No configuration file found and no output filename configured via Cli option.报错
webpack手动配置webpack.config.js文件,打包时出现的报错,可以试试这种解决方案 报错如下: No configuration file found and no output f ...
- 平时Chrome中用的一些插件
一.chrome://extensions Adblock Plus Dark Reader 让网站黑色主题 Infinity 新标签页 一个比较流行的新标签页工具 GNOME Shell integ ...
- Js数据类型、Json格式、Json对象、Json字符串
数据类型,从结构上看,所有的数据最终都可以分成三种类型: 第一种类型是scalar(标量),也就是一个单独的string(字符串)或数字(numbers),比如“北京”这个单独的词. 第二种类型是se ...
- 《JavaScript高级程序设计》(第二版)
这本书的作者是 Nicholas C.Zakas ,博客地址是 http://www.nczonline.net/ ,大家可以去多关注,雅虎的前端工程师,是YUI的代码贡献者,可想而知这本书得含金量, ...
- 【CSGRound1】天下第一 题解
[CSGRound1]天下第一 https://www.luogu.com.cn/problem/P5635 分析题目: 题目中说明,有T组数据,但是mod只有一个.很显然,这道题可以用记忆化搜索嘛! ...
- 一.前后端分离及drf实现序列化的原理
为什么要进行前后端分离 可pc.app.pad多端适应 SPA开发模式的流行--单页web应用(只有一html页面) 可实现前后端开发职责清(不分离时,前端是通过后端给的变量并渲染出来方式拿到数据! ...
- 标记下 'net 查壳/脱壳/加壳' 工具
net查壳工具 DotNet Id v1.0.0.3 该net程序集被“MaxToCode”加壳了(也不能完全相信). 加壳工具就是列表中列出的了. de4Net.exe脱壳工具版本de4dot-v3 ...
- Markdown小白教学15分钟速成
第一部分 基础篇 演示第二阶标题 1.1 目录与标题 代码过程 一级标题: 最高阶标题 基础篇 ===== 二级标题: 演示第二阶标题 一 ----- 注意: 这里"="和& ...