gRPC框架 & ProtoBuf

安装相关工具:

pip3 install grpcio
pip3 install grpcio-tools

protobuf3有自己专门的定义的格式,基于此可以生成不同的脚本

编写示例的protobuf3:

syntax = "proto3";

message HelloRequest {
string name = 1;
}

生成代码:

python3 -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. hello.proto

生成文件:

hello_pb2_grpc.py  hello_pb2.py

调用示例:

import hello_pb2

request = hello_pb2.HelloRequest()
request.name = "David"
# 对象生成字符串
res = request.SerializeToString()
print(res) # 通过字符串反向生成对象
request2 = hello_pb2.HelloRequest()
request2.ParseFromString(res)
print(request2.name)

定义proto文件

syntax = "proto3";

service Greeter {
rpc SayHello(HelloRequest) returns (HelloReply) {}
} message HelloRequest {
string name = 1;
} message HelloReply {
string message = 1;
}

生成文件:

python3 -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. hello.proto

示例代码

服务器端:

import hello_pb2
import hello_pb2_grpc
import grpc
from concurrent import futures class Greeter(hello_pb2_grpc.GreeterServicer):
def SayHello(self, request, context):
return hello_pb2.HelloReply(message=f"Hello, {request.name}") if __name__ == "__main__":
# 实例化server
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
# 注册逻辑到server
hello_pb2_grpc.add_GreeterServicer_to_server(Greeter(),server)
server.add_insecure_port('localhost:50051')
server.start()
server.wait_for_termination()

客户端:

import grpc
import hello_pb2,hello_pb2_grpc if __name__ == "__main__":
with grpc.insecure_channel("localhost:50051") as channel:
stub = hello_pb2_grpc.GreeterStub(channel)
rsp: hello_pb2.HelloReply = stub.SayHello(hello_pb2.HelloRequest(name="David"))
print(rsp.message)

客户端直接如同调用本地函数一样调用远程函数SayHello,只要写好规则就能自动生成代码

在Go语言中也是同理,将以上proto文件放到一个目录下,使用protoc生成:

