如今接觸的項目均由webservice的調用方式轉爲dubbo調用了,所想着本身走一下相關流程,親身操做一下java服務使用dubbo框架進行調用。html
先簡單說說dubbo與webservice的區別,二者基於的通訊協議不通,dubbo基於rpc:(Remote Procedure Call Protocol)——遠程過程調用協議,它是一種經過網絡從遠程計算機程序上請求服務,而不須要了解底層網絡技術的協議;webservice分爲基於soap和restful兩種,soap協議利用 XML 技術定義一種可擴展的消息處理框架,它提供了一種可經過多種底層協議進行交換的消息結構,使用http協議傳輸xml文本的技術,restful設計風格而不是標準。關於dubbo的介紹網上有不少資料,你們有興趣能夠看看。java
好了,說一下這次操做步驟。web
前期準備工做:api
1.在操做以前須要安裝一下dubbo-admin和zookeeper。瀏覽器
安裝zookeeper可參考博文: tomcat
http://blog.csdn.net/tlk20071/article/details/52028945restful
安裝dubbo-admin可參考報文:網絡
http://www.javashuo.com/article/p-vwagvmur-s.htmlapp
文中提到的是下載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。