python 使用gRPC
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的更多相关文章
- 技术实践:教你用Python搭建gRPC服务
摘要:gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf序列化协议开发,且支持众多开发语言. 本文分享自华为云社区& ...
- python中grpc配置asyncio使用
python中grpc配置asyncio使用 安装grpclib pip3 install grpclib protoc编译.proto文件,生成源码文件 python -m grpc_tools.p ...
- 记python使用grpc
using grpc in Python gRPC是基于http/2的RPC框架,使用ProtoBuf作为底层数据序列化.Nginx服务器2018年3月17日引入gRPC支持. gRPC 是用来实现跨 ...
- python使用grpc调用rpc接口
proto文件: syntax = "proto3"; package coupon; // //message UnsetUseC2URequest { // int64 bid ...
- python的gRPC示例
参考URL: https://segmentfault.com/a/1190000015220713?utm_source=channel-hottest gRPC 是一个高性能.开源和通用的 RPC ...
- Python RPC 之 gRPC
gRPC 简介: gRPC 是一款高性能.开源的 RPC 框架,产自 Google,基于 ProtoBuf 序列化协议进行开发,支持多种语言(Golang.Python.Java等),本篇只介绍 Py ...
- gRPC Golang/Python使用
gRPC Golang/Python使用 以前开发网站都是用http协议,学过TCP/IP协议的人都知道,在传输层TCP的基础上,应用层HTTP就是填充了一定规则的文本. 1.gRPC使用和介绍 工作 ...
- python golang中grpc 使用示例代码详解
python 1.使用前准备,安装这三个库 pip install grpcio pip install protobuf pip install grpcio_tools 2.建立一个proto文件 ...
- Google 高性能 RPC 框架 gRPC 1.0.0 发布(附精彩评论)
gRPC是一个高性能.开源.通用的RPC框架,面向移动和HTTP/2设计,是由谷歌发布的首款基于Protocol Buffers的RPC框架. gRPC基于HTTP/2标准设计,带来诸如双向流.流控. ...
随机推荐
- TortoiseSvn 取消忽略的文件
右键,TortoiseSvn->Properties,选择列表的一条(Property svn:Ignore),remove.
- 无法远程访问Mysql的解决方案
现在在很多的互联网公司对于mysql数据库的使用已经是不可阻挡的趋势了,所以经常我们在项目开始的时候就会做的事情就是找一台Linux服务器,到上面去安装个mysql,然后在开始我们的数据表的导入工作, ...
- 规范的web前端代码
web前端的代码规范主要针对的是HTML,CSS和javaScript代码. 前端代码规范在不同场合会有差异,但是规范的前端代码应该具有以下特征: 1.符合标准 所谓的标准是指W3C指定的web标准, ...
- $.each遍历JSON字符串和 Uncaught TypeError: Cannot use 'in' operator to search for '156错误
现在页面和后端交互都流行使用json了 自己记录一下解析字符串的方法,要不老是忘记!!!! success: function (data) { //data是后台传过来的字符串 $.each(JS ...
- .NET ->> 分享一个字符串模糊匹配指数的方法
链接: http://www.tsjensen.com/blog/post/2011/05/27/Four+Functions+For+Finding+Fuzzy+String+Matches+In+ ...
- 【转】修复关于apache-xampp的问题:Port 443 in use by “vmware-hostd.exe”!
在电脑里装了VMware后,再要装xampp,十有八九就会出现这个问题: 11:23:37 [Apache] Problem detected! 11:23:37 [Apache] ...
- window 服务注册、卸载
1.以管理员身份打开 命令窗口 2.服务注册命令:sc create myServer binpath= path 3.服务卸载命令:sc delete myServer Topshelf 服务安装 ...
- Spring学习总结之---装配Bean
Spring配置的可选方案 前言:Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系,作为开发人员,你需要告诉Spring容器要创建那些Bean,以哪种方式创建,并且如何将 ...
- vscode:解决操作git总让输入用户名及密码问题
只要是使用git操作,不管是同步,拉去,克隆,vscode总让我们输入用户名及密码,是一件很繁琐的事情 我们打开终端,会看到cmd定位在我们仓库位置,我们只要添加:git config --globa ...
- css3实现渐变
chrome,苹果浏览器:—webkit- firebox浏览器:-moz- Opera浏览器:-o- 渐变分为:线性渐变(Linear Gradients)向下/向上/向左/向右/对角方向 径向渐变 ...