記一次dubbo服務的簡單使用


現在接觸的項目均由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,在切換安裝到安裝目錄下,

執行命令bin/zkServer.sh start,啟動zookeeper,接着
 
再次啟動tomcat,在瀏覽器輸入http://localhost:8088/dubbo-admin-2.5.4-SNAPSHOT/ ,則會打開dubbo-admin的后台界面,如下:
   
2.dubbo服務的暴露及調用

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&timestamp=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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM