1.Locust学习

详情可以参考:Locust官方文档【中文翻译】

2.grpc协议

详情可以参考:gRPC 官方文档中文版V1.0

gRPC 是什么?

在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。

gRPC 客户端和服务端可以在多种环境中运行和交互 - 从 google 内部的服务器到你自己的笔记本,并且可以用任何 gRPC 支持的语言来编写。所以,你可以很容易地用 Java 创建一个 gRPC 服务端,用 Go、Python、Ruby 来创建客户端。此外,Google 最新 API 将有 gRPC 版本的接口,使你很容易地将 Google 的功能集成到你的应用里。

使用 protocol buffers

gRPC 默认使用 protocol buffers,这是 Google 开源的一套成熟的结构数据序列化机制(当然也可以使用其他数据格式如 JSON)。正如你将在下方例子里所看到的,你用 proto files 创建 gRPC 服务,用 protocol buffers 消息类型来定义方法参数和返回类型。你可以在 Protocol Buffers 文档找到更多关于 Protocol Buffers 的资料。

3.采用Locust对grpc协议进行压测

  • 准备proto文件
# helloworld.protosyntax = "proto3";
option java_package = "io.grpc.examples";
package helloworld;// The greeter service definition.
service Greeter {// Sends a greetingrpc SayHello (HelloRequest) returns (HelloReply) {}
}// The request meesage containing the user'name.
message HelloRequest {string name = 1;
}// The response message containing the greetings
message HelloReply {string message = 1;
}
  • 使用 protoc 编译 proto 文件, 生成 python 语言的实现

注:需要安装python下的protoc编译器,安装命令如下:

# 安装 python 下的 protoc 编译器
pip install grpcio-tools

然后生成proto文件,命令如下:

# 编译 proto 文件
python -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. helloworld.proto

解释:

#python -m grpc_tools.protoc: python 下的 protoc 编译器通过 python 模块(module) 实现, #所以说这一步非常省心
#--python_out=. : 编译生成处理 protobuf 相关的代码的路径, 这里生成到当前目录
#--grpc_python_out=. : 编译生成处理 grpc 相关的代码的路径, 这里生成到当前目录
#-I. helloworld.proto : proto 文件的路径, 这里的 proto 文件在当前目录

注:

比如我想将指定文件夹./grpc_proto/test下helloworld.proto文件编译结果存放到指定文件夹./grpc_client/test目录下,可以采用如下写法:

python -m grpc_tools.protoc -I./grpc_proto/test --python_out=./grpc_client/test/ --grpc_python_out=./grpc_client/test/ helloworld.proto

而不是下面的这种写法, 这样的话会在./grpc_client/test多生成两层文件夹./grpc_proto/test。

python -m grpc_tools.protoc -I. --python_out=./grpc_client/test/ --grpc_python_out=./grpc_client/test/ ./grpc_proto/testhelloworld.proto

正常情况下编译后生成的2个代码文件:,分别如下:

  1. helloworld_pb2.py: 用来和 protobuf 数据进行交互
  2. helloworld_pb2_grpc.py: 用来和 grpc 进行交互
  • 编写helloworld的grpc实现
import sys
import grpc
import time
sys.path.append("..")from concurrent import futures
from helloworld.helloworld import helloworld_pb2, helloworld_pb2_grpc_ONE_DAY_IN_SECONDS = 60 * 60 * 24
_HOST = 'localhost'
_PORT = '50052'
class Greeter(helloworld_pb2_grpc.GreeterServicer):def SayHello(self, request, context):str = request.namereturn helloworld_pb2.HelloReply(message='hello, '+str)def serve():grpcServer = grpc.server(futures.ThreadPoolExecutor(max_workers=4))helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), grpcServer)grpcServer.add_insecure_port(_HOST + ':' + _PORT)grpcServer.start()try:while True:time.sleep(_ONE_DAY_IN_SECONDS)except KeyboardInterrupt:grpcServer.stop(0)if __name__ == '__main__':serve()

在终端启动,如下:

python helloworld_server.py
  • 编写Locust文件,实现对端口50052的grpc服务进行压测,内容如下:
