先一步一步的看:
- 首先是定义了一个
DubboController,并使用了SpringMVC的注解对外暴露HTTP服务。
- 实现了
org.springframework.context.ApplicationContextAware类,
实现了setApplicationContext()方法用于初始化Spring上下文对象,在之后可以获取到容器里的相应对象。
- 核心的
invoke()方法。
- 具体如上文的调用实例。先将
com.crossoverJie.api.UserInfoApi、getUserInfo赋值到httpRequest入参中。
- 判断传入的包是否是对外提供的。如下配置:
<!--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中写单测来测试或查询快的很多。
安装
git clone https://github.com/crossoverJie/SSM-DUBBO-HTTP.git
cd SSM-DUBBO-HTTP
mvn clean
mvn install
使用
<dependency> <groupId>com.crossoverJie</groupId> <artifactId>SSM-HTTP-PROVIDER</artifactId> <version>1.0.0</version> </dependency>
spring配置
<!--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"/>
个人博客地址:crossoverjie.top。
GitHub地址:github.com/crossoverJi…。