在docker和gitlab ci环境中获得更好的jmeter结果

问题描述

我现在正在做硕士论文实验。 基本上,它是微服务Docker环境中负载平衡器和断路器之间的比较。 我使用traefik进行负载平衡和断路器。 我写了一个非常小的节点/表达服务,可以访问环境中的另一个服务以检索数据。

var express = require('express');
var router = express.Router();
var request = require('request');

/* GET home page. */

router.get('/',function (req,res,next) {
  var options = {
    'method': 'GET','url': 'http://traefik_reverse-proxy_1/ws/info?t=1594144233890','headers': {
      'Host': 'bend','Content-Type': 'application/json'
    }
  };
  request(options,(error,response) => {
    if (error) {
      res.send(error)
    } else {
      res.send(response.body)
    }
  });

});

module.exports = router;

我将负载均衡器和断路器附加到数据传递服务,该服务用于节点/表示“前端”

使用jmeter,我针对节点创建负载/表达前端,并针对数据交付服务创建“探针”。 我还使用docker来扩展jmeter从站。 从1,5,8,10开始 使用gitlab运行程序我开始测试 直到这里一切都正常。

我的主要问题是从jmeter获得正确的结果。 我已经在堆栈溢出中编写了另一个线程,并对其进行了尝试,但这似乎不是正确的方法。 (link)

由于一切都应该是动态的,并且管道需要大量时间,所以一切都很累。 如果您知道如何正确处理它,我将非常感谢。

traefik配置断路器:

http:
  routers:
    selfServiceBackend:
      rule: Host(`bend`)
      service: selfServiceBackend
      middlewares:
        - "latency-check"
    nodeapp:
      rule: "Host(`fend`)"
      service: nodeapp
  middlewares:
    latency-check:
      circuitBreaker:
        expression: "LatencyAtQuantileMS(50.0) > 700"
  services:
    selfServiceBackend:
      loadBalancer:
        servers:
        - url: "http://lakesidemutual-master_customer-management-backend_1:8100"
    nodeapp:
      loadBalancer:
        servers:
        - url: "http://nodeapp_nodeapp_1/"

traefik配置负载均衡器:

http:
  routers:
    selfServiceBackend:
      rule: Host(`bend`)
      service: selfServiceBackend
    nodeapp:
      rule: "Host(`fend`)"
      service: nodeapp 
  services:
    selfServiceBackend:
      loadBalancer:
        servers:
        - url: "http://lakesidemutual-master_customer-management-backend_1:8100"
        - url: "http://lakesidemutual-master_customer-management-backend_2:8100"
    nodeapp:
      loadBalancer:
        servers:
        - url: "http://nodeapp_nodeapp_1/"

traefik没有断路器或负载平衡器

http:
  routers:
    selfServiceBackend:
      rule: Host(`bend`)
      service: selfServiceBackend
    nodeapp:
      rule: "Host(`fend`)"
      service: nodeapp
  services:
    selfServiceBackend:
      loadBalancer:
        servers:
        - url: "http://lakesidemutual-master_customer-management-backend_1:8100"
    nodeapp:
      loadBalancer:
        servers:
        - url: "http://nodeapp_nodeapp_1/"

Jmeter

