我们一起来给 Dubbo 的开发测试减减负

640?wx_fmt=jpeg

Photo by Kamil S on Unsplash


子观同学这几天有点忙,自从上周发布了Dubbo 生态添新兵,Dubbo Admin 发布 v0.1,社区的 issue 多了起来,例如能否在服务查询页面能否加一个分页功能?再内置一个MonitorService的服务?欢迎大家来参与社区共建,标记为 feature 的 issue 都可以来领喔 ?


640?wx_fmt=png


本文将围绕利用 Dubbo2.7 的元数据,看看 Dubbo Admin [1] 是如何实现服务测试功能的,通过泛化调用,在控制台上调用真实的服务提供者,以后的开发测试就会方便很多啦。✌️



使用方式



  • 部署服务提供者: 下载 Demo [2],此工程基于spring boot,方便在IDE或者命令行启动,对于服务测试来说,只需要启动dubbo-basic-provider即可。

  • 服务查询: 完成服务端部署后,可以到Dubbo Admin的服务测试页面上查询对应的服务:


640?wx_fmt=jpeg


  • 这里的信息和元数据类似,包含方法名,参数类型和返回值信息,点击右边的标签就可以进入服务测试页面;

  • 进入服务测试:


640?wx_fmt=jpeg


服务测试页面包含了两个json编辑器,参数类型的信息都是以json格式保存,这里需要填入对应的参数值(本例中数类型时String),填写完成后点击执行即可对服务端发起调用,调用结果展示在右边的编辑器中。如果调用失败,会显示详细的失败原因,下面来看一下调用失败的例子:


640?wx_fmt=jpeg


本例中,先关掉Dubbo服务提供者的进程,再执行服务测试,可以看到返回的结果是找不到服务提供者的异常。和普通调用一样,业务和框架的异常都会返回在结果中,方便业务排查。

  • 复合类型参数
    考虑
    UserService中的以下方法和类型:

//org.apache.dubbo.demo.api.UserServiceResult getUser(String name, UserInfoDO userInfoDO);
public class UserInfoDO {    private int id;    private LocationDO locationDO;    private DepartmentDO departmentDO;    @Override    public String toString() {        return "UserInfoDO{" +                "id=" + id +                ", locationDO=" + locationDO.toString() +                ", departmentDO=" + departmentDO.toString() +                '}';    }}
public class DepartmentDO {    private String departName;    private LocationDO departLocation;    @Override    public String toString() {        return "DepartmentDO{" +                "departName='" + departName + '\'' +                ", departLocation=" + departLocation.toString() +                '}';    }}
public class LocationDO {    private String address;    private int postNum;    @Override    public String toString() {        return "LocationDO{" +                "address='" + address + '\'' +                ", postNum=" + postNum +                '}';    }}


参数是比较复杂的符合类型参数,服务测试的时候,会逐层展开填写每一个field的值,如下图所示:

640?wx_fmt=jpeg


同样地,可以调用成功并且返回结果。



数据来源



服务测试中,最重要的就是完整的方法签名信息,和参数的类型信息。有了这些信息,才能够一步填入每个参数的值,拼装出完整的服务消费者。在Dubbo2.7中,新增了元数据中心,Dubbo Admin 的方法签名和参数类型信息就是从这里来的:


640?wx_fmt=png


如上图所示,服务端在运行的时候会将服务的元数据信息注册到元数据中心,格式如下:


{    ...    "methods": [        {            "name": "sayHello",            "parameterTypes": [                "org.apache.dubbo.demo.model.User"            ],            "returnType": "org.apache.dubbo.demo.model.Result"        },      ...    ],    "types": [        {            "type": "char"        },        {            "type": "long"        },        {            "type": "org.apache.dubbo.demo.model.Result",            "properties": {                "msg": {                    "type": "java.lang.String",                    "properties": {                        "value": {                            "type": "char[]"                        },                        "hash": {                            "type": "int"                        }                    }                },                "userName": {                    "type": "java.lang.String",                    "properties": {                        "value": {                            "type": "char[]"                        },                        "hash": {                            "type": "int"                        }                    }                }            }        },        {            "type": "org.apache.dubbo.demo.model.User",            "properties": {                "id": {                    "type": "java.lang.Long",                    "properties": {                        "value": {                            "type": "long"                        }                    }                },                "username": {                    "type": "java.lang.Sring",                    "properties": {                        "value": {                            "type": "char[]"                        },                        "hash": {                            "type": "int"                        }                    }                }            }        },       ...    ]}


与服务测试相关的就是methodstypes所包含的方法和类型信息,Dubbo Admin根据这些信息,将参数渲染到服务测试页面的Json Editor中,由用户来输入每个参数,每个成员变量的值。



泛化调用



有了参数类型,下一个问题就是怎么能够调用到服务端。


在传统的Dubbo RPC调用中,客户端需要依赖服务端的API jar包(参考前文Demo中的dubbo-basic-consumer)。这对于 Dubbo Admin 来说不太可能,因为服务的上下线是动态的,Dubbo Admin 无法动态增加 jar 包依赖,因此需要用到 Dubbo 中的泛化调用,指的是在没有服务端API接口的情况下,客户端直接通过 GenericService 接口来发起服务调用,返回值中的数据对象都用Map来表示。泛化调用在服务端不需要做特殊处理,只需要客户端发起即可。



总结和展望



本文简单介绍了服务测试的用法和原理,后续会进一步针对该功能进行增强,比如处理抽象类的参数类型,支持从 json 文件导入参数值,支持对参数值的保存等等,方便对服务接口进行回归测试。


[1] Dubbo Admin @GitHub:

https://github.com/apache/incubator-dubbo-ops


[2] 本文的 Demo 地址:

https://github.com/nzomkxia/dubbo-demo


本文作者:子观,社区昵称minApache Dubbo Commiter,阿里巴巴高级开发工程师,负责 Dubbo Admin 项目的开发和社区维护。



/ 「服务化改造实践」:Dubbo + REST /


640?wx_fmt=jpeg


/ 推荐一个值得参与的开发者活动 /


640?wx_fmt=jpeg


©每周一推

第一时间获得下期分享



640?wx_fmt=jpeg

Tips:

# 点下“好看”❤️

# 然后,公众号对话框内发送“缺本书”,试试手气??

# 本期奖品是RocketMQ技术内幕》 ?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值