Dubbo使用invoke指令来调用dubbo接口

前言

最近被分配了一个任务,是通过​​dubbo​​​的方式对外提供服务,​​dubbo​​​没有我们一般的web项目中的​​Controller​​​层,所以没有办法通过​​http​​​的方式进行调用调试。作为萌新的我,确实有点一筹莫展,直到被老司机提醒使用​​dubbo​​​ ​​invoke​​的方式进行接口测试,我才有方向。

关于dubbo的搭建可参考我的博客:​​SpringBoot使用dubbo实现RPC调用​​

正文

首先我们要知道​​Dubbo​​​不同于传统的​​web​​​项目需要运行在类似于​​tomcat​​​、​​jboss​​​等​​WEB​​​容器中,​​Dubbo​​​的运行机制我们可以参考下面​​Dubbo​​的组件来进行探究。

Dubbo 核心组件

  • ​Provider​​: 暴露服务的提供方,可以通过jar或者容器的方式启动服务
  • ​Consumer​​:调用远程服务的服务消费方。
  • ​Registry​​: 服务注册中心和发现中心。
  • ​Monitor​​: 统计服务和调用次数,调用时间监控中心。
  • ​Container​​:服务运行的容器。

Dubbo使用invoke指令来调用dubbo接口_dubbo


Dubbo的​​Container​​​模块,是一个独立的容器,它就可以为​​dubbo​​​提供服务发现机制。并且这个​​Container​​​容器默认是采用​​dubbo​​​协议在20880端口号暴露服务,所以我们要通过这个接口来调用​​dubbo​​接口。

使用invoke调用dubbo接口服务

使用telnet命令进入控制台
命令:​​​telnet ip​​ 端口

telnet 127.0.0.1 20880

Dubbo使用invoke指令来调用dubbo接口_invoke_02

查看可用的dubbo接口

  • ​ls​​: 显示服务列表。
  • ​ls -l​​ :显示服务详细信息列表。
  • ​ls XxxService​​ :显示服务的方法列表。
  • ​ls -l XxxService​​ : 显示服务的方法详细信息列表。

使用invoke命令注入

如果注入的是​​json​​​,可参考以下格式进行​​dubbo​​服务调用

invoke XxxService.xxxMethod({“name”: “luo”}, 18, “男”)

如果注入的是对象,可参考以下格式进行​​dubbo​​服务调用:

invoke XxxService.xxxMethod([{“name”:“luo”,“age”:18,“sex”:“男”,“class”:“com.luo.entity.User”}])

Dubbo使用invoke指令来调用dubbo接口_溪源_03

快速生成Invoke命令

使用一个​​Demo​​​可以帮助大家生成对应的​​invoke​​命令

public class GenerateInvoke {

public static void main(String[] args) throws NoSuchMethodException {
QueryReq queryReq = new QueryReq();
queryReq.setName("溪源")
String invokeCommand = getInvoke(queryReq, ICeshiService.class, "query");
System.out.println("invoke命令↓");
System.out.println(invokeCommand);
}


/**
* 生成invoke命令
* @param reqParam 请求参数
* @param reqService 请求的接口service服务
* @param reqMathed 请求的service下的方法
* @throws NoSuchMethodException
*/
public static String getInvoke(Object reqParam, Class<?> reqService, String reqMathed) throws NoSuchMethodException {
JSONObject jsonObject = JSONObject.parseObject(JsonUtil.toJson(reqParam));
jsonObject.put("class", reqParam.getClass().getName());
return "invoke "+ reqService.getName()+
"."+ reqService.getMethod(reqMathed,reqParam.getClass()).getName()+
" ("+jsonObject.toJSONString()+")";
}
}

Dubbo使用invoke指令来调用dubbo接口_java_04