<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.2.1">
  <hashTree>
    <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Testplan OneHundred" enabled="true">
      <stringProp name="TestPlan.comments"></stringProp>
      <boolProp name="TestPlan.functional_mode">true</boolProp>
      <boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp>
      <boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
      <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
        <collectionProp name="Arguments.arguments"/>
      </elementProp>
      <stringProp name="TestPlan.user_define_classpath"></stringProp>
    </TestPlan>
    <hashTree>
      <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="ThreadGroup1" enabled="true">
        <stringProp name="ThreadGroup.on_sample_error">stoptestnow</stringProp>
        <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
          <boolProp name="LoopController.continue_forever">false</boolProp>
          <intProp name="LoopController.loops">-1</intProp>
        </elementProp>
        <stringProp name="LoopController.loops">100</stringProp>
        <stringProp name="ThreadGroup.ramp_time">0</stringProp>
        <stringProp name="ThreadGroup.duration">60</stringProp>
        <stringProp name="ThreadGroup.delay">0</stringProp>
        <boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
        <boolProp name="ThreadGroup.scheduler">true</boolProp>
        <stringProp name="ThreadGroup.num_threads">10000</stringProp>
      </ThreadGroup>
      <hashTree>
        <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="GetRequest" enabled="true">
          <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="Variables pré-définies" enabled="true">
            <collectionProp name="Arguments.arguments">
              <elementProp name="" elementType="HTTPArgument">
                <boolProp name="HTTPArgument.always_encode">false</boolProp>
                <stringProp name="Argument.value"></stringProp>
                <stringProp name="Argument.metadata">=</stringProp>
                <boolProp name="HTTPArgument.use_equals">true</boolProp>
              </elementProp>
            </collectionProp>
          </elementProp>
          <stringProp name="HTTPSampler.domain">traefik_reverse-proxy_1</stringProp>
          <stringProp name="HTTPSampler.port">80</stringProp>
          <stringProp name="HTTPSampler.protocol">http</stringProp>
          <stringProp name="HTTPSampler.contentEncoding"></stringProp>
          <stringProp name="HTTPSampler.path"></stringProp>
          <stringProp name="HTTPSampler.method">GET</stringProp>
          <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
          <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
          <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
          <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
          <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
          <stringProp name="HTTPSampler.connect_timeout"></stringProp>
          <stringProp name="HTTPSampler.response_timeout"></stringProp>
        </HTTPSamplerProxy>
        <hashTree>
          <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true">
            <collectionProp name="HeaderManager.headers">
              <elementProp name="" elementType="Header">
                <stringProp name="Header.name">Host</stringProp>
                <stringProp name="Header.value">fend</stringProp>
              </elementProp>
            </collectionProp>
          </HeaderManager>
          <hashTree/>
        </hashTree>
      </hashTree>
      <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="ThreadGroup1" enabled="true">
        <stringProp name="ThreadGroup.on_sample_error">stoptestnow</stringProp>
        <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
          <boolProp name="LoopController.continue_forever">false</boolProp>
          <intProp name="LoopController.loops">-1</intProp>
        </elementProp>
        <stringProp name="ThreadGroup.num_threads">1</stringProp>
        <stringProp name="ThreadGroup.ramp_time">0</stringProp>
        <stringProp name="ThreadGroup.duration">60</stringProp>
        <stringProp name="ThreadGroup.delay">0</stringProp>
        <boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
        <boolProp name="ThreadGroup.scheduler">true</boolProp>
      </ThreadGroup>
      <hashTree>
        <IfController guiclass="IfControllerPanel" testclass="IfController" testname="If Controller" enabled="true">
          <stringProp name="IfController.condition">${__jexl3(&quot;${__machineName()}&quot; == &quot;75e096bb2ece&quot;,)}</stringProp>
          <boolProp name="IfController.evaluateAll">false</boolProp>
          <boolProp name="IfController.useExpression">true</boolProp>
        </IfController>
        <hashTree>
          <WhileController guiclass="WhileControllerGui" testclass="WhileController" testname="While Controller" enabled="true">
            <stringProp name="WhileController.condition">${__groovy(org.apache.jmeter.threads.JMeterContextService.getThreadCounts().activeThreads &gt; 1,)}</stringProp>
          </WhileController>
          <hashTree>
            <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="GetRequest" enabled="true">
              <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="Variables pré-définies" enabled="true">
                <collectionProp name="Arguments.arguments">
                  <elementProp name="" elementType="HTTPArgument">
                    <boolProp name="HTTPArgument.always_encode">false</boolProp>
                    <stringProp name="Argument.value"></stringProp>
                    <stringProp name="Argument.metadata">=</stringProp>
                    <boolProp name="HTTPArgument.use_equals">true</boolProp>
                  </elementProp>
                </collectionProp>
              </elementProp>
              <stringProp name="HTTPSampler.domain">traefik_reverse-proxy_1/notifications</stringProp>
              <stringProp name="HTTPSampler.port">80</stringProp>
              <stringProp name="HTTPSampler.protocol">http</stringProp>
              <stringProp name="HTTPSampler.contentEncoding"></stringProp>
              <stringProp name="HTTPSampler.path"></stringProp>
              <stringProp name="HTTPSampler.method">GET</stringProp>
              <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
              <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
              <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
              <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
              <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
              <stringProp name="HTTPSampler.connect_timeout"></stringProp>
              <stringProp name="HTTPSampler.response_timeout"></stringProp>
            </HTTPSamplerProxy>
            <hashTree>
              <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true">
                <collectionProp name="HeaderManager.headers">
                  <elementProp name="" elementType="Header">
                    <stringProp name="Header.name">Host</stringProp>
                    <stringProp name="Header.value">bend</stringProp>
                  </elementProp>
                </collectionProp>
              </HeaderManager>
              <hashTree/>
              <ResultCollector guiclass="StatVisualizer" testclass="ResultCollector" testname="Aggregate Report" enabled="true">
                <boolProp name="ResultCollector.error_logging">false</boolProp>
                <objProp>
                  <name>saveConfig</name>
                  <value class="SampleSaveConfiguration">
                    <time>true</time>
                    <latency>true</latency>
                    <timestamp>true</timestamp>
                    <success>true</success>
                    <label>true</label>
                    <code>true</code>
                    <message>true</message>
                    <threadName>true</threadName>
                    <dataType>true</dataType>
                    <encoding>false</encoding>
                    <assertions>true</assertions>
                    <subresults>true</subresults>
                    <responseData>false</responseData>
                    <samplerData>false</samplerData>
                    <xml>false</xml>
                    <fieldNames>true</fieldNames>
                    <responseHeaders>false</responseHeaders>
                    <requestHeaders>false</requestHeaders>
                    <responseDataOnError>false</responseDataOnError>
                    <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
                    <assertionsResultsToSave>0</assertionsResultsToSave>
                    <bytes>true</bytes>
                    <sentBytes>true</sentBytes>
                    <url>true</url>
                    <threadCounts>true</threadCounts>
                    <idleTime>true</idleTime>
                    <connectTime>true</connectTime>
                  </value>
                </objProp>
                <stringProp name="filename">/masterdata/results/cb/cb_response_eight.csv</stringProp>
              </ResultCollector>
              <hashTree/>
            </hashTree>
          </hashTree>
        </hashTree>
      </hashTree>
    </hashTree>
  </hashTree>
