泛化调用
Dubbo,提供了 泛化调用机制,再不依赖于服务提供者的 API 接口的情况之下进行远程服务调用的机制。
使用泛化调用,具有如下的好处:
- 接口解耦:消费者无需直接依赖于服务提供者的接口,减少编译依赖,系统架构更加灵活
- 动态调用:在运行时动态指定调用的服务名,方法名称和参数
- 跨语言调用:有利于不同语言编写的服务之间的交互
在 Dubbo 之中,提供了 GenericService 来处理泛化调用,具体的调用方式如下:
java
@DubboReference(interfaceName = "接口的全限定名")
private GenericService genericService;
java
genericService.$invoke(方法名,方法参数类型, 实际的方法参数)
具体的调用案例如下:
java
@DubboReference(interfaceName = "com.coding.helloworld.api.UserService")
private GenericService genericService;
java
@Test
public void testGenericService() throws IOException {
Map<String,Object> map = new HashMap<>();
map.put("class","com.coding.helloworld.api.vo.UserReq");
map.put("userName","coding123");
Object getUserInfo = genericService.$invoke(
"getUserInfo", new String[]{"com.coding.helloworld.api.vo.UserReq"}, new Object[]{map});
log.info("getUserInfo:{}",getUserInfo);
}