#!/usr/bin/env python 2.7
# -*- coding:utf-8 -*-import os,sys, argparse
sys.path.append("..")
import grpc
import json
import requests
import time
import random
import stringimport helloworld_pb2, helloworld_pb2_grpc
from locust import Locust, TaskSet, task, events
from locust.stats import RequestStats
from locust.events import EventHookdef parse_arguments():parser = argparse.ArgumentParser(prog='locust')parser.add_argument('--hatch_rate')parser.add_argument('--master', action='store_true')args, unknown = parser.parse_known_args()opts = vars(args)return args.host, int(args.clients), int(args.hatch_rate)#HOST, MAX_USERS_NUMBER, USERS_PRE_SECOND = parse_arguments()
HOST, MAX_USERS_NUMBER, USERS_PRE_SECOND = '127.0.0.1:50052', 1, 10# 分布式,需要启多台压测时,有一个master,其余为slave
slaves_connect = []
slave_report = EventHook()
ALL_SLAVES_CONNECTED = True
SLAVES_NUMBER = 0
def on_my_event(client_id, data):global ALL_SLAVES_CONNECTEDif not ALL_SLAVES_CONNECTED:slaves_connect.append(client_id)if len(slaves_connect) == SLAVES_NUMBER:print "All Slaves Connected"ALL_SLAVES_CONNECTED = True
#        print events.slave_report._handlersheader = {'Content-Type': 'application/x-www-form-urlencoded'}
import resourcersrc = resource.RLIMIT_NOFILE
soft, hard = resource.getrlimit(rsrc)
print 'RLIMIT_NOFILE soft limit starts as : ', softsoft, hard = resource.getrlimit(rsrc)
print 'RLIMIT_NOFILE soft limit change to: ', softevents.slave_report += on_my_eventclass GrpcLocust(Locust):def __init__(self, *args, **kwargs):super(GrpcLocust, self).__init__(*args, **kwargs)class ApiUser(GrpcLocust):min_wait = 90max_wait = 110stop_timeout = 100000class task_set(TaskSet):def getEnviron(self, key, default):if key in os.environ:return os.environ[key]else:return defaultdef getToken(self):consumer_key = self.getEnviron('SELDON_OAUTH_KEY', 'oauthkey')consumer_secret = self.getEnviron('SELDON_OAUTH_SECRET', 'oauthsecret')params = {}params["consumer_key"] = consumer_keyparams["consumer_secret"] = consumer_secreturl = self.oauth_endpoint + "/token"r = requests.get(url, params=params)if r.status_code == requests.codes.ok:j = json.loads(r.text)# print jreturn j["access_token"]else:print "failed call to get token"return Nonedef on_start(self):# print "on start"
#            self.oauth_endpoint = self.getEnviron('SELDON_OAUTH_ENDPOINT', "http://127.0.0.1:50053")
#            self.token = self.getToken()self.grpc_endpoint = self.getEnviron('SELDON_GRPC_ENDPOINT', "127.0.0.1:50052")self.data_size = int(self.getEnviron('SELDON_DEFAULT_DATA_SIZE', "784"))@taskdef get_prediction(self):conn = grpc.insecure_channel(self.grpc_endpoint)client = helloworld_pb2_grpc.GreeterStub(conn)start_time = time.time()name = string.join(random.sample(['a','b','c','d','e','f','g'], 3)).replace(" ","")request = helloworld_pb2.HelloRequest(name=name)try:reply = client.SayHello(request)except Exception,e:total_time = int((time.time() - start_time) * 1000)events.request_failure.fire(request_type="grpc", name=HOST, response_time=total_time, exception=e)else:total_time = int((time.time() - start_time) * 1000)events.request_success.fire(request_type="grpc", name=HOST, response_time=total_time, response_length=0)
  • 启动Locust,查看结果
locust -f locustFile.py

