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 golang中grpc 使用示例代码详解的更多相关文章

  1. C#中异步调用示例与详解

    using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServi ...

  2. 第8.13节 Python类中内置方法__repr__详解

    当我们在交互环境下输入对象时会直接显示对象的信息,交互环境下输入print(对象)或代码中print(对象)也会输出对象的信息,这些输出信息与两个内置方法:__str__方法和__repr__方法有关 ...

  3. (Go)07.Go语言中strings和strconv包示例代码详解02

    1.strings使用 统计字符串出现次数 strings.Count(s string, substr string) int Count 用于计算字符串 substr 在字符串 s 中出现的非重叠 ...

  4. (Go)07.Go语言中strings和strconv包示例代码详解01

    1.strings使用 前缀和后缀 HasPrefix判断字符串s是否以prefix开头: 示例: package main import ( "fmt" "string ...

  5. 第8.14节 Python类中内置方法__str__详解

    一. object类内置方法__str__和函数str 类的内置方法__str__和内置函数str实际上实现的是同一功能,实际上str调用的就是__str__方法,只是调用方式不同,二者的调用语法如下 ...

  6. vue-cli中进行微信支付代码详解

    最近做微信支付,颇经历一番波折,这里总结一下,便于以后少走弯路: 在进行微信支付,除了需要公众号之外,你还需要一个微信商户.根据商户规则进行商户申请 这是公众号的基本开发配置,这里在微信授权的时候就已 ...

  7. **Python中的深拷贝和浅拷贝详解

    Python中的深拷贝和浅拷贝详解   这篇文章主要介绍了Python中的深拷贝和浅拷贝详解,本文讲解了变量-对象-引用.可变对象-不可变对象.拷贝等内容.   要说清楚Python中的深浅拷贝,需要 ...

  8. 利用python求解物理学中的双弹簧质能系统详解

    利用python求解物理学中的双弹簧质能系统详解 本文主要给大家介绍了关于利用python求解物理学中双弹簧质能系统的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 物理的 ...

  9. python中requests库使用方法详解

    目录 python中requests库使用方法详解 官方文档 什么是Requests 安装Requests库 基本的GET请求 带参数的GET请求 解析json 添加headers 基本POST请求 ...

随机推荐

  1. Redis系列(六):数据结构List双向链表LPUSH、LPOP、RPUSH、RPOP、LLEN命令

    1.介绍 redis中的list既实现了栈(先进后出)又实现了队列(先进先出) 1.示意图 2.各命令详解 LPUSH/RPUSH LPUSH: 从队列的左边入队一个或多个元素 将所有指定的值插入到存 ...

  2. CLR垃圾收集器

    CLR GC是一种引用跟踪算法,大致步骤如下: 1.暂停进程中所有的线程: 2.标记阶段,遍历堆中的所有对象,标记为删除,然后检查所有活动根,如果有引用对象,就标记那个对象可达,否则不可达: 3.GC ...

  3. yum本地源创建

    1 安装yum-utils包,yum-utils可以将需要的包下载在本地,安装后可以使用yumdownloader   yum -y install yum-utils* 2 建立目录/yum/yum ...

  4. openstack-taskflow 组件记录

    [Summary] TaskFlow 是一个为了 openstack 实现的 python 库,使得执行 task 变得简单,一致,易扩展,可靠: 它能以一种声明的方式,将轻量级 task 对象的创建 ...

  5. 【kubeadm初始化报错】failed to run Kubelet: misconfiguration: kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd"

    复现场景 环境 系统:Centos7 kubernetes:1.18.5 docker:19.03.9 复现步骤 1.通过 yum 或 rpm 安装 kubelet kubectl kubeadm,并 ...

  6. P2136 拉近距离

    我也想有这样的爱情故事,可惜我单身 其实这道题就是一个比较裸的最短路问题.对于一个三元组 (S,W,T) ,S其实就是一个端点,而W就是到达的端点,连接两个端点的边长为-T,注意要取一个相反数,这样才 ...

  7. python案例远程执行命令

    ------类似于cmd的功能,client执行命令,server发命令结果发送到client -----------server.py------------------- import subpr ...

  8. SqueezeNet/SqueezeNext简述 | 轻量级网络

    SqueezeNet系列是比较早期且经典的轻量级网络,SqueezeNet使用Fire模块进行参数压缩,而SqueezeNext则在此基础上加入分离卷积进行改进.虽然SqueezeNet系列不如Mob ...

  9. ant design pro: protable控件隐藏【收起】按钮

    [collapseRender:()=>false] [效果] [参考ProTable源码]

  10. 缓存数据库之redis

    NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库,NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题 N ...