前言:东家系统是用dubbo做的微服务架构,按不同业务模块分出不同的dubbo服务,大大小小有几十个项目,项目之间都是通过rpc接口通信,测试过程经常遇到当前测试项目依赖其他项目的处理结果(rpc回调)而受其他项目服务异常影响阻塞测试,这是问题之一;为保证数据完整性和一致性,项目中用到了大量的定时任务去处理一些业务,定时任务的触发器虽说是可配的,但想要灵活控制定时任务的执行,还是有点麻烦,这是问题之二。这两个问题困扰笔者很久,一直没有思路,也苦于加班加到怀疑人生无心思考,直到有位同事提出一个思路:写一个rpc接口集成到公司项目中,再写一个web服务,提供http接口供测试同事通过http协议调用,在该http接口中通过泛化调用我们集成到公司项目的rpc接口,在rpc接口中再通过反射调用公司项目的方法,这样可以解决上面说的两个问题。当时听到这个idea简直眼前一亮,这位同事平时点子也多,和他共事算是在东家为数不多开心的事情之一。
废话说完了,开干。
简单图解:
涉及知识储备:springmvc、dubbo、java反射,对这些不熟的同学可以去百度了解下,这里不做展开。
1.编写web服务
1.1 请求参数DTO
package com.etyero.entity;
import com.alibaba.fastjson.JSONArray;
/**
* RequestDTO
*
* @author lijialong
*/
public class RequestDTO {
private String targetService; // 目标类
private String targetMethod; // 目标方法
private JSONArray params; // 目标方法入参
public String getTargetService() {
return targetService;
}
public void setTargetService(String targetService) {
this.targetService = targetService;
}
public String getTargetMethod() {
return targetMethod;
}
public void setTargetMethod(String targetMethod) {
this.targetMethod = targetMethod;
}
public JSONArray getParams() {
return params;
}
public void setParams(JSONArray params) {
this.params = params;
}
}
1.2 编写controller,处理入参,泛化调用rpc。
package com.etyero.controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logg