经常遇到上线后出现一些莫名其妙的问题,特别是线上调用第三方dubbo服务的时候,如果没有输出返回结果信息,如何排查是否是第三方dubbo接口返回的数据有问题,还是我们本身的代码有问题呢,下面这段代码可以实现在本地环境直接调用线上的dubbo服务接口,并输出响应结果,来帮助我们定位问题。直接拷贝代码修改一下dubbo服务IP和请求的接口。
package com.test;
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ReferenceConfig;
import com.alibaba.fastjson.JSON;
import com.baj.product.client.domain.product.ItemSkuQuery;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* @Author: pengCheng
* @Date: 2021/4/14 12:52
* @Description : 本地调用线上dubbo接口
*/
public class LocalReqDubbo {
//dubbo服务名 替换自己的
static String serviceInterface = "com.baj.product.client.service.product.ItemSkuReadService";
//要调用的接口名 替换自己的
static String methodName = "queryList";
//替换成自己dubbo服务ip
static String dubboURl = "dubbo://XXX.XXX.XXX.XXX:10086";
public static void main(String[] args) {
ReferenceConfig reference = new ReferenceConfig();
// 查询参数
try {
Class<?> forName = Class.forName(serviceInterface);
// 1. 获取dubbo服务链接
Object object = init(reference, forName);
// 2. 校验获取方法
Method method = getMethod(forName);
// 3. 设置查询参数,接口中多个参数,使用数组形式赋值。
Object[] objectArgs = new Object[1];
// 构建请求参数,请根据自己的实际情况修改
ItemSkuQuery query = new ItemSkuQuery();
query.setCurPage(1);
query.setPageSize(1000);
query.setState(1);
query.setShopCode("1075");
objectArgs[0] = query;
// 4. 指定方法,参数 调用dubbo接口方法
Object invokeResult = method.invoke(object, objectArgs[0]);
// 5. 打印参数调用结果
System.out.println("invokeResult = [" + JSON.toJSONString(invokeResult) + "]");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
/**
* 获取需要调用的方法
* @param forName
* @return
*/
private static Method getMethod(Class<?> forName) {
Method[] methods = forName.getMethods();
for (Method m : methods) {
if (methodName.equals(m.getName())) {
return m;
}
}
return null;
}
private static Object init(ReferenceConfig reference, Class<?> forName) {
reference.setApplication(new ApplicationConfig("remote-test"));
reference.setInterface(forName);
reference.setUrl(dubboURl);
//超时时间
reference.setTimeout(30000);
//服务版本号
reference.setVersion("1.0.2");
Object o = reference.get();
return o;
}
}
响应结果如下: