教程丨使用MeterSphere做Dubbo接口测试

发布于 2020年08月12日

Dubbo是阿里巴巴公司开源的一个高性能、轻量级Java RPC服务框架。它可以让应用通过高性能的RPC实现服务的输出和输入功能,可与Spring框架无缝集成。随着近几年微服务架构的兴起,因为其理念非常契合微服务,在国内有着比较广泛的用户群体。

针对HTTP接口的接口测试大家都比较熟悉,那么针对Dubbo框架的接口该如何进行测试呢?本文将介绍常见的Dubbo接口测试方式,并使用MeterSphere开源持续测试平台手把手地教您如何进行Dubbo接口测试。 

Dubbo简介

Dubbo的技术架构如下图所示:

■ 节点角色说明

节点角色说明
Provider暴露服务的服务提供方
Consumer调用远程服务的服务消费方
Registry服务注册与发现的注册中心
Monitor统计服务的调用次数和调用时间的监控中心
Container服务运行容器

■ 调用关系说明

1. 服务容器负责启动、加载、运行服务提供者;

2. 服务提供者在启动时,向注册中心注册自己提供的服务;

3. 服务消费者在启动时,向注册中心订阅自己所需的服务;

4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者;

5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用;

6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

部署 Dubbo 服务

要针对Dubbo接口进行测试,首先我们需要有一套基于Dubbo 框架的应用系统。

这里我准备了一个使用了Dubbo框架的SpringBoot Demo应用来进行说明,项目地址为:https://github.com/metersphere/dubbo-docker。在此感谢下原项目作者binblee提供的项目(https://github.com/binblee/dubbo-docker)。如果大家自己已经有了现成的基于Dubbo框架的应用,可以忽略掉这一部分。

应用整体比较简单,只提供了如下的一个接口两个方法。

package com.example.service.producer;
import com.example.service.Greetings;
import com.example.service.User;
/**
 * Created by libin on 9/19/16.
 */
public class GreetingsImpl implements Greetings {
    public String say(String name) {
        return "Greetings from " + name;
    }
    public String hello(User user) {
        return "Name: "+user.name+", Age: "+user.age+", Gender: "+user.gender;
    }
}

项目的启动方式在GitHub上的README中已经有说明,在此就不再赘述。当我们将项目运行起来以后,通过HTTP GET方法请求下consumer的/路径,可以看到consumer给我们返回了如下信息,说明provider是可以正常提供服务的。

[~/Documents/workspace/dubbo-docker/docker]# curl http://localhost:8899
Greetings from Dubbo Docker

常见的 Dubbo 接口测试方法

像Dubbo这样的RPC框架,其提供的接口更多是一个应用系统之间各个组件/服务内部通信使用的,不像基于HTTP的接口那样,其实可选择的测试工具不是特别多。

根据我自己的经验,一般有如下几种方式来进行 Dubbo 接口的测试,如果大家有其他更好的方式和工具,欢迎联系作者进行补充。

■ 自己写Java或Python等代码注册成一个consumer调用服务进行测试;

■ 像上面例子里的consumer一样,由开发团队把需要测试的接口再包装成HTTP接口,通过测试HTTP接口测手段进行测试;

■ 在测试环境中通过官方提供的Telnet命令,直接invoke特定服务进行测试;

[~/Documents/workspace/dubbo-docker]# telnet localhost 20880
Trying ::1...
Connected to localhost.
Escape character is '^]'.

dubbo>ls
com.example.service.Greetings
dubbo>ls com.example.service.Greetings
say
hello
dubbo>invoke com.example.service.Greetings.say("Tom")
"Greetings from Tom"
elapsed: 0 ms.
dubbo>

■ 使用JMeter配合Dubbo Sampler插件进行测试。

使用MeterSphere进行Dubbo接口测试

除了上面提到的方法以外,我们还可以使用MeterSphere这样的完全兼容JMeter的开源测试平台来进行Dubbo接口测试。

关于MeterSphere的详细介绍及部署使用方式,可以参考MeterSphere官网的相关信息(www.metersphere.io)。在这篇文章中,我们只聚焦于使用MeterSphere进行Dubbo接口测试的场景进行介绍。

■ 准备工作

● 已经部署了MeterSphere环境,并且有具有执行接口测试权限的账号;

● 准备Dubbo接口相关信息,包括注册中心连接信息、接口定义等。

如果使用了本文中提到的Duboo Demo项目,由于服务注册时的IP地址是producer容器的IP,可能会出现调用不通的情况。这里我们通过zk命令手动地把这个Demo环境的provider信息改一下,把原来provider中的容器IP改为部署该Demo应用的主机 IP。

