dubbo的扩展版本dubbox有支持restful,但是它对dubbo框架整体改动比较大,导致使用了dubbox需要把整个dubbo框架
进行升级替换,个人觉得这个不符合dubbo的微内核目的,于是就做了一个restful插件,主要是扩展了Protocol
接口来实现
restful相关内容。
只需要依赖本插件,那么代码层面就不需要任何改动,唯一需要变动的地方就是对dubbo配置进行变更
在服务提供端配置dubbo.protocol.name=restful
,那么就告诉dubbo框架需要通过restful协议来发布服务如果只存在这个配置,那么就会默认采用jetty以及端口为8080来启动一个java进程,并且此时的contextpath
为/
当然可以通过其他参数来指定启动方式以及调整端口和contextpath
dubbo.protocol.server=jetty/servlet
其中servlet
是将restful协议整合到你项目当前的servlet容器中
针对servlet容器,需要在你项目的web.xml中配置dubbo的DispatcherServlet
的servlet,这部分配置可以参考dubbo官方的webservice
配置
通过<dubbo:protocol name='restful' server='jetty/servlet' contextpath='xxxx'/>
来配置
如果熟悉dubbo的同学或者踩过坑的通讯,知道在webservice并且采用servlet发布服务,会有一个contextpath的bug,为了避免这个问题
需要你们在dubbo.properties里面添加dubbo.protocol.restful.contextpath配置来告知restful插件你当前的contextpath的值
访问:http://ip:port/contextpath/services
restful插件是按照:http://ip:port/contextpath/${path}[/${method}][/${version}][/${group}]
其中method
和version
以及group
可以不用在路径上体现,可以在请求报文
整个报文都是json格式,格式如下
{
method:"请求的方法",
version:"请求的版本",
group:"请求的服务分组",
arg1:"方法第一个参数值,如果是对象,那么就是json对象",
arg2:"方法第二个参数值",
.....
argn:"第n个参数值"
}
method
,version
和group
必须至少在上面报文或者请求路径上出现一次,如果两个地方都出现,那么路径上出现的信息是最终结果
如果默认没有对version
和group
配置,那么对应的值为all
其中path
可以是配置的<dubbo:service path='xxx'
path属性,也可以是接口类全名,可以是类名
比如接口com.dubboclub.RestfulService有方法helloWorld,该接口的某个服务实现没有配置版本和分组,配置的path属性为restfulService
可以通过http://ip:port/contextpath/com.dubboclub.RestfulService/helloWorld/all/all
或者http://ip:port/contextpath/restfulService/helloWorld/all/all
或者http://ip:port/contextpath/RestfulService/helloWorld/all/all
访问!