客户端在没有拿到服务器端接口定义的情况下通过反射获取服务
1.服务器端定义接口
package cn.edu.tju.service;
public interface DevelopService {
String invoke(String param);
}
2.服务器端实现接口
package cn.edu.tju.service;
import org.apache.dubbo.config.annotation.DubboService;
@DubboService(group = "group1",version = "1.0")
public class DevelopProviderServiceV1 implements DevelopService{
@Override
public String invoke(String param) {
StringBuilder s = new StringBuilder();
s.append("ServiceV1 param:").append(param);
return s.toString();
}
}
3.客户端在没有拿到服务器端接口定义的情况下,直接通过反射获取服务
package cn.edu.tju.service;
import com.alibaba.fastjson.JSON;
import org.apache.dubbo.common.config.ReferenceCache;
import org.apache.dubbo.config.ReferenceConfig;
import org.apache.dubbo.config.utils.SimpleReferenceCache;
import org.apache.dubbo.rpc.service.GenericService;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class GenericTask implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
GenericService genericService = buildGenericService("cn.edu.tju.service.DevelopService","group1","1.0");
//传入需要调用的方法,参数类型列表,参数列表
Object result = genericService.$invoke("invoke", new String[]{"java.lang.String"}, new Object[]{"g1"});
System.out.println("GenericTask Response: " + JSON.toJSONString(result));
}
private GenericService buildGenericService(String interfaceClass, String group, String version) {
ReferenceConfig<GenericService> reference = new ReferenceConfig<>();
reference.setInterface(interfaceClass);
reference.setVersion(version);
//开启泛化调用
reference.setGeneric("true");
reference.setTimeout(30000);
reference.setGroup(group);
ReferenceCache cache = SimpleReferenceCache.getCache();
try {
return cache.get(reference);
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
}