java本地调用远程dubbo接口,本机调用线上dubbo接口

经常遇到上线后出现一些莫名其妙的问题,特别是线上调用第三方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;
    }

}

响应结果如下:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值