Python gRPC

  • 简介

    grpc 是google 开源的一款rpc服务框架,可以轻松的实现跨语言的微服务,将项目中的各个模块独立出来,单独部署,独立升级,也可以根据模块的情况进行不同语言的变成。

    gRPC也是一个C/S框架,使用的是HTTP2 协议进行通信。

  • 准备.proto文件

  syntax = "proto3";

  package order;
message OrderRequest {
string phone = 1;
string price = 2;
map<string, string> request_arg = 3;//便于字段扩展
} message JSONResponse{
string rst_string = 1; //统一返回json字符串作处理
} service OrderHandler {
// format a list of events.
rpc create_order (OrderRequest) returns (JSONResponse) {}
}

其中:

message: 定义数据结构

service: 定义接口的名字,参数,

  • 生成所需文件(服务器和客户端均需要)
python -m grpc_tools.protoc -I./ --python_out=./ --grpc_python_out=./ ./*.proto
  • 编写server端代码
 import time
import test_pb2_grpc
import grpc from concurrent import futures
from order.views import test import os class OrderHandler(test_pb2_grpc.OrderHandlerServicer):
def create_order(self, request, context):
return test(request, context) def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
test_pb2_grpc.add_OrderHandlerServicer_to_server(
OrderHandler(), server)
server.add_insecure_port('[::]:{}'.format(12006))
server.start()
try:
while True:
time.sleep(186400)
except KeyboardInterrupt:
server.stop(0)
serve()
  • 对应的views.py 文件
 from django.shortcuts import render
from django.http import JsonResponse
# Create your views here.
import test_pb2
import json
from django.http import HttpRequest def grpc_request(func):
“”“
将grpc请求重新构造成django requst,
并封装相应返回值
”“”
def f(request, context):
f = lambda x:{k:v for k,v in x.items()} if hasattr(x, 'items') else x
args = {i[0].name:f(i[1]) for i in request.ListFields() } # 构造django request 对象,并添加参数信息
dj_request = HttpRequest()
dj_request.GET = args
# dj_request.POST = args
# dj_request._body = json.dumps(args)
dj_request.META = args ret = func(dj_request) # 处理django的response 对象, 转换为grpc的对象
json_response = test_pb2.JSONResponse()
json_response.rst_string = ret.getvalue() return json_response
return f def check_inenty(func):
def f(request):
if "identy" not in request.META:
return JsonResponse(dict(status=403))
else:
return func(request)
return f @grpc_request
@check_inenty
def test(request):
return JsonResponse(dict(test=1, name="333"))
  • 编写客户端代码进行 测试 client.py
 import grpc
import test_pb2_grpc
import test_pb2 channel = grpc.insecure_channel("127.0.0.1:12006")
stub = test_pb2_grpc.OrderHandlerStub(channel)
ret = stub.create_order(test_pb2.OrderRequest(phone="12990", price="50")) print(ret.rst_string)

python 使用gRPC的更多相关文章

  1. 技术实践:教你用Python搭建gRPC服务

    摘要:gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf序列化协议开发,且支持众多开发语言. 本文分享自华为云社区& ...

  2. python中grpc配置asyncio使用

    python中grpc配置asyncio使用 安装grpclib pip3 install grpclib protoc编译.proto文件,生成源码文件 python -m grpc_tools.p ...

  3. 记python使用grpc

    using grpc in Python gRPC是基于http/2的RPC框架,使用ProtoBuf作为底层数据序列化.Nginx服务器2018年3月17日引入gRPC支持. gRPC 是用来实现跨 ...

  4. python使用grpc调用rpc接口

    proto文件: syntax = "proto3"; package coupon; // //message UnsetUseC2URequest { // int64 bid ...

  5. python的gRPC示例

    参考URL: https://segmentfault.com/a/1190000015220713?utm_source=channel-hottest gRPC 是一个高性能.开源和通用的 RPC ...

  6. Python RPC 之 gRPC

    gRPC 简介: gRPC 是一款高性能.开源的 RPC 框架,产自 Google,基于 ProtoBuf 序列化协议进行开发,支持多种语言(Golang.Python.Java等),本篇只介绍 Py ...

  7. gRPC Golang/Python使用

    gRPC Golang/Python使用 以前开发网站都是用http协议,学过TCP/IP协议的人都知道,在传输层TCP的基础上,应用层HTTP就是填充了一定规则的文本. 1.gRPC使用和介绍 工作 ...

  8. python golang中grpc 使用示例代码详解

    python 1.使用前准备,安装这三个库 pip install grpcio pip install protobuf pip install grpcio_tools 2.建立一个proto文件 ...

  9. Google 高性能 RPC 框架 gRPC 1.0.0 发布(附精彩评论)

    gRPC是一个高性能.开源.通用的RPC框架,面向移动和HTTP/2设计,是由谷歌发布的首款基于Protocol Buffers的RPC框架. gRPC基于HTTP/2标准设计,带来诸如双向流.流控. ...

随机推荐

  1. <head>标签和它的小伙伴们

    head标签是HTML文档中最基本的必须元素之一(body:对,还有我): <html> <head> <title>文档的标题</title> < ...

  2. python生成html表格

    最近做一个小工具,需要将统计数据生成html表格.在网上搜罗一圈后发现用pandas生成表格非常好用.代码如下: import pandas as pd def convertToHtml(resul ...

  3. 【Udacity】解决:字幕遮挡视频内容怎么办?Udacity字幕大小调整

    字幕有没有办法显示在最下方,否则把内容挡住了,根本看不清老师所指的内容 Chrome 的小插件,能方便地调节视频的字幕大小,譬如:Udacity 的学习视频字幕大小不能调节,有时候不想它占太多位置,而 ...

  4. margin的auto的理解 top,left[,bottom,right] position

    auto auto 总是试图充满父元素 margin有四个值: All the margin properties can have the following values: auto - the ...

  5. ArcGIS 10.1 如何连接数据库(转载)

    ArcGIS 10.1如何连接数据库 最近在使用ArcGIS 10.1的数据库,在使用的过程中发现了跟以往不太一样的地方,在这里将自己的心得和想法跟大家分享一下(使用Postgresql),根据使用过 ...

  6. GitHub教程(二) 删除已有仓库

    通过GitHub教程(一)的阅读,我相信您对GitHub体系框架已经有了模模糊糊的了解.本节教程将继续介绍GitHub的操作---删除仓库. 作为GitHub的入门使用者,我们可能会建一些简单的仓库来 ...

  7. html 表单button

    做一下标记: 请务必为form里面button设置type 因为: Internet Explorer 的默认类型是 "button",而其他浏览器中(包括 W3C 规范)的默认值 ...

  8. How to prepare system design questions in a tech interview?

    http://blog.baozitraining.org/2014/09/how-to-prepare-system-design-questions.html 如何准备面试中的系统设计问题一直都是 ...

  9. Python学习---Python下[元组]的学习

    元组是不可变的, 用小括号()定义,而且一旦定义 ,不可变[类型是tuple] [元组看做一个整体,不可拆分,不可赋值,但可以全部重新赋值] 通过圆括号,用逗号分隔,常用在使语句或用户定义的函数能够安 ...

  10. Python学习---进程 1225

    进程创建 进程创建: 第一种:直接创建 第二种:利用类来实现 第一种:直接创建 from multiprocessing import Process import time def f(name): ...