引言
参加了阿里天池第四届中间比赛,官方给的环境搭建文档含糊不清,无奈只能自己去读官方给的测评脚本的源码,然后在自己本地折腾一个差不多的环境,方便开发与debug,过程记录如下。我的本地环境为Win10,用的IDE是IntelliJ。这篇文章的目标是在本地将官方的agent-demo跑通并且可以在源码级别进行debug。本文的JVM启动参数都是从官方的测评脚本中摘录,鉴于本地内存资源可能有限,可以根据需要自行调节。(本文是按照官方给JVM参数,如果按照官方的JVM参数总计需要14G内存,大多数笔记本电脑可能吃不消,所以大家最好根据自己电脑的内存大小调小些)。
总体思路
- 安装windows版etcd;
- 写一个python脚本启动consumer和三个provider(通过
java -jar
)直接启动他们的jar包,jar包来自于官方给的consumer和provider示例; - 在IntelliJ中配置不同的启动参数(分别是一个consumer-agent与provider-agent);
- 使用Postman进行测试代码是否跑通;
- 使用wrk模拟官方的四轮压测;
第一步 安装windows版的etcd并且启动
这一步就不多说了,直接去https://github.com/coreos/etcd/releases下载解压即可。建议再安装一个可视化管理界面:etcd-browser。
安装完成后运行etcd
启动Consumer和三个Provider
我写了一个的启动脚本,脚本按照官方给的JVM参数和jar包分别启动Consumer和Provider,在github的地址如下:https://github.com/DQinYuan/boot_p_c
按照github上给的说明使用即可。
在IntelliJ中中配置不同的启动参数
用IntelliJ打开官方给agent-demo项目,打开运行参数配置窗口,如下:
然后添加四个SpringBoot的启动项,如下:
然后需要配置的内容如下:
首先需要起一个形象生动的名字,我把这四个agent分别叫做consumer_agent,small_provider_agent,medium_provider_agent和large_provider_agent。
然后这四个启动项最大的不同其实就是VM options,我从官方的测评脚本中提取了四个JVM的启动参数分别如下,直接分别复制过去就好了:
JVM启动参数 | |
---|---|
consumer_agent | -Xms1536M -Xmx1536M -Dtype=consumer -Dserver.port=20000 -Detcd.url=http://127.0.0.1:2379 |
small_provider_agent | -Xms512M -Xmx512M -Dtype=provider -Dserver.port=30000 -Ddubbo.protocol.port=20889 -Detcd.url=http://127.0.0.1:2379 |
medium_provider_agent | -Xms1536M -Xmx1536M -Dtype=provider -Dserver.port=30001 -Ddubbo.protocol.port=20890 -Detcd.url=http://127.0.0.1:2379 |
large_provider_agent | -Xms2560M -Xmx2560M -Dtype=provider -Dserver.port=30002 -Ddubbo.protocol.port=20891 -Detcd.url=http://127.0.0.1:2379 |
之后可以根据自己的需要运行几个或全部运行,也可以使用debug模式运行,方便在源码上进行debug。
使用Postman测试代码能否跑通
Postman是一个模拟http请求的工具,下载地址如下:
https://www.getpostman.com/apps
下面我们来用Postman来测一下这整个调用过程能否正确进行。
consumer是整个调用过程的开始,官方的consumer示例的入口是:
http://localhost:8087/invoke
尝试着用Postman请求这个地址:
如果你对官方的agent-demo没有做任何修改的话,返回类似如下:
服务器出了500错误,打开IntellJ,看到consumer_agent报如下的错误:
如果你有兴趣的话,可以使用debug模式打断点进入consumer_agent看一下,我这里直接告诉你如何修正这个错误。
将com.alibaba.dubbo.performance.demo.agent.HelloController
的第84行左右的代码由String s = new String(bytes);
改成String s = new String(bytes).trim();
,如下图:
重新运行consumer_agent,用Postman模拟请求,果然错误被修正了:
用wrk模拟官方的四轮测评
wrk没有windows版本,比较无奈,这里只能用另一台linux机器或者虚拟机了,如果使用另一台linux机器来压测本地代码的话,切记要把本地Win10的防火墙关闭,不然请求都会被墙住。
首先在linux机器上安装wrk,这个就不多说了。
官方给的评测脚本(benchmarker)中的benchmarker\workflow\benchmark
目录下有一个叫wrk.lua
的文件,把这个文件拷贝到linux机器上,在这个文件所在的目录下运行如下的一些命令进行四轮测试(参数是按照官方给的脚本与要求):
第一轮(预热):
wrk -t2 -c512 -d30s -T5 \
--script=./wrk.lua \
--latency http://192.168.3.12:8087/invoke
第二轮:
wrk -t2 -c128 -d60s -T5 \
--script=./wrk.lua \
--latency http://192.168.3.12:8087/invoke
第三轮:
wrk -t2 -c256 -d60s -T5 \
--script=./wrk.lua \
--latency http://192.168.3.12:8087/invoke
第四轮:
wrk -t2 -c512 -d60s -T5 \
--script=./wrk.lua \
--latency http://192.168.3.12:8087/invoke
注意其中192.168.3.12为consumer所在的机器的地址,这里要改成你自己的机器的地址。
END
关于赛题的一些信息总结
下面的一些内容与本文主题无关,只是进行一些赛题信息总结。
端口占用总结
provider与consumer固定占用的端口
占用端口/用途 | |
---|---|
consumer | 8087/http请求入口 |
small_provider | 20889/dubbo调用接口 |
medium_provider | 20890/dubbo调用接口 |
large_provider | 20891/dubbo调用接口 |
官方的agent_demo占用的端口
占用端口/用途 | |
---|---|
consumer_agent | 20000/http请求入口 |
small_provider_agent | 30000/http请求入口 |
medium_provider_agent | 30001/http请求入口 |
large_provider_agent | 30002/http请求入口 |
官方Agent-Demo代码流程分析
图中,C-Agent是指Consumer Agent,P-Agent是指Provider Agent。图的上半部分是整个RPC调用的流程,下半部分则是具体描绘了P-Agent与Provider之间Netty通信过程。