采用Locust对grpc协议进行压测相关推荐

  1. 【locust】使用locust + boomer实现对接口的压测

    背景 很早之前,考虑单机执行能力,使用locust做过公司短信网关的压测工作,后来发现了一个golang版本的locust,性能是python版本的5到10倍以上,但是一直没有机会使用. 最近公司想做 ...

  2. python locust 能压测数据库_深入浅出 Locust 实现

    写在前面 本文将尝试通过一篇文章讲清楚开源压测工具--Locust的原理和实现过程,聚焦在实现上,不拘泥在一堆源码中(本身Locust的源码就比较简单).本人并不是Locust铁粉,只是对它的实现方式 ...

  3. Go 实现 json 格式定义 http 协议压测脚本

    原文由bugVanisher发表于TesterHome社区,点击原文链接可与作者直接交流. 前段时间,我主导推动组里实现了一套基于Locust+boomer的通用的压测平台,主要目的是满足我们组内的各 ...

  4. 基于python的压测工具_Python Locust性能测试简介及框架实践

    Locust(俗称 蝗虫), 一个轻量级的开源压测工具,用Python编写.使用 Python 代码定义用户行为,也可以仿真百万个用户: Locust 非常简单易用,是分布式,用户负载测试工具.Loc ...

  5. Python是最好的编程语言,Locust是最好的压测工具,不服来辩!

    1.简介 Locust 是一个易于使用,分布式,用户负载测试工具.它用于负载测试 web 站点(或其他系统),并计算出一个系统可以处理多少并发用户.在测试期间,一大群虚拟用户访问你的网站.每个测试用户 ...

  6. linux tcp压测工具,wrktcp: 支持tcp协议压测的wrk工具,全配置不依赖lua

    wrktcp - 无lua依赖的tcp协议压测wrk工具 你可以查看readme in the file:README_EN.md [TOC] 本程序主要是基于wrk的基础上 取消了ssl和lua依赖 ...

  7. 从0到1构建美团压测工具

    背景 美团内部的RPC服务大多构建在Thrift之上,在日常开发服务的过程中,需要针对这些服务进行压力测试(以下简称压测)来发现潜在问题.常用的方法有: 使用一些脚本语言如:Python.Ruby等, ...

  8. 不看我真的会很伤心【压测工具:提升系统性能的利器】,查看TPS,计算TPS,计算压测指标、压测名词解释、教大家如何压测

    目录 前言 一.压测是什么? 二.为什么要压测? 三. 压测名词解释 1.压测类型解释 2.压测名词解释 3.机器性能指标解释 4.访问指标解释 四.如何计算压测指标 五.常见的压测工具 1.JMet ...

  9. 压测利器:TarsBenchmark正确打开方式

    导语 | Tars 是由腾讯主导开源,并捐献给Linux基金会的微服务RPC框架.而TarsBenchmark的推出是对Tars生态的进一步完善,它支持的在线压测功能极大降低开发测试人员在线评测服务性 ...

最新文章

  1. 强化学习笔记: backup diagram
  2. 剔除异常值栅格计算器_R语言系列 数据清洗3 异常值处理
  3. 简略图解:输入 url 到出现页面,浏览器做了什么?
  4. Dynamic Web Module 3.0 requires Java 1.6 or newer报错
  5. Html调用窗口,等待HTML调用window.print()之前写窗口
  6. 【OpenCV 例程200篇】04. 用 matplotlib 显示图像(plt.imshow)
  7. Spring Bean装配(上)
  8. lisp 提取字符串中的數字_Redis 数据结构之字符串的那些骚操作
  9. intellij快捷键linux,IntelliJ IDEA的几个常用快捷键
  10. 毕业论文计算机设计,计算机设计毕业论文
  11. 十个Win10使用小技巧,看看你知道哪些?
  12. android 打印机 kernel,adb如何打印kernel输出log
  13. GPS同步时钟(NTP时间服务器)网口物理隔离的好处
  14. LaTex论文排版 | (30) 三线表
  15. 俄罗斯方块游戏算法分析
  16. 中国老百姓一生要交多少税?
  17. u盘忘在计算机房,基于MFC的防U盘等移动存储器的遗忘提醒系统
  18. oppo Reno 5 pro​​手机打开USB调试步骤(oppo手机大同小异,其他品牌也适用)
  19. 一个简单的猜数字游戏(附带关机惩罚)
  20. 生命科学名言01:物种起源

热门文章

  1. jQuery二维码插件 jquery.qrcode.js
  2. rpm apache2 啟動vhost .htaccess讀取問題
  3. oracle 10g的安装配置
  4. 为IBM 3650 M2 服务器配置RAID卡(一)
  5. IE9相比IE8丢失了什么?
  6. h3c ospf stub total stub nssa
  7. d06调试详细说明_PIC系列单片机配置字详细介绍(长期实践总结的压箱底资料)
  8. 51单片机 外部时钟_基于51单片机的LCD12864显示模拟时钟
  9. 本地html如何导出pdf,html表格以pdf格式导出到本地
  10. php验证码雪花源码,php如何生成雪花背景验证码(附代码)