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. 2021年4月自动驾驶领域重要动态速览
  2. Spring Cloud Alibaba - 02 SpringCloud 、 SpringCloud Alibaba 、SpringBoot的生产版本选择
  3. 基于Boost.Thread 的测试
  4. Ambari2.7.4+HDP3.1.4.0中配置fair-scheduler
  5. 多线程—Thread类及线程三种创建方式及对比
  6. 有多少恐怖小说家就应该有多少种吓唬人的方法
  7. git 更新_[技术分享T.191212]GitLab使用方法及git命令常见问题(不断更新)
  8. 广州城市地图为android,广州无障碍地图
  9. 浏览器无法运行java_window_浏览器无法运行JAVA脚本的解决方法,1、浏览器无法运行JAVA脚本的 - phpStudy...
  10. 浏览器快捷键_浏览器快捷键,让你事半功倍
  11. 配置六 ip default-network
  12. Swift编程-闭包Closure
  13. 函数式编程学习之路(四)
  14. 区块链 Fisco bcos 智能合约(13)-Solidity的设计模式
  15. 计算机初级基础知识教程,计算机基础知识教程 适合初学者的计算机入门知识...
  16. HDU 6405 Make ZYB Happy
  17. WINVNC Server详解
  18. linux I2C设备驱动
  19. 修改tomcat的默认首页
  20. MySQL事务实现原理详解

热门文章

  1. 下一个阶段(用C++重写Lucene的计划)
  2. python汇总json数据_python的json包位置及用法总结
  3. 软件外包的话居然会有这样的后果...
  4. linux内核定时器 代码,Linux内核计时器
  5. json qt 解析数组_Qt中 UI文件是如何转成C++文件的
  6. 【React性能优化】 redux优化
  7. django2.0media用户上传文件配置及使用方法
  8. python读取配置文件-configparser
  9. 2017.7.8 MS SQL Server and BI workshop
  10. WIN7 IE 无法启动