</jmeterTestPlan>

gitlab运行程序

stages:
  - prep
  - build_single
  - test_single
  - clean_single
  - build_lb
  - test_lb
  - clean_lb
  - build_cb
  - test_cb
  - clean_cb

Prep:
  stage: prep
  script:
    - cp  -rf ./ /masterdata/
    - export COMPOSE_DOCKER_CLI_BUILD=1
    - export DOCKER_BUILDKIT=1
    - docker-compose -f ./LakesideMutual-master/docker-compose.yml build 
Build_single:
  stage: build_single
  script:
    - docker --version
    - docker-compose --version
    - docker-compose  -f ./NodeApp/docker-compose.yml up -d --remove-orphans
    - docker-compose  -f ./traefik/docker-compose_single.yml up -d --remove-orphans
    - docker-compose  -f ./LakesideMutual-master/docker-compose.yml up -d --remove-orphans
    - docker-compose  -f ./DockerJMeter/docker-compose.yml start
JmeterTestOne_single:
  stage: test_single
  script:
    - bash ./jmeter_ip/get_ipadress_one.sh
    - cp ipadress_one /masterdata/DockerJMeter/master/single/
    - docker exec jmeter ls home
    - docker exec jmeter jmeter -n -t /masterdata/DockerJMeter/master/single/one.jmx -R"$(<ipadress_one)"

JmeterTestsFive_single:
  stage: test_single
  script:
    - bash ./jmeter_ip/get_ipadress_five.sh
    - cp ipadress_five /masterdata/DockerJMeter/master/single/
    - docker exec jmeter ls home
    - docker exec jmeter jmeter -n -t /masterdata/DockerJMeter/master/single//five.jmx -R"$(<ipadress_five)"
    
JmeterTestEight_single:
  stage: test_single
  script:
    - bash ./jmeter_ip/get_ipadress_eight.sh
    - cp ipadress_eight /masterdata/DockerJMeter/master/single/
    - docker exec jmeter ls home
    - docker exec jmeter jmeter -n -t /masterdata/DockerJMeter/master/single//eight.jmx -R"$(<ipadress_eight)"
    
JmeterTestsTen_single:
  stage: test_single
  script:
    - bash ./jmeter_ip/get_ipadress_ten.sh
    - cp ipadress_ten /masterdata/DockerJMeter/master/single/
    - docker exec jmeter ls home
    - docker exec jmeter jmeter -n -t /masterdata/DockerJMeter/master/single//ten.jmx -R"$(<ipadress_ten)"
    

completeClean_single:
  stage: clean_single
  script: 
    - docker-compose  -f ./DockerJMeter/docker-compose.yml stop
    - docker-compose  -f ./NodeApp/docker-compose.yml stop
    - docker-compose  -f ./LakesideMutual-master/docker-compose.yml stop
    - docker-compose  -f ./traefik/docker-compose_single.yml stop
  allow_failure: true
#
#
#
# loadb_balancer
#
#
#
Build_lb:
  stage: build_lb
  script:
    - docker --version
    - docker-compose --version
    - docker-compose  -f ./NodeApp/docker-compose.yml up -d --remove-orphans
    - docker-compose  -f ./traefik/docker-compose_lb.yml up -d --remove-orphans
    - docker-compose  -f ./LakesideMutual-master/docker-compose.yml up -d --remove-orphans
    - docker-compose  -f ./DockerJMeter/docker-compose.yml start
