客户端在没有拿到服务器端接口定义的情况下通过反射获取服务
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{@Overridepublic 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 {@Overridepublic 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());}}
}