[~/Documents/workspace/dubbo-docker/docker]# zkcli -s 192.168.2.170:2181
2020/08/06 18:55:25 Connected to 192.168.2.170:2181
>>> ls /dubbo/com.example.service.Greetings/providers
[dubbo%3A%2F%2F172.19.0.2%3A20880%2Fcom.example.service.Greetings%3Fanyhost%3Dtrue%26application%3Dproducer-app%26dubbo%3D2.5.3%26interface%3Dcom.example.service.Greetings%26methods%3Dsay%2Chello%26pid%3D1%26revision%3D1.0-SNAPSHOT%26side%3Dprovider%26timestamp%3D1596709972791]
>>> delete /dubbo/com.example.service.Greetings/providers/dubbo%3A%2F%2F172.19.0.2%3A20880%2Fcom.example.service.Greetings%3Fanyhost%3Dtrue%26application%3Dproducer-app%26dubbo%3D2.5.3%26interface%3Dcom.example.service.Greetings%26methods%3Dsay%2Chello%26pid%3D1%26revision%3D1.0-SNAPSHOT%26side%3Dprovider%26timestamp%3D1596709972791
Deleted /dubbo/com.example.service.Greetings/providers/dubbo%3A%2F%2F172.19.0.2%3A20880%2Fcom.example.service.Greetings%3Fanyhost%3Dtrue%26application%3Dproducer-app%26dubbo%3D2.5.3%26interface%3Dcom.example.service.Greetings%26methods%3Dsay%2Chello%26pid%3D1%26revision%3D1.0-SNAPSHOT%26side%3Dprovider%26timestamp%3D1596709972791
>>> create /dubbo/com.example.service.Greetings/providers/dubbo%3A%2F%2F192.168.2.170%3A20880%2Fcom.example.service.Greetings%3Fanyhost%3Dtrue%26application%3Dproducer-app%26dubbo%3D2.5.3%26interface%3Dcom.example.service.Greetings%26methods%3Dsay%2Chello%26pid%3D1%26revision%3D1.0-SNAPSHOT%26side%3Dprovider%26timestamp%3D1596709972791
Created /dubbo/com.example.service.Greetings/providers/dubbo%3A%2F%2F192.168.2.170%3A20880%2Fcom.example.service.Greetings%3Fanyhost%3Dtrue%26application%3Dproducer-app%26dubbo%3D2.5.3%26interface%3Dcom.example.service.Greetings%26methods%3Dsay%2Chello%26pid%3D1%26revision%3D1.0-SNAPSHOT%26side%3Dprovider%26timestamp%3D1596709972791
>>>

■ 创建项目

登录MeterSphere平台后,点击在上方菜单中选择“接口测试”,在项目列表中点击“创建项目”按钮。

■ 创建接口测试

点击界面上方中央的“创建测试”按钮,创建新的接口测试集。

在“接口测试”创建页面选择该测试所属的项目,并填入接口测试集名称。

■ 配置场景信息

点击左侧场景列表中的“场景配置”,在右侧的场景信息中,填入场景名称,并选择“Dubbo配置”标签页。在该页面中把准备的注册中心连接信息、接口版本等信息填写好。

在场景中配置的变量、HTTP请求头、Dubbo配置等信息适用于该场景下的所有请求。

■ 添加Dubbo请求

点击左侧场景列表中的“添加请求”按钮,选择Dubbo类型的接口进行添加。

填写该请求的名称后,点击“Get Providers List”按钮,从注册中心中获取服务列表。在下拉列表中选择需要测试的接口及方法,根据该方法的定义,传入所需的参数。

上面添加的接口只有一个String类型的参数,再次添加一个参数类型为“自定义类”的请求。这里我们查看一下代码中这个接口的定义,发现其需要一个User类的对象作为参数。

package com.example.service;

/**
 * Created by libin on 9/19/16.
 */
public interface Greetings {
    String say(String name);
    String hello(User user);
}

同时结合User类的定义。

package com.example.service;

enum Gender {
    MALE, FEMALE;
}

public class User {
    public String name;
    public Integer age;
    public Gender gender;
}

我们可以通过这样的形式传入参数值 {"name":"姓名", "age":年龄, "gender": "MALE 或 FEMALE"}。

当接口请求都添加完成后,我们先把默认添加的那个HTTP请求删掉,然后就可以点击“保存并执行”按钮,进行Dubbo接口的测试了。

■ 查看报告

测试执行完成后,即可在页面上查看到测试执行的结果报告。

点击报告中的场景及请求,可以查看到请求的详细内容及响应内容。

■ 转化为性能测试

接口测试执行通过后,我们还可以通过MeterSphere提供的接口测试转性能测试的功能,直接发起针对Dubbo接口的性能测试。

在“接口测试”页面的“测试”下拉列表中,选择我们刚刚创建的测试,点击更多操作中的“创建性能测试”选项。

在弹出的页面中根据需求配置压力参数后,点击“保存并执行”按钮即可发起性能测试。

关于 MeterSphere

MeterSphere 是一站式的开源持续测试平台,致力于通过开源技术创新加速高质量的软件交付,推动中国测试行业整体效率的提升。

MeterSphere项目遵循GPL v2.0开源许可协议,涵盖测试跟踪、接口测试、性能测试、 团队协作等功能,兼容 JMeter 等开源标准,有效助力开发和测试团队充分利用云弹性进行高度可扩展的自动化测试。