protoc --go_out=.  --go-grpc_out=. ./*.proto

生成了hello.pb.go文件

服务端代码:

type Server struct{}

func (s *Server) SayHello(ctx context.Context, request *proto.HelloRequest) (*proto.HelloReply, error) {
return &proto.HelloReply{
Message: "hello " + request.Name,
}, nil
} func main() {
s := grpc.NewServer()
proto.RegisterGreeterServer(s, &Server{})
lis, err := net.Listen("tcp", "0.0.0.0:8080")
if err != nil {
panic("failed to listen:" + err.Error())
}
err = s.Serve(lis)
if err != nil {
panic("failed to start grpc:" + err.Error())
}
}

客户端代码:

func main() {
conn, err := grpc.Dial("127.0.0.1:8080", grpc.WithInsecure())
if err != nil {
panic(err)
}
defer conn.Close()
c := proto.NewGreeterClient(conn)
r, err := c.SayHello(context.Background(), &proto.HelloRequest{Name: "David"})
if err != nil {
panic(err)
}
fmt.Println(r.Message)
}

同时Python和Go是可以互相调用的

也就是说,Python开启服务器时,Go的客户端通过服务器的地址和端口可以使用RPC调用,反之亦然

只要基于同一份proto文件即可实现互相调用

Go/Python gRPC实践的更多相关文章

  1. python 最佳实践与资源汇总

    python 最佳实践 (部分) 一. 结构化工程 文件 功能 README.rst readme LICENSE 许可证 setup.py 打包和发布管理 requirements.txt 开发依赖 ...

  2. Python入门经典. 以解决计算问题为导向的Python编程实践

    Python入门经典. 以解决计算问题为导向的Python编程实践(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1juLsew8UiOErRheQPOuTaw 提取 ...

  3. Python 最佳实践指南 2018 学习笔记

    基础信息 版本 Python 2.7 Python 3.x Python2.7 版本在 2020 年后不再提供支持,建议新手使用 3.x 版本进行学习 实现 CPython:Python的标准实现: ...

  4. PYTHON 最佳实践指南(转)

    add by zhj: 本文参考了The Hitchhiker's Guide to Python,当然也加入了作者的一些东西.The Hitchhiker's Guide to Python 的gi ...

  5. 机器学习实践:《Python机器学习实践指南》中文PDF+英文PDF+代码

    机器学习是近年来渐趋热门的一个领域,同时Python 语言经过一段时间的发展也已逐渐成为主流的编程语言之一.<Python机器学习实践指南>结合了机器学习和Python 语言两个热门的领域 ...

  6. Python机器学习实践指南pdf (中文版带书签)、原书代码、数据集

    Python机器学习实践指南 目 录 第1章Python机器学习的生态系统 1 1.1 数据科学/机器学习的工作 流程 2 1.1.1 获取 2 1.1.2 检查和探索 2 1.1.3 清理和准备 3 ...

  7. python gRPC简单示例

    Ubuntu18.04安装gRPC protobuf-compiler-grpc安装 sudo apt-get install protobuf-compiler-grpc protobuf-comp ...

  8. <读书笔记>001-以解决问题为导向的python编程实践

    以解决问题为导向的python编程实践 0.第0章:计算机科学 思考:计算机科学是否为计算机编程的简称? 编程的困难点:1.同时做2件事(编程语言的语法.语义+利用其解决问题)  2.什么是好程序(解 ...

  9. python项目实践一:即时标记

    转自:http://www.code123.cc/1317.html 这是<python基础教程>后面的实践,照着写写,一方面是来熟悉python的代码方式,另一方面是练习使用python ...

  10. Python 最佳实践

    前言 对我来说,以前每次面试是我审视自己,检验自己的一种方式.每次准备面试,以及被面试官问住的时候才会发现,其实我python我学的还不够好.工作中也是,可以从其他的同事那里获得成长.但是我今天说的是 ...

随机推荐

  1. JMeter线程

    线程Threads:场景设置,模拟并发用户发送请求,设置并发策略.即以线程的方式来模拟多用户并发的.常用线程包括:线程组. jp@gc-Stepping Thread Group.bzm-Arriva ...

  2. PASS模型小程序设计阶段-里程碑第三组

    班级网址 https://edu.cnblogs.com/campus/zjcsxy/SE2020 作业要求 https://edu.cnblogs.com/campus/zjcsxy/SE2020/ ...

  3. 记录一次HAWQ手工启动

    一.环境变量初始化 使用hawq的命令必须先进行环境变量的初始化 命令不能以 root 用户执行,应该以 gpadmin 用户执行 source /usr/local/apache-hawq/gree ...

  4. Hadoop 从 hdfs 中拷出文件权限不够

    问题:使用-get命令从hdfs中拷出文件时,提示权限不够,如下: 分析: 可能有三方面原因: hdfs 中的文件或文件夹 没有读取权限: hdfs 的配置中未允许拷出文件: linux 文件夹没有写 ...

  5. python读取i3dm数据

    path = r'D:\data\1.i3dm'f = open(path, 'rb')f.seek(4)print('version:%d' % struct.unpack('I', f.read( ...

  6. raid随笔

    1.raid 0 准备两个磁盘 [root@localhost ~]# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTsda 8:0 0 40G 0 disk ...

  7. linux软件安装篇

    nginx篇 第一件事情 cd /etc/yum.repo.d mv CentOS-Base.repo CentOS-Base.repo.bak wget -O CentOS-Base.repo ht ...

  8. 将成员服务器ms1加到AD域中

    1.对ms1的ipv4设置,dns对应地址dc1服务器地址 2.修改计算机名,并加入域 重启后 2.以域用户登录方式有两种 1.  2. 检查ms1有没有加入dc1的域中 在dc1

  9. python之pyqt5-第一个pyqt5程序-图像压缩工具-小记

    (如想转载,请联系博主或贴上本博地址) 此为学习pyqt5的第一个程序,图像压缩工具. 因为比较简单,下面直接贴上代码. 效果图如下: # -*- coding: utf-8 -*- import s ...

  10. .Net中跨域问题的解决方案

    开发中前端与后端完全分离并分开发布,遇到跨域问题,一通百度之后,解决方案如下: 把下面的代码放在web.config文件中的 System.WebServer 节点下 <httpProtocol ...