美文网首页Java 杂谈JAVAjava
实战Jmeter压测Dubbo服务接口

实战Jmeter压测Dubbo服务接口

作者: 阿里加多 | 来源:发表于2018-10-30 15:41 被阅读55次

    一、前言

    最近在做一些业务上云的项目,其中远程Rpc调用方式我们选择了Dubbo,为便于收集压测信息,我们选择了使用Jmeter来做压测工具,本文就来简单介绍如何使用Jmeter压测Dubbo服务接口,以及需要注意的事情。

    二、Jmeter使用

    2.1 下载Jmeter

    https://jmeter.apache.org/download_jmeter.cgi 下载二进制包

    image.png
    下载后解压缩后,目录如下:
    image.png

    2.2 界面模式启动

    进入解压目录的bin目录,然后mac下执行 sh jmeter.sh ,如下图:


    image.png

    然后就会弹出界面:


    image.png

    2.3 项目中引入Jmeter依赖

        <dependency>
                <groupId>org.apache.jmeter</groupId>
                <artifactId>ApacheJMeter_core</artifactId>
                <version>3.0</version>
            </dependency>
            <dependency>
                <groupId>org.apache.jmeter</groupId>
                <artifactId>ApacheJMeter_java</artifactId>
                <version>3.0</version>
            </dependency>
    

    三、编写Jmeter需要的Dubbo扩展插件

    public class ConsumerHelloService extends AbstractJavaSamplerClient {
    
        private Hello hello = null;
    
        @Override
        public SampleResult runTest(JavaSamplerContext context) {
    
            System.out.println("---begin run----");
    
            SampleResult sr = new SampleResult();
    
            try {
                sr.sampleStart();
    
                String result = hello.sayHello(UUID.randomUUID().toString());
                
                sr.setResponseData("from provider:" + result, null);
                sr.setDataType(SampleResult.TEXT);
                sr.setSuccessful(true);
                sr.sampleEnd();
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            System.out.println("---end run----");
    
            return sr;
        }
    
        @Override
        public void setupTest(JavaSamplerContext context) {
            System.out.println("---begin setup----");
            try {
                DubboFactory dubboFactory = new DubboFactory();
                dubboFactory.setRegistry("127.0.0.1:2181");
                dubboFactory.setGroup("dubbo");
                dubboFactory.init();
                
                hello = dubboFactory.getReference(Hello.class, "dubbo", null, true, null,
                        null);
            } catch (Exception e) {
                System.out.println(e.getLocalizedMessage());
                throw e;
            }
            System.out.println("---end setup----");
        }
    }
    
    • 如上代码,插件类需要继承AbstractJavaSamplerClient类,并且重写runTest和setupTest这两个方法。

    • setupTest方法会在ConsumerHelloService类实例化后调用一次,用来执行一些初始化操作,这里我们用来完成对服务接口Hello的消费,也就是链接服务提供方,并返回一个Hello的代理类。

    • runTest方法则用来具体调用Hello接口的方法,我们压测也就是频繁的调用runTest来测试hello的sayHello方法。

    四、dubbo插件打包与压测

    4.1 dubbo插件的安装

    首先我们需要把ConsumerHelloService类所在的应用打包为一个jar包,然后把打包好的jar放入到jmeter目录的apache-jmeter/lib/ext:


    image.png

    然后需要把打成的jar包里面所依赖的包放入到apache-jmeter/lib。
    那么如何找jar包依赖的jar那,一个简单的方法是把项目添加springboot的maven插件:

    <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>2.0.2.RELEASE</version>
                    <configuration>
                        <executable>false</executable>
                        <excludeDevtools>true</excludeDevtools>
                    </configuration>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
    

    springboot插件的机制打成的jar结构如下:


    image.png

    其中lib中会包含所有依赖的jar.

    4.2 测试

    按照上面讲解的执行sh jmeter.sh启动 界面

    然后添加线程组


    image.png

    然后可以设置压测线程个数等属性


    image.png

    然后添加Java请求配置组件


    image.png

    然后在类名称这下拉框中就会存在dubbo插件类,


    image.png

    然后线程组设置线程个数,并保存:


    image.png

    到这里说明Jmeter已经找到了我们的dubbo扩展插件,下面我们添加一些监视器以便监控结果


    image.png

    这里你可以选择你需要的监控页面

    最后单击绿色三角 开始压测:


    image.png

    注意:dubbo服务提供方线程池默认是200个线程,如果你压测时候设置线程个数超过200,则会抛出下面异常:


    image.png

    这时候你需要修改服务提供方的线程池中线程个数,具体是调用ProtocolConfig类的setThreads方法来设置,或者如果是xml方式,使用下面方式设置:


    image.png

    最后、Java并发编程之美已经出版

    京东链接: https://item.jd.com/12450812.html
    天猫链接:https://detail.tmall.com/item.htm?spm=a220m.1000858.1000725.61.59a73c85cVE3Sk&id=579705310959&user_id=1932014659&cat_id=2&is_b=1&rn=8030c6abc3a06ef8b8e63bc1badcbbb2

    相关文章

      网友评论

        本文标题:实战Jmeter压测Dubbo服务接口

        本文链接:https://www.haomeiwen.com/subject/zpmgtqtx.html