问题描述
我现在正在做硕士论文实验。 基本上,它是微服务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("${__machineName()}" == "75e096bb2ece",)}</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 > 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 (将#修改为@)