《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 dubbo.apache.org/zh-cn/blog/service-test.html 「nzomkxia」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

基于Dubbo2.7的元数据,Dubbo Admin实现了服务测试功能,可以通过泛化调用,在控制台上调用真实的服务提供者

使用方式

  • 部署服务提供者: 可以在这里下载demo,此工程基于spring boot,方便在IDE或者命令行启动,对于服务测试来说,只需要启动dubbo-basic-provider即可。
  • 服务查询: 完成服务端部署后,可以到Dubbo Admin的服务测试页面上查询对应的服务: testSearch 这里的信息和元数据类似,包含方法名,参数类型和返回值信息,点击右边的标签就可以进入服务测试页面
  • 服务测试: testSuccess 服务测试页面包含了两个json编辑器,参数类型的信息都是以json格式保存,这里需要填入对应的参数值(本例中数类型时String),填写完成后点击执行即可对服务端发起调用,调用结果展示在右边的编辑器中,如果调用失败,会显示详细的失败原因,下面来看一下调用失败的例子: testFail 本例中,先关掉Dubbo服务提供者的进程,再执行服务测试,可以看到返回的结果是找不到服务提供者的异常。和普通调用一样,业务和框架的异常都会返回在结果中,方便业务排查。
  • 复合类型参数 考虑UserService中的以下方法和类型:

//org.apache.dubbo.demo.api.UserService
Result 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的值,如下图所示: complex 同样可以调用成功并且返回结果

原理:数据来源

服务测试中,最重要的就是完整的方法签名信息,和参数的类型信息,有了这些信息才能够一步步填入每个参数的值,拼装出完整的服务消费者。在Dubbo2.7中,新增了元数据中心,Dubbo Admin的方法签名和参数类型信息就是从这里来的: medatada 如图所示,服务端在运行的时候会将服务的元数据信息注册到元数据中心,格式如下:

{
...
"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. 1. 使用方式
  2. 2. 原理:数据来源
  3. 3. 原理: 泛化调用
  4. 4. 总结和展望