前言
通常来说一个dubbo
服务都是对内给内部调用的,但也有可能一个服务就是需要提供给外部使用,并且还不能有使用语言的局限性。
比较标准的做法是对外的服务我们统一提供一个openAPI
,这样的调用方需要按照标准提供相应的appID
以及密钥来进行验签才能使用。这样固然是比较规范和安全,但复杂度也不亚于开发一个单独的系统了。
这里所讲到的没有那么复杂,就只是把一个不需要各种权限检验的dubbo
服务对外提供为HTTP
服务。
调用示例:
准备工作
以下是本文所涉及到的一些知识点:
- Spring相关知识。
- Java反射相关知识。
- SpringMVC相关知识。
其实思路很简单,就是利用
SpringMVC
提供一个HTTP
接口。
在该接口中通过入参进行反射找到具体的dubbo
服务实现进行调用。
HttpProviderConf配置类
首先需要定义一个HttpProviderConf
类用于保存声明需要对外提供服务的包名,毕竟我们反射时需要用到一个类的全限定名:
public class HttpProviderConf {
/**
* 提供http访问的包
*/
private List<String> usePackage ;
//省略getter setter方法
}
就只有一个usePackage
成员变量,用于存放需要包名。
至于用List
的原因是允许有多个。
请求响应入参、出参
HttpRequest入参
public class HttpRequest {
private String param ;//入参
private String service ;//请求service
private String method ;//请求方法
//省略getter setter方法
}
其中param
是用于存放真正调用dubbo
服务时的入参,传入json
在调用的时候解析成具体的参数对象。
service
存放dubbo
服务声明的interface API
的包名。
method
则是真正调用的方法名称。
HttpResponse 响应
public class HttpResponse implements Serializable{
private static final long serialVersionUID = -552828440320737814L;
private boolean success;//成功标志
private String code;//信息码
private String description;//描述
//省略getter setter方法
}
这里只是封装了常用的HTTP
服务的响应数据。
暴露服务controller
最重要的则是controller里的实现代码了。
先贴代码:
@Controller
@RequestMapping("/dubboAPI")
public class DubboController implements