记一次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。

 

posted @ 2018-10-30 15:21  papa虫  阅读(244)  评论(0编辑  收藏  举报