前言
通常来说一个dubbo服务都是对内给内部调用的,但也有可能一个服务就是需要提供给外部使用,并且还不能有使用语言的局限性。
比较标准的做法是对外的服务我们统一提供一个openAPI,这样的调用方需要按照标准提供相应的appID以及密钥来进行验签才能使用。这样固然是比较规范和安全,但复杂度也不亚于开发一个单独的系统了。
这里所讲到的没有那么复杂,就只是把一个不需要各种权限检验的dubbo服务对外提供为HTTP服务。
准备工作
以下是本文所涉及到的一些知识点:
- Spring相关知识。
- Java反射相关知识。
- SpringMVC相关知识。
其实思路很简单,就是利用
SpringMVC提供一个HTTP接口。
在该接口中通过入参进行反射找到具体的dubbo服务实现进行调用。
HttpProviderConf配置类
首先需要定义一个HttpProviderConf类用于保存声明需要对外提供服务的包名,毕竟我们反射时需要用到一个类的全限定名:
|
|
就只有一个usePackage成员变量,用于存放需要包名。
至于用List的原因是允许有多个。
请求响应入参、出参
HttpRequest入参
|
|
其中param是用于存放真正调用dubbo服务时的入参,传入json在调用的时候解析成具体的参数对象。
service存放dubbo服务声明的interface API的包名。
method则是真正调用的方法名称。
HttpResponse 响应
|
|
这里只是封装了常用的HTTP服务的响应数据。
暴露服务controller
最重要的则是controller里的实现代码了。
先贴代码:
|
|
先一步一步的看:
-
首先是定义了一个
DubboController,并使用了SpringMVC的注解对外暴露HTTP服务。 -
实现了
org.springframework.context.ApplicationContextAware类,
实现了setApplicationContext()方法用于初始化Spring上下文对象,在之后可以获取到容器里的相应对象。 -
核心的
invoke()方法。 - 调用时:
http://127.0.0.1:8080/SSM-SERVICE/dubboAPI/com.crossoverJie.api.UserInfoApi/getUserInfo。 - 具体如上文的调用实例。先将
com.crossoverJie.api.UserInfoApi、getUserInfo赋值到httpRequest入参中。 - 判断传入的包是否是对外提供的。如下配置:
1234567891011<!--dubbo服务暴露为http服务--><bean class="com.crossoverJie.dubbo.http.conf.HttpProviderConf"><property name="usePackage"><list><!--需要暴露服务的接口包名,可多个--><value>com.crossoverJie.api </value></list></property></bean><!--扫描暴露包--><context:component-scan base-package="com.crossoverJie.dubbo.http"/>
其中的com.crossoverJie.api就是自己需要暴露的包名,可以多个。
- 接着在缓存
map中取出反射获取到的接口类类型,如果获取不到则通过反射获取,并将值设置到缓存map中,这样不用每次都反射获取,可以节省系统开销(反射很耗系统资源)。 - 接着也是判断该接口中是否有传入的
getUserInfo方法。 - 取出该方法的参数列表,如果没有参数则直接调用。
- 如果有参数,判断个数。这里最多只运行一个参数。也就是说在真正的
dubbo调用的时候只能传递一个BO类型,具体的参数列表可以写到BO中。因为如果有多个在进行json解析的时候是无法赋值到两个参数对象中去的。 - 之后进行调用,将调用返回的数据进行返回即可。
总结
通常来说这样提供的HTTP接口再实际中用的不多,但是很方便调试。
比如写了一个dubbo的查询接口,在测试环境或者是预发布环境中就可以直接通过HTTP请求的方式进行简单的测试,或者就是查询数据。比在Java中写单测来测试或查询快的很多。
安装
|
|
|
|
|
|
|
|
使用
|
|
spring配置
|
|
插件地址:https://github.com/crossoverJie/SSM-DUBBO-HTTP
项目地址:https://github.com/crossoverJie/SSM.git
个人博客地址:http://crossoverjie.top。
GitHub地址:https://github.com/crossoverJie。
本文介绍如何将Dubbo服务转换为HTTP接口,方便进行跨语言调用和快速测试。通过SpringMVC实现HTTP接口,利用Java反射调用Dubbo服务。


2177

被折叠的 条评论
为什么被折叠?



