公司是采用微服务来做模块化的,各个模块之间采用dubbo通信。好处就不用提了,省略了之前模块间复杂的http访问。不过也遇到一些问题:
测试需要配合写消费者的代码
对于开发来说,倒是挺省劲。但是对于测试来说就有点麻烦了, 每次还要去写dubbo的消费程序,而且每次新增一个接口,都需要重新改写程序,费时费力。
接口返回的结果无法定制
由于我这边是做一些商品的推荐,每次结果的类型都是相同的,只是内部的算法不同。不过接口只是返回id,无法直观的判断商品相似程度或者用户的偏好程度,需要一个可视化的返回结果界面。
于是在这种需求下,我设想了一个小程序,它可以满足下面的功能:
测试可以根据测试需要,在界面自动选择请求的class和方法
开发完成后,测试界面自动扫描出dubbo的提供者的class和对应的方法
返回结果自动请求对应的图片和文字说明
提前放一个效果图:
1 扫描某个包下所有的类
小程序开始的第一步就是需要扫描某个包下所有的dubbo实现类。
由于工程是springboot,因此最终部署是在jar中。这时,就需要面临两个问题,如果是在开发工具中,如何获取包下的所有类;如果是在jar中,如何获取包下所有的类。
首先通过classloader可以加载特定路径下的所有URL:
Enumeration dirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName);
while (dirs.hasMoreElements()) {
URL url = dirs.nextElement();
//如果是jar,则采用JarURLConnection的方式连接,获得class文件
if("jar".equals(url.getProtocol())){
findClassesInJar(url,classes,pack);
}else{
findClassesInSrc(url,classes,pack);
}
}
在工程中
在工程中,class其实是以目录形式存放在本地的,直接按照file的方式遍历扫描class文件就行了:
public static void findClassesInSrc(URL url, Set> classes, String basePackage) throws UnsupportedEncodingException {
File dir = new File(URLDecoder.decode(url.getFile(), "UTF-8"));
if (!dir.exists() || !dir.isDirectory()) {
return;
}
Arrays.stream(dir.listFiles())
.forEach(file -> {
<