現在接觸的項目均由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。