现在接触的项目均由webservice的调用方式转为dubbo调用了,所想着自己走一下相关流程,亲身操作一下java服务使用dubbo框架进行调用。
先简单说说dubbo与webservice的区别,两者基于的通信协议不通,dubbo基于rpc:(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议;webservice分为基于soap和restful两种,soap协议利用 XML 技术定义一种可扩展的消息处理框架,它提供了一种可通过多种底层协议进行交换的消息结构,使用http协议传输xml文本的技术,restful设计风格而不是标准。关于dubbo的介绍网上有很多资料,大家有兴趣可以看看。
好了,说一下此次操作步骤。
前期准备工作:
1.在操作之前需要安装一下dubbo-admin和zookeeper。
安装zookeeper可参考博文:
http://blog.csdn.net/tlk20071/article/details/52028945
安装dubbo-admin可参考报文:
https://www.cnblogs.com/xhkj/p/7407092.html
文中提到的是下载dubbo-admin的源码编译成war包,也可以直接下载编译好的war解压,链接如下:
http://sqd4ownd.onlinedown.net/pack/dubboadmin254.zip
下载war之后需要拷贝一个tomcat,把下载的war包(或者下载源码吧编译的war包)放置tomcat下的webapps目录下。然后配置tomcat的端口,默认是8080,为避免与zookeeper冲突,所以需要做修改,在修改conf目录下server.xml文件,如下:
<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
启动tomcat ,切换到tomcat的bin目录下,执行命令 sh startup.sh,启动后,dubbo-admin-2.5.4-SNAPSHOT.war包会自动解压,在tomcat/webapps目录下生成一个dubbo-admin-2.5.4-SNAPSHOT文件夹,先把tomcat停掉;
先启动zookeeper,在切换安装到安装目录下,

2.1.dubbo服务的暴露
首先需要在项目中引用dubbo的依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.8.4</version> </dependency>
在Spring配置声明暴露服务
<dubbo:application name="demotest-provider" owner="programmer" organization="dubbox" logger="slf4j"/> <!--使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper--> <dubbo:registry address="zookeeper://localhost:2181"/> <!-- 用dubbo协议在20880端口暴露服务 --> <dubbo:protocol name="dubbo" port="20880" /> <!--使用 dubbo 协议实现定义好的 api.PermissionService 接口--> <dubbo:service interface="yacol.service.facade.LoginFacade" ref="loginFacade" protocol="dubbo" timeout="40000"/>
启动项目之后,在dubbo-admin 中就能查到服务:
2.2.dubbo调用:
在Spring配置声明引用服务
<dubbo:application name="demotest-consumer" owner="programmer" organization="dubbox"/> <!--向 zookeeper 订阅 provider 的地址,由 zookeeper 定时推送--> <dubbo:registry address="zookeeper://localhost:2181"/> <!--使用 dubbo 协议调用定义好的 api.PermissionService 接口--> <dubbo:reference id="loginFacade" interface="yacol.service.facade.LoginFacade"/>
如果调用方和提供方并不是一个项目的话,调用方还需要引用提供方项目的依赖,在调用时,能在后台看到:
我在调用的过程中遇到一个问题,在调用时报错:
com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method getLoginInfo in the service yacol.service.facade.LoginFacade. Tried 3 times of the providers [10.1.201.31:20880] (1/1) from the registry localhost:2181 on the consumer 10.1.201.31 using the dubbo version 2.8.4. Last error is: Invoke remote method timeout. method: getLoginInfo, provider: dubbo://10.1.201.31:20880/yacol.service.facade.LoginFacade?anyhost=true&application=demotest-consumer&check=false&dubbo=2.8.4&generic=false&interface=yacol.service.facade.LoginFacade&logger=slf4j&methods=getLoginInfo&organization=dubbox&owner=programmer&pid=28005&revision=1.0-SNAPSHOT&side=consumer&timeout=40000×tamp=1540540527876, cause: Waiting server-side response timeout by scan timer. start time: 2018-10-26 16:00:32.688, end time: 2018-10-26 16:01:12.694, client elapsed: 6 ms, server elapsed: 40000 ms, timeout: 40000 ms, request: Request [id=5, version=2.0.0, twoway=true, event=false, broken=false, data=RpcInvocation [methodName=getLoginInfo, parameterTypes=[class yacol.service.facade.request.LoginRequest], arguments=[yacol.service.facade.request.LoginRequest@5bb6822b], attachments={path=yacol.service.facade.LoginFacade, interface=yacol.service.facade.LoginFacade, version=0.0.0, timeout=40000}]], channel: /10.1.201.31:62759 -> /10.1.201.31:20880
乍一看是超时,然后不断的调大超时时间也没有用,百度之后原来是序列化的问题,但是这个错误中并没有明确的报错序列化出错的错误。将请求参数序列化之后,再次请求问题得到了解决,参数序列化即需要请求参数实现implements Serializable。