JmeterTestOne_lb:
  stage: test_lb
  script:
    - bash ./jmeter_ip/get_ipadress_one.sh
    - cp ipadress_one /masterdata/DockerJMeter/master/lb/
    - docker exec jmeter ls home
    - docker exec jmeter jmeter -n -t /masterdata/DockerJMeter/master/lb/one.jmx -R"$(<ipadress_one)"

JmeterTestsFive_lb:
  stage: test_lb
  script:
    - bash ./jmeter_ip/get_ipadress_five.sh
    - cp ipadress_five /masterdata/DockerJMeter/master/lb/
    - docker exec jmeter ls home
    - docker exec jmeter jmeter -n -t /masterdata/DockerJMeter/master/lb//five.jmx -R"$(<ipadress_five)"
    
JmeterTestEight_lb:
  stage: test_lb
  script:
    - bash ./jmeter_ip/get_ipadress_eight.sh
    - cp ipadress_eight /masterdata/DockerJMeter/master/lb/
    - docker exec jmeter ls home
    - docker exec jmeter jmeter -n -t /masterdata/DockerJMeter/master/lb//eight.jmx -R"$(<ipadress_eight)" 
    
JmeterTestsTen_lb:
  stage: test_lb
  script:
    - bash ./jmeter_ip/get_ipadress_ten.sh
    - cp ipadress_ten /masterdata/DockerJMeter/master/lb/
    - docker exec jmeter ls home
    - docker exec jmeter jmeter -n -t /masterdata/DockerJMeter/master/lb//ten.jmx -R"$(<ipadress_ten)"
    
completeClean_lb:
  stage: clean_lb
  script: 
    - docker-compose  -f ./DockerJMeter/docker-compose.yml stop
    - docker-compose  -f ./NodeApp/docker-compose.yml stop
    - docker-compose  -f ./LakesideMutual-master/docker-compose.yml stop
    - docker-compose  -f ./traefik/docker-compose_lb.yml stop
  allow_failure: true 
#
#
#
# CB
#
#
#
Build_cb:
  stage: build_cb
  script:
    - docker --version
    - docker-compose --version
    - docker-compose  -f ./NodeApp/docker-compose.yml up -d --remove-orphans
    - docker-compose  -f ./traefik/docker-compose_cb.yml up -d --remove-orphans
    - docker-compose  -f ./LakesideMutual-master/docker-compose.yml up -d --remove-orphans
    - docker-compose  -f ./DockerJMeter/docker-compose.yml start
JmeterTestOne_cb:
  stage: test_cb
  script:
    - bash ./jmeter_ip/get_ipadress_one.sh
    - cp ipadress_one /masterdata/DockerJMeter/master/cb/
    - docker exec jmeter ls home
    - docker exec jmeter jmeter -n -t /masterdata/DockerJMeter/master/cb//one.jmx -R"$(<ipadress_one)"
JmeterTestsFive_cb:
  stage: test_cb
  script:
    - bash ./jmeter_ip/get_ipadress_five.sh
    - cp ipadress_five /masterdata/DockerJMeter/master/cb/
    - docker exec jmeter ls home
    - docker exec jmeter jmeter -n -t /masterdata/DockerJMeter/master/cb//five.jmx -R"$(<ipadress_five)"
    
JmeterTestEight_cb:
  stage: test_cb
  script:
    - bash ./jmeter_ip/get_ipadress_eight.sh
    - cp ipadress_eight /masterdata/DockerJMeter/master/cb/
    - docker exec jmeter ls home
    - docker exec jmeter jmeter -n -t /masterdata/DockerJMeter/master/cb//eight.jmx -R"$(<ipadress_eight)" 
    
JmeterTestsTen_cb:
  stage: test_cb
  script:
    - bash ./jmeter_ip/get_ipadress_ten.sh
    - cp ipadress_ten /masterdata/DockerJMeter/master/cb/
    - docker exec jmeter ls home
    - docker exec jmeter jmeter -n -t /masterdata/DockerJMeter/master/cb//ten.jmx -R"$(<ipadress_ten)"
    
completeClean_cb:
  stage: clean_cb
  script: 
    - docker-compose  -f ./DockerJMeter/docker-compose.yml stop
    - docker-compose  -f ./NodeApp/docker-compose.yml stop
    - docker-compose  -f ./LakesideMutual-master/docker-compose.yml stop
    - docker-compose  -f ./traefik/docker-compose_cb.yml stop
  allow_failure: true 

非常感谢您的宝贵时间!如果您需要更多信息,请告诉我 我尽我所能分享。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...